mirror of
				https://github.com/Mastermindzh/tidal-hifi.git
				synced 2025-10-31 08:49:35 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			c1850436e1
			...
			develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d67f62c0dc | |||
| b2afd44dd6 | 
| @@ -4,12 +4,12 @@ name: default | ||||
|  | ||||
| steps: | ||||
|   - name: install | ||||
|     image: node:22.17.0 | ||||
|     image: node:19.4.0 | ||||
|     commands: | ||||
|       - npm install | ||||
|  | ||||
|   - name: build_with_linux | ||||
|     image: node:22.17.0 | ||||
|     image: node:19.4.0 | ||||
|     commands: | ||||
|       - apt-get update && apt-get upgrade -y | ||||
|       - apt-get install -y libarchive-tools rpm | ||||
|   | ||||
							
								
								
									
										42
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -21,30 +21,26 @@ jobs: | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 22.12.0 | ||||
|           node-version: 22.4 | ||||
|       - run: npm install | ||||
|       - run: npm run build | ||||
|       # - uses: actions/upload-artifact@master | ||||
|       #   with: | ||||
|       #     name: linux-builds | ||||
|       #     path: dist/ | ||||
|  | ||||
|   # build_on_mac: | ||||
|   #   runs-on: macos-latest | ||||
|   #   steps: | ||||
|   #     - uses: actions/checkout@master | ||||
|   #     - uses: actions/setup-node@master | ||||
|   #       with: | ||||
|   #         node-version: 22.4 | ||||
|   #     - run: npm install | ||||
|   #     - run: npm run build | ||||
|   build_on_mac: | ||||
|     runs-on: macos-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 22.4 | ||||
|       - run: npm install | ||||
|       - run: npm run build | ||||
|  | ||||
|   # build_on_win: | ||||
|   #   runs-on: windows-latest | ||||
|   #   steps: | ||||
|   #     - uses: actions/checkout@master | ||||
|   #     - uses: actions/setup-node@master | ||||
|   #       with: | ||||
|   #         node-version: 22.4 | ||||
|   #     - run: npm install | ||||
|   #     - run: npm run build | ||||
|   build_on_win: | ||||
|     runs-on: windows-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 22.4 | ||||
|       - run: npm install | ||||
|       - run: npm run build | ||||
|   | ||||
							
								
								
									
										54
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -21,7 +21,7 @@ jobs: | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 22.12.0 | ||||
|           node-version: 22.4 | ||||
|       - run: npm install | ||||
|       - run: npm run build | ||||
|       - uses: actions/upload-artifact@master | ||||
| @@ -29,30 +29,30 @@ jobs: | ||||
|           name: linux-builds | ||||
|           path: dist/ | ||||
|  | ||||
|   # build_on_mac: | ||||
|   #   runs-on: macos-latest | ||||
|   #   steps: | ||||
|   #     - uses: actions/checkout@master | ||||
|   #     - uses: actions/setup-node@master | ||||
|   #       with: | ||||
|   #         node-version: 22.4 | ||||
|   #     - run: npm install | ||||
|   #     - run: npm run build | ||||
|   #     - uses: actions/upload-artifact@master | ||||
|   #       with: | ||||
|   #         name: mac-builds | ||||
|   #         path: ./dist/ | ||||
|   build_on_mac: | ||||
|     runs-on: macos-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 22.4 | ||||
|       - run: npm install | ||||
|       - run: npm run build | ||||
|       - uses: actions/upload-artifact@master | ||||
|         with: | ||||
|           name: mac-builds | ||||
|           path: ./dist/ | ||||
|  | ||||
|   # build_on_win: | ||||
|   #   runs-on: windows-latest | ||||
|   #   steps: | ||||
|   #     - uses: actions/checkout@master | ||||
|   #     - uses: actions/setup-node@master | ||||
|   #       with: | ||||
|   #         node-version: 22.4 | ||||
|   #     - run: npm install | ||||
|   #     - run: npm run build | ||||
|   #     - uses: actions/upload-artifact@master | ||||
|   #       with: | ||||
|   #         name: windows-builds | ||||
|   #         path: dist/ | ||||
|   build_on_win: | ||||
|     runs-on: windows-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 22.4 | ||||
|       - run: npm install | ||||
|       - run: npm run build | ||||
|       - uses: actions/upload-artifact@master | ||||
|         with: | ||||
|           name: windows-builds | ||||
|           path: dist/ | ||||
|   | ||||
| @@ -1,13 +1,7 @@ | ||||
| { | ||||
|   "plugins": [ | ||||
|     "stylelint-prettier" | ||||
|   ], | ||||
|   "extends": [ | ||||
|     "stylelint-config-standard-scss" | ||||
|   ], | ||||
|   "ignoreFiles": [ | ||||
|     "src/themes/**.scss" | ||||
|   ], | ||||
|   "plugins": ["stylelint-prettier"], | ||||
|   "extends": ["stylelint-config-standard-scss"], | ||||
|   "ignoreFiles": ["src/themes/**.scss"], | ||||
|   "rules": { | ||||
|     "prettier/prettier": true, | ||||
|     "scss/at-extend-no-missing-placeholder": null, | ||||
|   | ||||
							
								
								
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @@ -17,9 +17,7 @@ | ||||
|     "trackid", | ||||
|     "tracklist", | ||||
|     "widevine", | ||||
|     "wvcus", | ||||
|     "xesam", | ||||
|     "xhayper" | ||||
|     "xesam" | ||||
|   ], | ||||
|   "sonarlint.connectedMode.project": { | ||||
|     "connectionId": "public-sonarcloud", | ||||
|   | ||||
							
								
								
									
										43
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -4,42 +4,6 @@ All notable changes to this project will be documented in this file. | ||||
| The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), | ||||
| and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | ||||
|  | ||||
| ## [5.20.1] | ||||
|  | ||||
| - Updated electron to 37.2.5 | ||||
|  | ||||
| ## [5.20.0] | ||||
|  | ||||
| - Removes the `--enable-features=UseOzonePlatform` flag, as the Ozone platform has been the default on Linux since Electron 28 and this flag is no longer necessary. | ||||
| - Adds the `--enable-wayland-ime` flag to enable Input Method Editor (IME) support in Wayland environments, improving the input experience for CJK and other users. | ||||
| - Updated various dependencies | ||||
| - Updated Electron to 37, potentially fixing [#580](https://github.com/Mastermindzh/tidal-hifi/issues/580) | ||||
|  | ||||
| ## [5.19.0] | ||||
|  | ||||
| - Fixed the issue where media updates would cease to work after album names can't be found | ||||
|   - Will simply report an empty string when it can't find the album | ||||
| - Updated various dependencies | ||||
|  | ||||
| ## [5.18.2] | ||||
|  | ||||
| - Reverted to sass 1.79.4 to fix `Nix` builds | ||||
| - Changed electron-builder.base.yml to now generate the correct .desktop entries again | ||||
|   - Should fix flatpak build | ||||
|  | ||||
| ## [5.18.1] | ||||
|  | ||||
| - Fixed the login bug | ||||
| - Upgraded electron to 35.1.1 | ||||
| - Added Widevine/CDM info to startup | ||||
| - delayed remote electron initializer | ||||
|  | ||||
| ## [5.18.0] | ||||
|  | ||||
| - [Dianoga](https://github.com/Dianoga) fixed the duration selector, restoring mpris & partial API data. | ||||
|   - PR: #554 | ||||
| - Added `xesam:url` property to mpris metadata fixes [#506](https://github.com/Mastermindzh/tidal-hifi/issues/506) | ||||
|  | ||||
| ## [5.17.0] | ||||
|  | ||||
| - Added an option to disable the dynamic title and set it to a static one, [#491](https://github.com/Mastermindzh/tidal-hifi/pull/491) | ||||
| @@ -57,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | ||||
|  | ||||
| - Added all missing swagger/openApi info with the help of [Times-Z](https://github.com/Times-Z) | ||||
| - Updated most dependency versions | ||||
|  | ||||
|   - This includes Electron 31! | ||||
|  | ||||
| - Added a channel selector so we can now use Tidal's staging environment directly from the app | ||||
| @@ -148,10 +113,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | ||||
|  | ||||
| - Updated Electron to 28.1.1 (fixes [325](https://github.com/Mastermindzh/tidal-hifi/issues/325)) | ||||
| - Updated dependencies to latest | ||||
|  | ||||
|   - added theme files to stylelint ignore | ||||
|   - fixed other stylelint errors | ||||
|  | ||||
| - Added functionality to favorite a song (fixes [#323](https://github.com/Mastermindzh/tidal-hifi/issues/323)) | ||||
|  | ||||
|   - Added a hotkey to favorite ("Add to collection") songs: Control+a | ||||
|   - Added the "favorite" field in the `mediaInfo` and the API `/current` endpoint | ||||
|   - Added an endpoint to toggle favoriting a song: `http://localhost:47836/favorite/toggle` | ||||
| @@ -172,10 +139,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | ||||
| - Added settings to customize the Discord rich presence information | ||||
|   - Discord settings are now also collapsible like the ListenBrainz ones are | ||||
| - Restyled settings menu to include version number and useful links on the about page | ||||
|      | ||||
|    | ||||
| - The ListenBrainz integration has been extended with a configurable (5 seconds by default) delay in song reporting so that it doesn't spam the API when you are cycling through songs. | ||||
| - Custom CSS now also applies to settings window | ||||
|      | ||||
|    | ||||
|  | ||||
| ## [5.6.0] | ||||
|  | ||||
|   | ||||
| @@ -8,4 +8,3 @@ Only the very latest 😄. | ||||
|  | ||||
| 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). | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| appId: com.rickvanlieshout.tidal-hifi | ||||
| electronVersion: 37.2.5 | ||||
| electronVersion: 28.1.1 | ||||
| electronDownload: | ||||
|   version: 37.2.5+wvcus | ||||
|   version: 28.1.1+wvcus | ||||
|   mirror: https://github.com/castlabs/electron-releases/releases/download/v | ||||
| snap: | ||||
|   plugs: | ||||
| @@ -17,25 +17,24 @@ linux: | ||||
|   executableName: tidal-hifi | ||||
|   executableArgs: | ||||
|     [ | ||||
|       "--enable-features=UseOzonePlatform", | ||||
|       "--ozone-platform-hint=auto", | ||||
|       "--enable-features=WaylandWindowDecorations", | ||||
|       "--enable-wayland-ime", | ||||
|       "--use-angle", | ||||
|     ] | ||||
|   desktop: | ||||
|     entry: | ||||
|       Encoding: "UTF-8" | ||||
|       Name: "TIDAL Hi-Fi" | ||||
|       GenericName: "TIDAL Hi-Fi" | ||||
|       Comment: "The web version of listen.tidal.com running in electron with hifi support thanks to widevine." | ||||
|       Icon: "tidal-hifi" | ||||
|       StartupNotify: "true" | ||||
|       Terminal: "false" | ||||
|       Type: "Application" | ||||
|       Categories: "Network;Application;AudioVideo;Audio;Video" | ||||
|       StartupWMClass: "tidal-hifi" | ||||
|       X-PulseAudio-Properties: "media.role=music" | ||||
|       MimeType: "x-scheme-handler/tidal;" | ||||
|     Encoding: UTF-8 | ||||
|     Name: TIDAL Hi-Fi | ||||
|     GenericName: TIDAL Hi-Fi | ||||
|     Comment: The web version of listen.tidal.com running in electron with hifi support thanks to widevine. | ||||
|     Icon: tidal-hifi | ||||
|     StartupNotify: true | ||||
|     Terminal: false | ||||
|     Type: Application | ||||
|     Categories: Network;Application;AudioVideo;Audio;Video | ||||
|     StartupWMClass: tidal-hifi | ||||
|     X-PulseAudio-Properties: media.role=music | ||||
|     MimeType: x-scheme-handler/tidal; | ||||
|  | ||||
| mac: | ||||
|   category: public.app-category.entertainment | ||||
| win: | ||||
|   | ||||
							
								
								
									
										5443
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5443
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										52
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,10 +1,10 @@ | ||||
| { | ||||
|   "name": "tidal-hifi", | ||||
|   "version": "5.20.1", | ||||
|   "version": "5.17.0", | ||||
|   "description": "Tidal on Electron with widevine(hifi) support", | ||||
|   "main": "ts-dist/main.js", | ||||
|   "scripts": { | ||||
|     "start": "electron --inspect=0.0.0.0:5858 --remote-debugging-port=8315 --remote-allow-origins=* .", | ||||
|     "start": "electron --inspect=0.0.0.0:5858 .", | ||||
|     "watchStart": "nodemon dist -x \"npm run start\"", | ||||
|     "compile": "tsc && npm run sass-and-copy", | ||||
|     "deps": "npm run watch", | ||||
| @@ -23,6 +23,7 @@ | ||||
|     "build-mac": "npm run builder -- -c ./build/electron-builder.yml -m", | ||||
|     "build-base": "npm run builder -- -c ./build/electron-builder.base.yml", | ||||
|     "prebuilder": "npm run compile", | ||||
|     "prettier": "prettier . --write", | ||||
|     "builder": "electron-builder --publish=never", | ||||
|     "sass": "sass ./src/pages/settings/settings.scss ./src/pages/settings/settings.css && sass --no-source-map src/themes:themes", | ||||
|     "style-lint": "npx stylelint **/*.scss", | ||||
| @@ -40,45 +41,44 @@ | ||||
|   "homepage": "https://github.com/Mastermindzh/tidal-hifi", | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@electron/remote": "^2.1.3", | ||||
|     "@electron/remote": "^2.1.2", | ||||
|     "@types/swagger-jsdoc": "^6.0.4", | ||||
|     "@xhayper/discord-rpc": "1.3.0", | ||||
|     "axios": "^1.10.0", | ||||
|     "@xhayper/discord-rpc": "^1.2.0", | ||||
|     "axios": "^1.7.7", | ||||
|     "cors": "^2.8.5", | ||||
|     "electron-store": "^8.2.0", | ||||
|     "express": "^5.1.0", | ||||
|     "hotkeys-js": "^3.13.15", | ||||
|     "express": "^4.21.1", | ||||
|     "hotkeys-js": "^3.13.7", | ||||
|     "mpris-service": "^2.1.2", | ||||
|     "request": "^2.88.2", | ||||
|     "sass": "1.92.1", | ||||
|     "sass": "^1.79.4", | ||||
|     "swagger-ui-express": "^5.0.1" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@mastermindzh/prettier-config": "^1.0.0", | ||||
|     "@types/cors": "^2.8.19", | ||||
|     "@types/express": "^5.0.3", | ||||
|     "@types/node": "^22.16.2", | ||||
|     "@types/cors": "^2.8.17", | ||||
|     "@types/express": "^4.17.21", | ||||
|     "@types/node": "^20.14.10", | ||||
|     "@types/request": "^2.48.12", | ||||
|     "@types/swagger-ui-express": "^4.1.8", | ||||
|     "@typescript-eslint/eslint-plugin": "^8.36.0", | ||||
|     "@typescript-eslint/parser": "^8.36.0", | ||||
|     "@types/swagger-ui-express": "^4.1.6", | ||||
|     "@typescript-eslint/eslint-plugin": "^7.16.0", | ||||
|     "@typescript-eslint/parser": "^7.15.0", | ||||
|     "copyfiles": "^2.4.1", | ||||
|     "electron": "github:castlabs/electron-releases#v37.2.5+wvcus", | ||||
|     "electron-builder": "~26.0.12", | ||||
|     "eslint": "^9.30.1", | ||||
|     "electron": "git+https://github.com/castlabs/electron-releases#v31.1.0+wvcus", | ||||
|     "electron-builder": "~24.9.4", | ||||
|     "eslint": "^8.57.0", | ||||
|     "js-yaml": "^4.1.0", | ||||
|     "markdown-toc": "^1.2.0", | ||||
|     "node-abi": "^4.12.0", | ||||
|     "nodemon": "^3.1.10", | ||||
|     "prettier": "^3.6.2", | ||||
|     "stylelint": "^16.21.1", | ||||
|     "stylelint-config-standard": "^39.0.0", | ||||
|     "stylelint-config-standard-scss": "^15.0.1", | ||||
|     "stylelint-prettier": "^5.0.3", | ||||
|     "nodemon": "^3.1.4", | ||||
|     "prettier": "^3.3.2", | ||||
|     "stylelint": "^16.6.1", | ||||
|     "stylelint-config-standard": "^36.0.1", | ||||
|     "stylelint-config-standard-scss": "^13.1.0", | ||||
|     "stylelint-prettier": "^5.0.0", | ||||
|     "swagger-jsdoc": "^6.2.8", | ||||
|     "ts-node": "^10.9.2", | ||||
|     "tsc-watch": "^7.1.1", | ||||
|     "typescript": "^5.8.3" | ||||
|     "tsc-watch": "^6.2.0", | ||||
|     "typescript": "^5.5.3" | ||||
|   }, | ||||
|   "prettier": "@mastermindzh/prettier-config" | ||||
| } | ||||
|   | ||||
| @@ -1,4 +0,0 @@ | ||||
| { | ||||
|   "$schema": "https://docs.renovatebot.com/renovate-schema.json", | ||||
|   "ignoreDeps": ["@types/node", "electron-store", "@xhayper/discord-rpc"] | ||||
| } | ||||
| @@ -22,13 +22,12 @@ | ||||
|     media: '*[data-test="current-media-imagery"]', | ||||
|     image: "img", | ||||
|     current: '*[data-test="current-time"]', | ||||
|     duration: '*[class^=_playbackControlsContainer] *[data-test="duration"]', | ||||
|     duration: '*[class^=playbackControlsContainer] *[data-test="duration"]', | ||||
|     bar: '*[data-test="progress-bar"]', | ||||
|     footer: "#footerPlayer", | ||||
|     mediaItem: "[data-type='mediaItem']", | ||||
|     album_header_title: '*[class^="_playingFrom"] span:nth-child(2)', | ||||
|     playing_from: '*[class^="_playingFrom"] span:nth-child(2)', | ||||
|     queue_album: "*[class^=playQueueItemsContainer] *[class^=groupTitle] span:nth-child(2)", | ||||
|     album_header_title: '*[class^="playingFrom"] span:nth-child(2)', | ||||
|     playingFrom: '*[class^="playingFrom"] span:nth-child(2)', | ||||
|     currentlyPlaying: "[class^='isPlayingIcon'], [data-test-is-playing='true']", | ||||
|     album_name_cell: '[class^="album"]', | ||||
|     tracklist_row: '[data-test="tracklist-row"]', | ||||
|   | ||||
| @@ -88,9 +88,8 @@ export const addCurrentInfo = (expressApp: Router) => { | ||||
|    *             schema: | ||||
|    *               $ref: '#/components/schemas/MediaInfo' | ||||
|    */ | ||||
|   expressApp.get("/current", (_req, res) => { | ||||
|     res.json({ ...mediaInfo, artist: mediaInfo.artists }); | ||||
|   }); | ||||
|   expressApp.get("/current", (req, res) => res.json({ ...mediaInfo, artist: mediaInfo.artists })); | ||||
|  | ||||
|   /** | ||||
|    * @swagger | ||||
|    * /current/image: | ||||
|   | ||||
| @@ -21,12 +21,8 @@ export const startApi = (mainWindow: BrowserWindow) => { | ||||
|   expressApp.use(cors()); | ||||
|   expressApp.use(express.json()); | ||||
|   expressApp.use("/docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec)); | ||||
|   expressApp.get("/", (req, res) => { | ||||
|     res.send("Hello World!"); | ||||
|   }); | ||||
|   expressApp.get("/swagger.json", (req, res) => { | ||||
|     res.json(swaggerSpec); | ||||
|   }); | ||||
|   expressApp.get("/", (req, res) => res.send("Hello World!")); | ||||
|   expressApp.get("/swagger.json", (req, res) => res.json(swaggerSpec)); | ||||
|  | ||||
|   // add features | ||||
|   addLegacyApi(expressApp, mainWindow); | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
|   "openapi": "3.1.0", | ||||
|   "info": { | ||||
|     "title": "TIDAL Hi-Fi API", | ||||
|     "version": "5.20.1", | ||||
|     "version": "5.17.0", | ||||
|     "description": "", | ||||
|     "license": { | ||||
|       "name": "MIT", | ||||
|   | ||||
| @@ -26,6 +26,7 @@ import { | ||||
| import { addTray, refreshTray } from "./scripts/tray"; | ||||
| let mainInhibitorId = -1; | ||||
|  | ||||
| initialize(); | ||||
| let mainWindow: BrowserWindow; | ||||
| const icon = path.join(__dirname, "../assets/icon.png"); | ||||
| const PROTOCOL_PREFIX = "tidal"; | ||||
| @@ -97,7 +98,6 @@ function createWindow(options = { x: 0, y: 0, backgroundColor: "white" }) { | ||||
|       }, | ||||
|     }, | ||||
|   }); | ||||
|  | ||||
|   enable(mainWindow.webContents); | ||||
|   registerHttpProtocols(); | ||||
|   syncMenuBarWithStore(); | ||||
| @@ -126,7 +126,6 @@ function createWindow(options = { x: 0, y: 0, backgroundColor: "white" }) { | ||||
|     } | ||||
|     return false; | ||||
|   }); | ||||
|  | ||||
|   // Emitted when the window is closed. | ||||
|   mainWindow.on("closed", function () { | ||||
|     releaseInhibitorIfActive(mainInhibitorId); | ||||
| @@ -179,7 +178,6 @@ app.on("ready", async () => { | ||||
|  | ||||
|   if (isMainInstance() || isMultipleInstancesAllowed()) { | ||||
|     await components.whenReady(); | ||||
|     initialize(); | ||||
|  | ||||
|     // Adblock | ||||
|     if (settingsStore.get(settings.adBlock)) { | ||||
| @@ -190,8 +188,6 @@ app.on("ready", async () => { | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     Logger.log("components ready:", components.status()); | ||||
|  | ||||
|     createWindow(); | ||||
|     addMenu(mainWindow); | ||||
|     createSettingsWindow(); | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -54,12 +54,12 @@ const elements = { | ||||
|   media: '*[data-test="current-media-imagery"]', | ||||
|   image: "img", | ||||
|   current: '*[data-test="current-time"]', | ||||
|   duration: '*[class^=_playbackControlsContainer] *[data-test="duration"]', | ||||
|   duration: '*[class^=playbackControlsContainer] *[data-test="duration"]', | ||||
|   bar: '*[data-test="progress-bar"]', | ||||
|   footer: "#footerPlayer", | ||||
|   mediaItem: "[data-type='mediaItem']", | ||||
|   album_header_title: '*[class^="_playingFrom"] span:nth-child(2)', | ||||
|   playing_from: '*[class^="_playingFrom"] span:nth-child(2)', | ||||
|   album_header_title: '*[class^="playingFrom"] span:nth-child(2)', | ||||
|   playing_from: '*[class^="playingFrom"] span:nth-child(2)', | ||||
|   queue_album: "*[class^=playQueueItemsContainer] *[class^=groupTitle] span:nth-child(2)", | ||||
|   currentlyPlaying: "[class^='isPlayingIcon'], [data-test-is-playing='true']", | ||||
|   album_name_cell: '[class^="album"]', | ||||
| @@ -115,38 +115,34 @@ const elements = { | ||||
|   }, | ||||
|  | ||||
|   getAlbumName: function () { | ||||
|     try { | ||||
|       //If listening to an album, get its name from the header title | ||||
|       if (globalThis.location.href.includes("/album/")) { | ||||
|         const albumName = globalThis.document.querySelector(this.album_header_title); | ||||
|         if (albumName) { | ||||
|           return albumName.textContent; | ||||
|         } | ||||
|         //If listening to a playlist or a mix, get album name from the list | ||||
|       } else if ( | ||||
|         globalThis.location.href.includes("/playlist/") || | ||||
|         globalThis.location.href.includes("/mix/") | ||||
|       ) { | ||||
|         if (this.currentlyPlaying === MediaStatus.playing) { | ||||
|           // find the currently playing element from the list (which might be in an album icon), traverse back up to the mediaItem (row) and select the album cell. | ||||
|           // document.querySelector("[class^='isPlayingIcon'], [data-test-is-playing='true']").closest('[data-type="mediaItem"]').querySelector('[class^="album"]').textContent | ||||
|           const row = window.document.querySelector(this.currentlyPlaying).closest(this.mediaItem); | ||||
|           if (row) { | ||||
|             return row.querySelector(this.album_name_cell).textContent; | ||||
|           } | ||||
|     //If listening to an album, get its name from the header title | ||||
|     if (window.location.href.includes("/album/")) { | ||||
|       const albumName = window.document.querySelector(this.album_header_title); | ||||
|       if (albumName) { | ||||
|         return albumName.textContent; | ||||
|       } | ||||
|       //If listening to a playlist or a mix, get album name from the list | ||||
|     } else if ( | ||||
|       window.location.href.includes("/playlist/") || | ||||
|       window.location.href.includes("/mix/") | ||||
|     ) { | ||||
|       if (currentPlayStatus === MediaStatus.playing) { | ||||
|         // find the currently playing element from the list (which might be in an album icon), traverse back up to the mediaItem (row) and select the album cell. | ||||
|         // document.querySelector("[class^='isPlayingIcon'], [data-test-is-playing='true']").closest('[data-type="mediaItem"]').querySelector('[class^="album"]').textContent | ||||
|         const row = window.document.querySelector(this.currentlyPlaying).closest(this.mediaItem); | ||||
|         if (row) { | ||||
|           return row.querySelector(this.album_name_cell).textContent; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       // see whether we're on the queue page and get it from there | ||||
|       const queueAlbumName = this.getText("queue_album"); | ||||
|       if (queueAlbumName) { | ||||
|         return queueAlbumName; | ||||
|       } | ||||
|  | ||||
|       return ""; | ||||
|     } catch { | ||||
|       return ""; | ||||
|     } | ||||
|  | ||||
|     // see whether we're on the queue page and get it from there | ||||
|     const queueAlbumName = elements.getText("queue_album"); | ||||
|     if (queueAlbumName) { | ||||
|       return queueAlbumName; | ||||
|     } | ||||
|  | ||||
|     return ""; | ||||
|   }, | ||||
|  | ||||
|   isMuted: function () { | ||||
| @@ -487,7 +483,6 @@ function updateMpris(mediaInfo: MediaInfo) { | ||||
|         "xesam:title": mediaInfo.title, | ||||
|         "xesam:artist": [mediaInfo.artists], | ||||
|         "xesam:album": mediaInfo.album, | ||||
|         "xesam:url": mediaInfo.url, | ||||
|         "mpris:artUrl": mediaInfo.image, | ||||
|         "mpris:length": convertDuration(mediaInfo.duration) * 1000 * 1000, | ||||
|         "mpris:trackid": "/org/mpris/MediaPlayer2/track/" + getTrackID(), | ||||
|   | ||||
| @@ -26,7 +26,7 @@ const defaultPresence = { | ||||
|   largeImageKey: "tidal-hifi-icon", | ||||
|   largeImageText: `TIDAL Hi-Fi ${app.getVersion()}`, | ||||
|   instance: false, | ||||
|   type: ACTIVITY_LISTENING | ||||
|   type: ACTIVITY_LISTENING, | ||||
| }; | ||||
|  | ||||
| const updateActivity = () => { | ||||
| @@ -103,7 +103,8 @@ const getActivity = (): SetActivity => { | ||||
|     if (includeTimestamps) { | ||||
|       const currentSeconds = convertDurationToSeconds(mediaInfo.current); | ||||
|       const durationSeconds = convertDurationToSeconds(mediaInfo.duration); | ||||
|       const now = Math.trunc((Date.now() + 500) / 1000); | ||||
|       const date = new Date(); | ||||
|       const now = Math.floor(date.getTime() / 1000); | ||||
|       presence.startTimestamp = now - currentSeconds; | ||||
|       presence.endTimestamp = presence.startTimestamp + durationSeconds; | ||||
|     } | ||||
| @@ -117,15 +118,17 @@ const getActivity = (): SetActivity => { | ||||
| const connectWithRetry = async (retryCount = 0) => { | ||||
|   try { | ||||
|     await rpc.login(); | ||||
|     Logger.log('Connected to Discord'); | ||||
|     Logger.log("Connected to Discord"); | ||||
|     rpc.on("ready", updateActivity); | ||||
|     Object.values(globalEvents).forEach(event => ipcMain.on(event, observer)); | ||||
|     Object.values(globalEvents).forEach((event) => ipcMain.on(event, observer)); | ||||
|   } catch (error) { | ||||
|     if (retryCount < MAX_RETRIES) { | ||||
|       Logger.log(`Failed to connect to Discord, retrying in ${RETRY_DELAY/1000} seconds... (Attempt ${retryCount + 1}/${MAX_RETRIES})`); | ||||
|       Logger.log( | ||||
|         `Failed to connect to Discord, retrying in ${RETRY_DELAY / 1000} seconds... (Attempt ${retryCount + 1}/${MAX_RETRIES})` | ||||
|       ); | ||||
|       setTimeout(() => connectWithRetry(retryCount + 1), RETRY_DELAY); | ||||
|     } else { | ||||
|       Logger.log('Failed to connect to Discord after maximum retry attempts'); | ||||
|       Logger.log("Failed to connect to Discord after maximum retry attempts"); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| @@ -134,7 +137,7 @@ const connectWithRetry = async (retryCount = 0) => { | ||||
|  * Set up the discord rpc and listen on globalEvents.updateInfo | ||||
|  */ | ||||
| export const initRPC = () => { | ||||
|   rpc = new Client({ transport: {type: "ipc"}, clientId }); | ||||
|   rpc = new Client({ transport: { type: "ipc" }, clientId }); | ||||
|   connectWithRetry(); | ||||
| }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user