From 90d81d217863fa492d8a0b1ae904579e5e615ebe Mon Sep 17 00:00:00 2001 From: Rick van Lieshout Date: Sun, 20 Apr 2025 12:15:03 +0200 Subject: [PATCH] feat: replace hardcoded selector with setting implements #543 --- .vscode/launch.json | 16 +++ package.json | 2 +- .../StateController.ts} | 15 +-- src/constants/controller.ts | 4 + src/constants/settings.ts | 1 + src/features/api/swagger.json | 97 ++++++++++++++----- src/pages/settings/preload.ts | 6 +- src/pages/settings/settings.html | 10 ++ src/preload.ts | 27 +++--- src/scripts/settings.ts | 6 ++ 10 files changed, 140 insertions(+), 44 deletions(-) create mode 100644 .vscode/launch.json rename src/TidalControllers/{MediaSessionTidalController.ts => stateController/StateController.ts} (89%) create mode 100644 src/constants/controller.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..05f34cf --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Electron: Main", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/node_modules/electron/dist/electron", + "args": ["."], + "protocol": "inspector", + "env": { + "ELECTRON_DISABLE_SECURITY_WARNINGS": "false" + } + } + ] +} diff --git a/package.json b/package.json index fdb6b4a..3b53daf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidal-hifi", - "version": "5.18.2", + "version": "5.19.0", "description": "Tidal on Electron with widevine(hifi) support", "main": "ts-dist/main.js", "scripts": { diff --git a/src/TidalControllers/MediaSessionTidalController.ts b/src/TidalControllers/stateController/StateController.ts similarity index 89% rename from src/TidalControllers/MediaSessionTidalController.ts rename to src/TidalControllers/stateController/StateController.ts index b783351..2a693dc 100644 --- a/src/TidalControllers/MediaSessionTidalController.ts +++ b/src/TidalControllers/stateController/StateController.ts @@ -1,14 +1,17 @@ -import { MediaInfo } from "../models/mediaInfo"; -import { MediaStatus } from "../models/mediaStatus"; -import { RepeatState } from "../models/repeatState"; -import { DomTidalController } from "./DomController/DomTidalController"; -import { TidalController } from "./TidalController"; +import { Logger } from "../../features/logger"; +import { MediaInfo } from "../../models/mediaInfo"; +import { MediaStatus } from "../../models/mediaStatus"; +import { RepeatState } from "../../models/repeatState"; +import { DomTidalController } from "../DomController/DomTidalController"; +import { TidalController } from "../TidalController"; -export class MediaSessionTidalController implements TidalController { +export class StateController implements TidalController { public domMediaController: TidalController; constructor() { this.domMediaController = new DomTidalController(); + + Logger.log("Initialized domController as a backup controller"); } // eslint-disable-next-line @typescript-eslint/no-unused-vars onMediaInfoUpdate(callback: (state: Partial) => void): void { diff --git a/src/constants/controller.ts b/src/constants/controller.ts new file mode 100644 index 0000000..093f6df --- /dev/null +++ b/src/constants/controller.ts @@ -0,0 +1,4 @@ +export const tidalControllers = { + domController: "domController", + stateController: "stateController", +}; diff --git a/src/constants/settings.ts b/src/constants/settings.ts index 242dd4c..15adc32 100644 --- a/src/constants/settings.ts +++ b/src/constants/settings.ts @@ -13,6 +13,7 @@ export const settings = { advanced: { root: "advanced", tidalUrl: "advanced.tidalUrl", + controllerType: "advanced.controllerType", }, api: "api", apiSettings: { diff --git a/src/features/api/swagger.json b/src/features/api/swagger.json index 80cc598..afe07d1 100644 --- a/src/features/api/swagger.json +++ b/src/features/api/swagger.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "TIDAL Hi-Fi API", - "version": "5.18.2", + "version": "5.19.0", "description": "", "license": { "name": "MIT", @@ -21,7 +21,9 @@ "/current": { "get": { "summary": "Get current media info", - "tags": ["current"], + "tags": [ + "current" + ], "responses": { "200": { "description": "Current media info", @@ -39,7 +41,9 @@ "/current/image": { "get": { "summary": "Get current media image", - "tags": ["current"], + "tags": [ + "current" + ], "responses": { "200": { "description": "Current media image", @@ -61,7 +65,9 @@ "/player/play": { "post": { "summary": "Play the current media", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -79,7 +85,9 @@ "/player/favorite/toggle": { "post": { "summary": "Add the current media to your favorites, or remove it if its already added to your favorites", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -97,7 +105,9 @@ "/player/pause": { "post": { "summary": "Pause the current media", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -115,7 +125,9 @@ "/player/next": { "post": { "summary": "Play the next song", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -133,7 +145,9 @@ "/player/previous": { "post": { "summary": "Play the previous song", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -151,7 +165,9 @@ "/player/shuffle/toggle": { "post": { "summary": "Play the previous song", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -169,7 +185,9 @@ "/player/repeat/toggle": { "post": { "summary": "Toggle the repeat status, toggles between \"off\" , \"single\" and \"all\"", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -187,7 +205,9 @@ "/player/playpause": { "post": { "summary": "Start playing the media if paused, or pause the media if playing", - "tags": ["player"], + "tags": [ + "player" + ], "responses": { "200": { "description": "Ok", @@ -205,7 +225,9 @@ "/settings/skipped-artists": { "get": { "summary": "get a list of artists that TIDAL Hi-Fi will skip if skipping is enabled", - "tags": ["settings"], + "tags": [ + "settings" + ], "responses": { "200": { "description": "The list book.", @@ -221,7 +243,9 @@ }, "post": { "summary": "Add new artists to the list of skipped artists", - "tags": ["settings"], + "tags": [ + "settings" + ], "requestBody": { "required": true, "content": { @@ -242,7 +266,9 @@ "/settings/skipped-artists/delete": { "post": { "summary": "Remove artists from the list of skipped artists", - "tags": ["settings"], + "tags": [ + "settings" + ], "requestBody": { "required": true, "content": { @@ -263,7 +289,9 @@ "/settings/skipped-artists/current": { "post": { "summary": "Add the current artist to the list of skipped artists", - "tags": ["settings"], + "tags": [ + "settings" + ], "responses": { "200": { "description": "Ok" @@ -272,7 +300,9 @@ }, "delete": { "summary": "Remove the current artist from the list of skipped artists", - "tags": ["settings"], + "tags": [ + "settings" + ], "responses": { "200": { "description": "Ok" @@ -283,7 +313,9 @@ "/image": { "get": { "summary": "Get current image", - "tags": ["legacy"], + "tags": [ + "legacy" + ], "deprecated": true, "responses": { "200": { @@ -306,7 +338,9 @@ "/play": { "get": { "summary": "Play the current media", - "tags": ["legacy"], + "tags": [ + "legacy" + ], "deprecated": true, "responses": { "200": { @@ -325,7 +359,9 @@ "/favorite/toggle": { "get": { "summary": "Add the current media to your favorites, or remove it if its already added to your favorites", - "tags": ["legacy"], + "tags": [ + "legacy" + ], "deprecated": true, "responses": { "200": { @@ -344,7 +380,9 @@ "/pause": { "get": { "summary": "Pause the current media", - "tags": ["legacy"], + "tags": [ + "legacy" + ], "deprecated": true, "responses": { "200": { @@ -363,7 +401,9 @@ "/next": { "get": { "summary": "Play the next song", - "tags": ["legacy"], + "tags": [ + "legacy" + ], "deprecated": true, "responses": { "200": { @@ -382,7 +422,9 @@ "/previous": { "get": { "summary": "Play the previous song", - "tags": ["legacy"], + "tags": [ + "legacy" + ], "deprecated": true, "responses": { "200": { @@ -401,7 +443,9 @@ "/playpause": { "get": { "summary": "Toggle play/pause", - "tags": ["legacy"], + "tags": [ + "legacy" + ], "deprecated": true, "responses": { "200": { @@ -514,7 +558,10 @@ "items": { "type": "string" }, - "example": ["Artist1", "Artist2"] + "example": [ + "Artist1", + "Artist2" + ] } } }, @@ -532,4 +579,4 @@ "description": "The settings management API" } ] -} +} \ No newline at end of file diff --git a/src/pages/settings/preload.ts b/src/pages/settings/preload.ts index 34eff23..dca3cc7 100644 --- a/src/pages/settings/preload.ts +++ b/src/pages/settings/preload.ts @@ -61,7 +61,8 @@ let adBlock: HTMLInputElement, discord_show_song: HTMLInputElement, discord_show_idle: HTMLInputElement, discord_idle_text: HTMLInputElement, - discord_using_text: HTMLInputElement; + discord_using_text: HTMLInputElement, + controllerType: HTMLSelectElement; addCustomCss(app); @@ -157,6 +158,7 @@ function refreshSettings() { discord_show_idle.checked = settingsStore.get(settings.discord.showIdle); discord_idle_text.value = settingsStore.get(settings.discord.idleText); discord_using_text.value = settingsStore.get(settings.discord.usingText); + controllerType.value = settingsStore.get(settings.advanced.controllerType); // set state of all switches with additional settings Object.values(switchesWithSettings).forEach((settingSwitch) => { @@ -277,6 +279,7 @@ window.addEventListener("DOMContentLoaded", () => { discord_show_idle = get("discord_show_idle"); discord_using_text = get("discord_using_text"); discord_idle_text = get("discord_idle_text"); + controllerType = get("controllerType"); refreshSettings(); addInputListener(adBlock, settings.adBlock); @@ -322,4 +325,5 @@ window.addEventListener("DOMContentLoaded", () => { addInputListener(discord_show_idle, settings.discord.showIdle); addInputListener(discord_idle_text, settings.discord.idleText); addInputListener(discord_using_text, settings.discord.usingText); + addSelectListener(controllerType, settings.advanced.controllerType); }); diff --git a/src/pages/settings/settings.html b/src/pages/settings/settings.html index d24b16b..4c383e0 100644 --- a/src/pages/settings/settings.html +++ b/src/pages/settings/settings.html @@ -382,6 +382,16 @@ +
+
+

Controller Type

+

Select the type of controller to use.

+ +
+

Flags

diff --git a/src/preload.ts b/src/preload.ts index d374ccc..b8fc97b 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -22,8 +22,8 @@ import { settingsStore } from "./scripts/settings"; import { setTitle } from "./scripts/window-functions"; import { DomControllerOptions } from "./TidalControllers/DomController/DomControllerOptions"; import { DomTidalController } from "./TidalControllers/DomController/DomTidalController"; -import { MediaSessionTidalController } from "./TidalControllers/MediaSessionTidalController"; import { TidalController } from "./TidalControllers/TidalController"; +import { tidalControllers } from "./constants/controller"; const notificationPath = `${app.getPath("userData")}/notification.jpg`; const staticTitle = "TIDAL Hi-Fi"; @@ -39,16 +39,21 @@ let tidalController: TidalController; let controllerOptions = {}; let currentMediaInfo = getEmptyMediaInfo(); -// TODO: replace with setting -// eslint-disable-next-line no-constant-condition -if (true) { - tidalController = new DomTidalController(); - const domControllerOptions: DomControllerOptions = { - refreshInterval: getDomUpdateFrequency(), - }; - controllerOptions = domControllerOptions; -} else { - tidalController = new MediaSessionTidalController(); +switch (settingsStore.get(settings.advanced.controllerType)) { + case tidalControllers.stateController: { + Logger.log("stateController initialized"); + break; + } + + default: { + tidalController = new DomTidalController(); + const domControllerOptions: DomControllerOptions = { + refreshInterval: getDomUpdateFrequency(), + }; + controllerOptions = domControllerOptions; + Logger.log("domController initialized"); + break; + } } /** diff --git a/src/scripts/settings.ts b/src/scripts/settings.ts index 30ea16d..331c3a8 100644 --- a/src/scripts/settings.ts +++ b/src/scripts/settings.ts @@ -30,6 +30,7 @@ export const settingsStore = new Store({ adBlock: false, advanced: { tidalUrl: "https://listen.tidal.com", + controllerType: "domController", }, api: true, apiSettings: { @@ -120,6 +121,11 @@ export const settingsStore = new Store({ "5.16.0": (migrationStore) => { buildMigration("5.16.0", migrationStore, [{ key: settings.discord.showIdle, value: "true" }]); }, + "5.19.0": (migrationStore) => { + buildMigration("5.19.0", migrationStore, [ + { key: settings.advanced.controllerType, value: "domController" }, + ]); + }, }, });