mirror of
https://github.com/Mastermindzh/tidal-hifi.git
synced 2024-11-25 06:43:48 +01:00
Merge branch 'master' of github.com:Mastermindzh/tidal-hifi into feature/update
This commit is contained in:
commit
534547ce67
@ -13,7 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
## [5.6.0]
|
## [5.6.0]
|
||||||
|
|
||||||
- Added support for Wayland (on by default) fixes [#262](https://github.com/Mastermindzh/tidal-hifi/issues/262) and [#157](https://github.com/Mastermindzh/tidal-hifi/issues/157)
|
- Added support for Wayland (on by default) fixes [#262](https://github.com/Mastermindzh/tidal-hifi/issues/262) and [#157](https://github.com/Mastermindzh/tidal-hifi/issues/157)
|
||||||
- Made it clear in the readme that this TIDAL Hi-Fi client supports High & Max audio settings. fixes [#261](https://github.com/Mastermindzh/tidal-hifi/issues/261)
|
- Made it clear in the readme that this tidal-hifi client supports High & Max audio settings. fixes [#261](https://github.com/Mastermindzh/tidal-hifi/issues/261)
|
||||||
|
- Added app suspension inhibitors when music is playing. fixes [#257](https://github.com/Mastermindzh/tidal-hifi/issues/257)
|
||||||
- Fixed bug with theme files from user directory trying to load: "an error occurred reading the theme file"
|
- Fixed bug with theme files from user directory trying to load: "an error occurred reading the theme file"
|
||||||
- Fixed: config flags not being set correctly
|
- Fixed: config flags not being set correctly
|
||||||
- [DEV]:
|
- [DEV]:
|
||||||
|
11
SECURITY.md
Normal file
11
SECURITY.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Only the very latest 😄.
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
If you find a vulnerability just add it as an issue.
|
||||||
|
If there's an especially bad vulnerability that you don't want to make public just send me a private message (email, discord, wherever).
|
||||||
|
|
@ -72,4 +72,4 @@
|
|||||||
"typescript": "^5.1.6"
|
"typescript": "^5.1.6"
|
||||||
},
|
},
|
||||||
"prettier": "@mastermindzh/prettier-config"
|
"prettier": "@mastermindzh/prettier-config"
|
||||||
}
|
}
|
||||||
|
65
src/features/idleInhibitor/idleInhibitor.ts
Normal file
65
src/features/idleInhibitor/idleInhibitor.ts
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
import { PowerSaveBlocker, powerSaveBlocker } from "electron";
|
||||||
|
import { Logger } from "../logger";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start blocking idle/screen timeouts
|
||||||
|
* @param blocker optional instance of the powerSaveBlocker to use
|
||||||
|
* @returns id of current block
|
||||||
|
*/
|
||||||
|
export const acquireInhibitor = (blocker?: PowerSaveBlocker): number => {
|
||||||
|
const currentBlocker = blocker ?? powerSaveBlocker;
|
||||||
|
const blockId = currentBlocker.start("prevent-app-suspension");
|
||||||
|
Logger.log(`Started preventing app suspension with id: ${blockId}`);
|
||||||
|
return blockId;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether there is a blocker active for the current id, if not start it.
|
||||||
|
* @param id id of inhibitor you want to check activity against
|
||||||
|
* @param blocker optional instance of the powerSaveBlocker to use
|
||||||
|
*/
|
||||||
|
export const acquireInhibitorIfInactive = (id: number, blocker?: PowerSaveBlocker): number => {
|
||||||
|
const currentBlocker = blocker ?? powerSaveBlocker;
|
||||||
|
if (!isInhibitorActive(id, currentBlocker)) {
|
||||||
|
return acquireInhibitor();
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stop blocking idle/screen timeouts
|
||||||
|
* @param id id of inhibitor you want to check activity against
|
||||||
|
* @param blocker optional instance of the powerSaveBlocker to use
|
||||||
|
*/
|
||||||
|
export const releaseInhibitor = (id: number, blocker?: PowerSaveBlocker) => {
|
||||||
|
try {
|
||||||
|
const currentBlocker = blocker ?? powerSaveBlocker;
|
||||||
|
currentBlocker.stop(id);
|
||||||
|
Logger.log(`Released inhibitor with id: ${id}`);
|
||||||
|
} catch (error) {
|
||||||
|
Logger.log("Releasing inhibitor failed");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stop blocking idle/screen timeouts if a inhibitor is active
|
||||||
|
* @param id id of inhibitor you want to check activity against
|
||||||
|
* @param blocker optional instance of the powerSaveBlocker to use
|
||||||
|
*/
|
||||||
|
export const releaseInhibitorIfActive = (id: number, blocker?: PowerSaveBlocker) => {
|
||||||
|
const currentBlocker = blocker ?? powerSaveBlocker;
|
||||||
|
if (isInhibitorActive(id, currentBlocker)) {
|
||||||
|
releaseInhibitor(id, currentBlocker);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check whether the inhibitor is active
|
||||||
|
* @param id id of inhibitor you want to check activity against
|
||||||
|
* @param blocker optional instance of the powerSaveBlocker to use
|
||||||
|
*/
|
||||||
|
export const isInhibitorActive = (id: number, blocker?: PowerSaveBlocker) => {
|
||||||
|
const currentBlocker = blocker ?? powerSaveBlocker;
|
||||||
|
return currentBlocker.isStarted(id);
|
||||||
|
};
|
@ -1,4 +1,4 @@
|
|||||||
import { IpcMain, ipcRenderer, ipcMain } from "electron";
|
import { IpcMain, ipcMain, IpcMainEvent, ipcRenderer } from "electron";
|
||||||
import { globalEvents } from "../constants/globalEvents";
|
import { globalEvents } from "../constants/globalEvents";
|
||||||
|
|
||||||
export class Logger {
|
export class Logger {
|
||||||
@ -7,10 +7,13 @@ export class Logger {
|
|||||||
* @param ipcMain main thread IPC client so we can subscribe to events
|
* @param ipcMain main thread IPC client so we can subscribe to events
|
||||||
*/
|
*/
|
||||||
public static watch(ipcMain: IpcMain) {
|
public static watch(ipcMain: IpcMain) {
|
||||||
ipcMain.on(globalEvents.log, (event, message) => {
|
ipcMain.on(
|
||||||
const { content, object } = message;
|
globalEvents.log,
|
||||||
this.logToSTDOut(content, object);
|
(event: IpcMainEvent | { content: string; message: string }, message) => {
|
||||||
});
|
const { content, object } = message ?? event;
|
||||||
|
this.logToSTDOut(content, object);
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Log content to STDOut
|
* Log content to STDOut
|
||||||
@ -23,7 +26,6 @@ export class Logger {
|
|||||||
} else {
|
} else {
|
||||||
ipcMain.emit(globalEvents.log, { content, object });
|
ipcMain.emit(globalEvents.log, { content, object });
|
||||||
}
|
}
|
||||||
this.logToSTDOut(content, object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
15
src/main.ts
15
src/main.ts
@ -1,7 +1,7 @@
|
|||||||
import { enable, initialize } from "@electron/remote/main";
|
import { enable, initialize } from "@electron/remote/main";
|
||||||
import {
|
import {
|
||||||
BrowserWindow,
|
|
||||||
app,
|
app,
|
||||||
|
BrowserWindow,
|
||||||
components,
|
components,
|
||||||
globalShortcut,
|
globalShortcut,
|
||||||
ipcMain,
|
ipcMain,
|
||||||
@ -13,9 +13,14 @@ import { globalEvents } from "./constants/globalEvents";
|
|||||||
import { mediaKeys } from "./constants/mediaKeys";
|
import { mediaKeys } from "./constants/mediaKeys";
|
||||||
import { settings } from "./constants/settings";
|
import { settings } from "./constants/settings";
|
||||||
import { setDefaultFlags, setManagedFlagsFromSettings } from "./features/flags/flags";
|
import { setDefaultFlags, setManagedFlagsFromSettings } from "./features/flags/flags";
|
||||||
|
import {
|
||||||
|
acquireInhibitorIfInactive,
|
||||||
|
releaseInhibitorIfActive,
|
||||||
|
} from "./features/idleInhibitor/idleInhibitor";
|
||||||
import { Logger } from "./features/logger";
|
import { Logger } from "./features/logger";
|
||||||
import { Songwhip } from "./features/songwhip/songwhip";
|
import { Songwhip } from "./features/songwhip/songwhip";
|
||||||
import { MediaInfo } from "./models/mediaInfo";
|
import { MediaInfo } from "./models/mediaInfo";
|
||||||
|
import { MediaStatus } from "./models/mediaStatus";
|
||||||
import { initRPC, rpc, unRPC } from "./scripts/discord";
|
import { initRPC, rpc, unRPC } from "./scripts/discord";
|
||||||
import { startExpress } from "./scripts/express";
|
import { startExpress } from "./scripts/express";
|
||||||
import { updateMediaInfo } from "./scripts/mediaInfo";
|
import { updateMediaInfo } from "./scripts/mediaInfo";
|
||||||
@ -29,6 +34,7 @@ import {
|
|||||||
} from "./scripts/settings";
|
} from "./scripts/settings";
|
||||||
import { addTray, refreshTray } from "./scripts/tray";
|
import { addTray, refreshTray } from "./scripts/tray";
|
||||||
const tidalUrl = "https://listen.tidal.com";
|
const tidalUrl = "https://listen.tidal.com";
|
||||||
|
let mainInhibitorId = -1;
|
||||||
|
|
||||||
initialize();
|
initialize();
|
||||||
let mainWindow: BrowserWindow;
|
let mainWindow: BrowserWindow;
|
||||||
@ -110,6 +116,7 @@ function createWindow(options = { x: 0, y: 0, backgroundColor: "white" }) {
|
|||||||
});
|
});
|
||||||
// Emitted when the window is closed.
|
// Emitted when the window is closed.
|
||||||
mainWindow.on("closed", function () {
|
mainWindow.on("closed", function () {
|
||||||
|
releaseInhibitorIfActive(mainInhibitorId);
|
||||||
closeSettingsWindow();
|
closeSettingsWindow();
|
||||||
app.quit();
|
app.quit();
|
||||||
});
|
});
|
||||||
@ -194,6 +201,12 @@ app.on("browser-window-created", (_, window) => {
|
|||||||
// IPC
|
// IPC
|
||||||
ipcMain.on(globalEvents.updateInfo, (_event, arg: MediaInfo) => {
|
ipcMain.on(globalEvents.updateInfo, (_event, arg: MediaInfo) => {
|
||||||
updateMediaInfo(arg);
|
updateMediaInfo(arg);
|
||||||
|
if (arg.status === MediaStatus.playing) {
|
||||||
|
mainInhibitorId = acquireInhibitorIfInactive(mainInhibitorId);
|
||||||
|
} else {
|
||||||
|
releaseInhibitorIfActive(mainInhibitorId);
|
||||||
|
mainInhibitorId = -1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.on(globalEvents.hideSettings, () => {
|
ipcMain.on(globalEvents.hideSettings, () => {
|
||||||
|
Loading…
Reference in New Issue
Block a user