mirror of
				https://github.com/Mastermindzh/tidal-hifi.git
				synced 2025-11-03 18:29:16 +01:00 
			
		
		
		
	Merge 1610e3cc05 into 40d80e0872
				
					
				
			This commit is contained in:
		@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.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 Hi-Fi 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).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 63 KiB  | 
							
								
								
									
										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, () => {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user