mirror of
				https://github.com/Mastermindzh/tidal-hifi.git
				synced 2025-10-31 00:39:30 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			c89fe5e573
			...
			develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d67f62c0dc | |||
| b2afd44dd6 | 
| @@ -4,12 +4,12 @@ name: default | |||||||
|  |  | ||||||
| steps: | steps: | ||||||
|   - name: install |   - name: install | ||||||
|     image: node:22.17.0 |     image: node:19.4.0 | ||||||
|     commands: |     commands: | ||||||
|       - npm install |       - npm install | ||||||
|  |  | ||||||
|   - name: build_with_linux |   - name: build_with_linux | ||||||
|     image: node:22.17.0 |     image: node:19.4.0 | ||||||
|     commands: |     commands: | ||||||
|       - apt-get update && apt-get upgrade -y |       - apt-get update && apt-get upgrade -y | ||||||
|       - apt-get install -y libarchive-tools rpm |       - 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/checkout@master | ||||||
|       - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|         with: |         with: | ||||||
|           node-version: 22.12.0 |           node-version: 22.4 | ||||||
|       - run: npm install |       - run: npm install | ||||||
|       - run: npm run build |       - run: npm run build | ||||||
|       # - uses: actions/upload-artifact@master |  | ||||||
|       #   with: |  | ||||||
|       #     name: linux-builds |  | ||||||
|       #     path: dist/ |  | ||||||
|  |  | ||||||
|   # build_on_mac: |   build_on_mac: | ||||||
|   #   runs-on: macos-latest |     runs-on: macos-latest | ||||||
|   #   steps: |     steps: | ||||||
|   #     - uses: actions/checkout@master |       - uses: actions/checkout@master | ||||||
|   #     - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|   #       with: |         with: | ||||||
|   #         node-version: 22.4 |           node-version: 22.4 | ||||||
|   #     - run: npm install |       - run: npm install | ||||||
|   #     - run: npm run build |       - run: npm run build | ||||||
|  |  | ||||||
|   # build_on_win: |   build_on_win: | ||||||
|   #   runs-on: windows-latest |     runs-on: windows-latest | ||||||
|   #   steps: |     steps: | ||||||
|   #     - uses: actions/checkout@master |       - uses: actions/checkout@master | ||||||
|   #     - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|   #       with: |         with: | ||||||
|   #         node-version: 22.4 |           node-version: 22.4 | ||||||
|   #     - run: npm install |       - run: npm install | ||||||
|   #     - run: npm run build |       - 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/checkout@master | ||||||
|       - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|         with: |         with: | ||||||
|           node-version: 22.12.0 |           node-version: 22.4 | ||||||
|       - run: npm install |       - run: npm install | ||||||
|       - run: npm run build |       - run: npm run build | ||||||
|       - uses: actions/upload-artifact@master |       - uses: actions/upload-artifact@master | ||||||
| @@ -29,30 +29,30 @@ jobs: | |||||||
|           name: linux-builds |           name: linux-builds | ||||||
|           path: dist/ |           path: dist/ | ||||||
|  |  | ||||||
|   # build_on_mac: |   build_on_mac: | ||||||
|   #   runs-on: macos-latest |     runs-on: macos-latest | ||||||
|   #   steps: |     steps: | ||||||
|   #     - uses: actions/checkout@master |       - uses: actions/checkout@master | ||||||
|   #     - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|   #       with: |         with: | ||||||
|   #         node-version: 22.4 |           node-version: 22.4 | ||||||
|   #     - run: npm install |       - run: npm install | ||||||
|   #     - run: npm run build |       - run: npm run build | ||||||
|   #     - uses: actions/upload-artifact@master |       - uses: actions/upload-artifact@master | ||||||
|   #       with: |         with: | ||||||
|   #         name: mac-builds |           name: mac-builds | ||||||
|   #         path: ./dist/ |           path: ./dist/ | ||||||
|  |  | ||||||
|   # build_on_win: |   build_on_win: | ||||||
|   #   runs-on: windows-latest |     runs-on: windows-latest | ||||||
|   #   steps: |     steps: | ||||||
|   #     - uses: actions/checkout@master |       - uses: actions/checkout@master | ||||||
|   #     - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|   #       with: |         with: | ||||||
|   #         node-version: 22.4 |           node-version: 22.4 | ||||||
|   #     - run: npm install |       - run: npm install | ||||||
|   #     - run: npm run build |       - run: npm run build | ||||||
|   #     - uses: actions/upload-artifact@master |       - uses: actions/upload-artifact@master | ||||||
|   #       with: |         with: | ||||||
|   #         name: windows-builds |           name: windows-builds | ||||||
|   #         path: dist/ |           path: dist/ | ||||||
|   | |||||||
| @@ -1,16 +1,10 @@ | |||||||
| { | { | ||||||
|   "plugins": [ |   "plugins": ["stylelint-prettier"], | ||||||
|     "stylelint-prettier" |   "extends": ["stylelint-config-standard-scss"], | ||||||
|   ], |   "ignoreFiles": ["src/themes/**.scss"], | ||||||
|   "extends": [ |  | ||||||
|     "stylelint-config-standard-scss" |  | ||||||
|   ], |  | ||||||
|   "ignoreFiles": [ |  | ||||||
|     "src/themes/**.scss" |  | ||||||
|   ], |  | ||||||
|   "rules": { |   "rules": { | ||||||
|     "prettier/prettier": true, |     "prettier/prettier": true, | ||||||
|     "scss/at-extend-no-missing-placeholder": null, |     "scss/at-extend-no-missing-placeholder": null, | ||||||
|     "no-descending-specificity": null |     "no-descending-specificity": null | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @@ -17,9 +17,7 @@ | |||||||
|     "trackid", |     "trackid", | ||||||
|     "tracklist", |     "tracklist", | ||||||
|     "widevine", |     "widevine", | ||||||
|     "wvcus", |     "xesam" | ||||||
|     "xesam", |  | ||||||
|     "xhayper" |  | ||||||
|   ], |   ], | ||||||
|   "sonarlint.connectedMode.project": { |   "sonarlint.connectedMode.project": { | ||||||
|     "connectionId": "public-sonarcloud", |     "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/), | 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). | 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] | ## [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) | - 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) | - Added all missing swagger/openApi info with the help of [Times-Z](https://github.com/Times-Z) | ||||||
| - Updated most dependency versions | - Updated most dependency versions | ||||||
|  |  | ||||||
|   - This includes Electron 31! |   - This includes Electron 31! | ||||||
|  |  | ||||||
| - Added a channel selector so we can now use Tidal's staging environment directly from the app | - 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 Electron to 28.1.1 (fixes [325](https://github.com/Mastermindzh/tidal-hifi/issues/325)) | ||||||
| - Updated dependencies to latest | - Updated dependencies to latest | ||||||
|  |  | ||||||
|   - added theme files to stylelint ignore |   - added theme files to stylelint ignore | ||||||
|   - fixed other stylelint errors |   - fixed other stylelint errors | ||||||
|  |  | ||||||
| - Added functionality to favorite a song (fixes [#323](https://github.com/Mastermindzh/tidal-hifi/issues/323)) | - 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 a hotkey to favorite ("Add to collection") songs: Control+a | ||||||
|   - Added the "favorite" field in the `mediaInfo` and the API `/current` endpoint |   - 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` |   - 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 | - Added settings to customize the Discord rich presence information | ||||||
|   - Discord settings are now also collapsible like the ListenBrainz ones are |   - 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 | - 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. | - 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 | - Custom CSS now also applies to settings window | ||||||
|      |    | ||||||
|  |  | ||||||
| ## [5.6.0] | ## [5.6.0] | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,4 +8,3 @@ Only the very latest 😄. | |||||||
|  |  | ||||||
| If you find a vulnerability just add it as an issue. | 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). | 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 | appId: com.rickvanlieshout.tidal-hifi | ||||||
| electronVersion: 37.2.5 | electronVersion: 28.1.1 | ||||||
| electronDownload: | electronDownload: | ||||||
|   version: 37.2.5+wvcus |   version: 28.1.1+wvcus | ||||||
|   mirror: https://github.com/castlabs/electron-releases/releases/download/v |   mirror: https://github.com/castlabs/electron-releases/releases/download/v | ||||||
| snap: | snap: | ||||||
|   plugs: |   plugs: | ||||||
| @@ -17,25 +17,24 @@ linux: | |||||||
|   executableName: tidal-hifi |   executableName: tidal-hifi | ||||||
|   executableArgs: |   executableArgs: | ||||||
|     [ |     [ | ||||||
|  |       "--enable-features=UseOzonePlatform", | ||||||
|       "--ozone-platform-hint=auto", |       "--ozone-platform-hint=auto", | ||||||
|       "--enable-features=WaylandWindowDecorations", |       "--enable-features=WaylandWindowDecorations", | ||||||
|       "--enable-wayland-ime", |  | ||||||
|       "--use-angle", |  | ||||||
|     ] |     ] | ||||||
|   desktop: |   desktop: | ||||||
|     entry: |     Encoding: UTF-8 | ||||||
|       Encoding: "UTF-8" |     Name: TIDAL Hi-Fi | ||||||
|       Name: "TIDAL Hi-Fi" |     GenericName: TIDAL Hi-Fi | ||||||
|       GenericName: "TIDAL Hi-Fi" |     Comment: The web version of listen.tidal.com running in electron with hifi support thanks to widevine. | ||||||
|       Comment: "The web version of listen.tidal.com running in electron with hifi support thanks to widevine." |     Icon: tidal-hifi | ||||||
|       Icon: "tidal-hifi" |     StartupNotify: true | ||||||
|       StartupNotify: "true" |     Terminal: false | ||||||
|       Terminal: "false" |     Type: Application | ||||||
|       Type: "Application" |     Categories: Network;Application;AudioVideo;Audio;Video | ||||||
|       Categories: "Network;Application;AudioVideo;Audio;Video" |     StartupWMClass: tidal-hifi | ||||||
|       StartupWMClass: "tidal-hifi" |     X-PulseAudio-Properties: media.role=music | ||||||
|       X-PulseAudio-Properties: "media.role=music" |     MimeType: x-scheme-handler/tidal; | ||||||
|       MimeType: "x-scheme-handler/tidal;" |  | ||||||
| mac: | mac: | ||||||
|   category: public.app-category.entertainment |   category: public.app-category.entertainment | ||||||
| win: | win: | ||||||
|   | |||||||
							
								
								
									
										5543
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										5543
									
								
								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", |   "name": "tidal-hifi", | ||||||
|   "version": "5.20.1", |   "version": "5.17.0", | ||||||
|   "description": "Tidal on Electron with widevine(hifi) support", |   "description": "Tidal on Electron with widevine(hifi) support", | ||||||
|   "main": "ts-dist/main.js", |   "main": "ts-dist/main.js", | ||||||
|   "scripts": { |   "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\"", |     "watchStart": "nodemon dist -x \"npm run start\"", | ||||||
|     "compile": "tsc && npm run sass-and-copy", |     "compile": "tsc && npm run sass-and-copy", | ||||||
|     "deps": "npm run watch", |     "deps": "npm run watch", | ||||||
| @@ -23,6 +23,7 @@ | |||||||
|     "build-mac": "npm run builder -- -c ./build/electron-builder.yml -m", |     "build-mac": "npm run builder -- -c ./build/electron-builder.yml -m", | ||||||
|     "build-base": "npm run builder -- -c ./build/electron-builder.base.yml", |     "build-base": "npm run builder -- -c ./build/electron-builder.base.yml", | ||||||
|     "prebuilder": "npm run compile", |     "prebuilder": "npm run compile", | ||||||
|  |     "prettier": "prettier . --write", | ||||||
|     "builder": "electron-builder --publish=never", |     "builder": "electron-builder --publish=never", | ||||||
|     "sass": "sass ./src/pages/settings/settings.scss ./src/pages/settings/settings.css && sass --no-source-map src/themes:themes", |     "sass": "sass ./src/pages/settings/settings.scss ./src/pages/settings/settings.css && sass --no-source-map src/themes:themes", | ||||||
|     "style-lint": "npx stylelint **/*.scss", |     "style-lint": "npx stylelint **/*.scss", | ||||||
| @@ -40,45 +41,44 @@ | |||||||
|   "homepage": "https://github.com/Mastermindzh/tidal-hifi", |   "homepage": "https://github.com/Mastermindzh/tidal-hifi", | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@electron/remote": "^2.1.3", |     "@electron/remote": "^2.1.2", | ||||||
|     "@types/swagger-jsdoc": "^6.0.4", |     "@types/swagger-jsdoc": "^6.0.4", | ||||||
|     "@xhayper/discord-rpc": "1.3.0", |     "@xhayper/discord-rpc": "^1.2.0", | ||||||
|     "axios": "^1.12.0", |     "axios": "^1.7.7", | ||||||
|     "cors": "^2.8.5", |     "cors": "^2.8.5", | ||||||
|     "electron-store": "^8.2.0", |     "electron-store": "^8.2.0", | ||||||
|     "express": "^5.1.0", |     "express": "^4.21.1", | ||||||
|     "hotkeys-js": "^3.13.15", |     "hotkeys-js": "^3.13.7", | ||||||
|     "mpris-service": "^2.1.2", |     "mpris-service": "^2.1.2", | ||||||
|     "request": "^2.88.2", |     "request": "^2.88.2", | ||||||
|     "sass": "1.93.2", |     "sass": "^1.79.4", | ||||||
|     "swagger-ui-express": "^5.0.1" |     "swagger-ui-express": "^5.0.1" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@mastermindzh/prettier-config": "^1.0.0", |     "@mastermindzh/prettier-config": "^1.0.0", | ||||||
|     "@types/cors": "^2.8.19", |     "@types/cors": "^2.8.17", | ||||||
|     "@types/express": "^5.0.3", |     "@types/express": "^4.17.21", | ||||||
|     "@types/node": "^22.16.2", |     "@types/node": "^20.14.10", | ||||||
|     "@types/request": "^2.48.12", |     "@types/request": "^2.48.12", | ||||||
|     "@types/swagger-ui-express": "^4.1.8", |     "@types/swagger-ui-express": "^4.1.6", | ||||||
|     "@typescript-eslint/eslint-plugin": "^8.36.0", |     "@typescript-eslint/eslint-plugin": "^7.16.0", | ||||||
|     "@typescript-eslint/parser": "^8.36.0", |     "@typescript-eslint/parser": "^7.15.0", | ||||||
|     "copyfiles": "^2.4.1", |     "copyfiles": "^2.4.1", | ||||||
|     "electron": "github:castlabs/electron-releases#v37.2.5+wvcus", |     "electron": "git+https://github.com/castlabs/electron-releases#v31.1.0+wvcus", | ||||||
|     "electron-builder": "~26.0.12", |     "electron-builder": "~24.9.4", | ||||||
|     "eslint": "^9.30.1", |     "eslint": "^8.57.0", | ||||||
|     "js-yaml": "^4.1.0", |     "js-yaml": "^4.1.0", | ||||||
|     "markdown-toc": "^1.2.0", |     "markdown-toc": "^1.2.0", | ||||||
|     "node-abi": "^4.12.0", |     "nodemon": "^3.1.4", | ||||||
|     "nodemon": "^3.1.10", |     "prettier": "^3.3.2", | ||||||
|     "prettier": "^3.6.2", |     "stylelint": "^16.6.1", | ||||||
|     "stylelint": "^16.21.1", |     "stylelint-config-standard": "^36.0.1", | ||||||
|     "stylelint-config-standard": "^39.0.0", |     "stylelint-config-standard-scss": "^13.1.0", | ||||||
|     "stylelint-config-standard-scss": "^16.0.0", |     "stylelint-prettier": "^5.0.0", | ||||||
|     "stylelint-prettier": "^5.0.3", |  | ||||||
|     "swagger-jsdoc": "^6.2.8", |     "swagger-jsdoc": "^6.2.8", | ||||||
|     "ts-node": "^10.9.2", |     "ts-node": "^10.9.2", | ||||||
|     "tsc-watch": "^7.1.1", |     "tsc-watch": "^6.2.0", | ||||||
|     "typescript": "^5.8.3" |     "typescript": "^5.5.3" | ||||||
|   }, |   }, | ||||||
|   "prettier": "@mastermindzh/prettier-config" |   "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"]', |     media: '*[data-test="current-media-imagery"]', | ||||||
|     image: "img", |     image: "img", | ||||||
|     current: '*[data-test="current-time"]', |     current: '*[data-test="current-time"]', | ||||||
|     duration: '*[class^=_playbackControlsContainer] *[data-test="duration"]', |     duration: '*[class^=playbackControlsContainer] *[data-test="duration"]', | ||||||
|     bar: '*[data-test="progress-bar"]', |     bar: '*[data-test="progress-bar"]', | ||||||
|     footer: "#footerPlayer", |     footer: "#footerPlayer", | ||||||
|     mediaItem: "[data-type='mediaItem']", |     mediaItem: "[data-type='mediaItem']", | ||||||
|     album_header_title: '*[class^="_playingFrom"] span:nth-child(2)', |     album_header_title: '*[class^="playingFrom"] span:nth-child(2)', | ||||||
|     playing_from: '*[class^="_playingFrom"] span:nth-child(2)', |     playingFrom: '*[class^="playingFrom"] span:nth-child(2)', | ||||||
|     queue_album: "*[class^=playQueueItemsContainer] *[class^=groupTitle] span:nth-child(2)", |  | ||||||
|     currentlyPlaying: "[class^='isPlayingIcon'], [data-test-is-playing='true']", |     currentlyPlaying: "[class^='isPlayingIcon'], [data-test-is-playing='true']", | ||||||
|     album_name_cell: '[class^="album"]', |     album_name_cell: '[class^="album"]', | ||||||
|     tracklist_row: '[data-test="tracklist-row"]', |     tracklist_row: '[data-test="tracklist-row"]', | ||||||
|   | |||||||
| @@ -88,9 +88,8 @@ export const addCurrentInfo = (expressApp: Router) => { | |||||||
|    *             schema: |    *             schema: | ||||||
|    *               $ref: '#/components/schemas/MediaInfo' |    *               $ref: '#/components/schemas/MediaInfo' | ||||||
|    */ |    */ | ||||||
|   expressApp.get("/current", (_req, res) => { |   expressApp.get("/current", (req, res) => res.json({ ...mediaInfo, artist: mediaInfo.artists })); | ||||||
|     res.json({ ...mediaInfo, artist: mediaInfo.artists }); |  | ||||||
|   }); |  | ||||||
|   /** |   /** | ||||||
|    * @swagger |    * @swagger | ||||||
|    * /current/image: |    * /current/image: | ||||||
|   | |||||||
| @@ -21,12 +21,8 @@ export const startApi = (mainWindow: BrowserWindow) => { | |||||||
|   expressApp.use(cors()); |   expressApp.use(cors()); | ||||||
|   expressApp.use(express.json()); |   expressApp.use(express.json()); | ||||||
|   expressApp.use("/docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec)); |   expressApp.use("/docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec)); | ||||||
|   expressApp.get("/", (req, res) => { |   expressApp.get("/", (req, res) => res.send("Hello World!")); | ||||||
|     res.send("Hello World!"); |   expressApp.get("/swagger.json", (req, res) => res.json(swaggerSpec)); | ||||||
|   }); |  | ||||||
|   expressApp.get("/swagger.json", (req, res) => { |  | ||||||
|     res.json(swaggerSpec); |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   // add features |   // add features | ||||||
|   addLegacyApi(expressApp, mainWindow); |   addLegacyApi(expressApp, mainWindow); | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|   "openapi": "3.1.0", |   "openapi": "3.1.0", | ||||||
|   "info": { |   "info": { | ||||||
|     "title": "TIDAL Hi-Fi API", |     "title": "TIDAL Hi-Fi API", | ||||||
|     "version": "5.20.1", |     "version": "5.17.0", | ||||||
|     "description": "", |     "description": "", | ||||||
|     "license": { |     "license": { | ||||||
|       "name": "MIT", |       "name": "MIT", | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ import { | |||||||
| import { addTray, refreshTray } from "./scripts/tray"; | import { addTray, refreshTray } from "./scripts/tray"; | ||||||
| let mainInhibitorId = -1; | let mainInhibitorId = -1; | ||||||
|  |  | ||||||
|  | initialize(); | ||||||
| let mainWindow: BrowserWindow; | let mainWindow: BrowserWindow; | ||||||
| const icon = path.join(__dirname, "../assets/icon.png"); | const icon = path.join(__dirname, "../assets/icon.png"); | ||||||
| const PROTOCOL_PREFIX = "tidal"; | const PROTOCOL_PREFIX = "tidal"; | ||||||
| @@ -97,7 +98,6 @@ function createWindow(options = { x: 0, y: 0, backgroundColor: "white" }) { | |||||||
|       }, |       }, | ||||||
|     }, |     }, | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   enable(mainWindow.webContents); |   enable(mainWindow.webContents); | ||||||
|   registerHttpProtocols(); |   registerHttpProtocols(); | ||||||
|   syncMenuBarWithStore(); |   syncMenuBarWithStore(); | ||||||
| @@ -126,7 +126,6 @@ function createWindow(options = { x: 0, y: 0, backgroundColor: "white" }) { | |||||||
|     } |     } | ||||||
|     return false; |     return false; | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
|   // Emitted when the window is closed. |   // Emitted when the window is closed. | ||||||
|   mainWindow.on("closed", function () { |   mainWindow.on("closed", function () { | ||||||
|     releaseInhibitorIfActive(mainInhibitorId); |     releaseInhibitorIfActive(mainInhibitorId); | ||||||
| @@ -179,7 +178,6 @@ app.on("ready", async () => { | |||||||
|  |  | ||||||
|   if (isMainInstance() || isMultipleInstancesAllowed()) { |   if (isMainInstance() || isMultipleInstancesAllowed()) { | ||||||
|     await components.whenReady(); |     await components.whenReady(); | ||||||
|     initialize(); |  | ||||||
|  |  | ||||||
|     // Adblock |     // Adblock | ||||||
|     if (settingsStore.get(settings.adBlock)) { |     if (settingsStore.get(settings.adBlock)) { | ||||||
| @@ -190,8 +188,6 @@ app.on("ready", async () => { | |||||||
|       }); |       }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Logger.log("components ready:", components.status()); |  | ||||||
|  |  | ||||||
|     createWindow(); |     createWindow(); | ||||||
|     addMenu(mainWindow); |     addMenu(mainWindow); | ||||||
|     createSettingsWindow(); |     createSettingsWindow(); | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -54,12 +54,12 @@ const elements = { | |||||||
|   media: '*[data-test="current-media-imagery"]', |   media: '*[data-test="current-media-imagery"]', | ||||||
|   image: "img", |   image: "img", | ||||||
|   current: '*[data-test="current-time"]', |   current: '*[data-test="current-time"]', | ||||||
|   duration: '*[class^=_playbackControlsContainer] *[data-test="duration"]', |   duration: '*[class^=playbackControlsContainer] *[data-test="duration"]', | ||||||
|   bar: '*[data-test="progress-bar"]', |   bar: '*[data-test="progress-bar"]', | ||||||
|   footer: "#footerPlayer", |   footer: "#footerPlayer", | ||||||
|   mediaItem: "[data-type='mediaItem']", |   mediaItem: "[data-type='mediaItem']", | ||||||
|   album_header_title: '*[class^="_playingFrom"] span:nth-child(2)', |   album_header_title: '*[class^="playingFrom"] span:nth-child(2)', | ||||||
|   playing_from: '*[class^="_playingFrom"] span:nth-child(2)', |   playing_from: '*[class^="playingFrom"] span:nth-child(2)', | ||||||
|   queue_album: "*[class^=playQueueItemsContainer] *[class^=groupTitle] span:nth-child(2)", |   queue_album: "*[class^=playQueueItemsContainer] *[class^=groupTitle] span:nth-child(2)", | ||||||
|   currentlyPlaying: "[class^='isPlayingIcon'], [data-test-is-playing='true']", |   currentlyPlaying: "[class^='isPlayingIcon'], [data-test-is-playing='true']", | ||||||
|   album_name_cell: '[class^="album"]', |   album_name_cell: '[class^="album"]', | ||||||
| @@ -115,38 +115,34 @@ const elements = { | |||||||
|   }, |   }, | ||||||
|  |  | ||||||
|   getAlbumName: function () { |   getAlbumName: function () { | ||||||
|     try { |     //If listening to an album, get its name from the header title | ||||||
|       //If listening to an album, get its name from the header title |     if (window.location.href.includes("/album/")) { | ||||||
|       if (globalThis.location.href.includes("/album/")) { |       const albumName = window.document.querySelector(this.album_header_title); | ||||||
|         const albumName = globalThis.document.querySelector(this.album_header_title); |       if (albumName) { | ||||||
|         if (albumName) { |         return albumName.textContent; | ||||||
|           return albumName.textContent; |       } | ||||||
|         } |       //If listening to a playlist or a mix, get album name from the list | ||||||
|         //If listening to a playlist or a mix, get album name from the list |     } else if ( | ||||||
|       } else if ( |       window.location.href.includes("/playlist/") || | ||||||
|         globalThis.location.href.includes("/playlist/") || |       window.location.href.includes("/mix/") | ||||||
|         globalThis.location.href.includes("/mix/") |     ) { | ||||||
|       ) { |       if (currentPlayStatus === MediaStatus.playing) { | ||||||
|         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. | ||||||
|           // 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 | ||||||
|           // 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); | ||||||
|           const row = window.document.querySelector(this.currentlyPlaying).closest(this.mediaItem); |         if (row) { | ||||||
|           if (row) { |           return row.querySelector(this.album_name_cell).textContent; | ||||||
|             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 () { |   isMuted: function () { | ||||||
| @@ -487,7 +483,6 @@ function updateMpris(mediaInfo: MediaInfo) { | |||||||
|         "xesam:title": mediaInfo.title, |         "xesam:title": mediaInfo.title, | ||||||
|         "xesam:artist": [mediaInfo.artists], |         "xesam:artist": [mediaInfo.artists], | ||||||
|         "xesam:album": mediaInfo.album, |         "xesam:album": mediaInfo.album, | ||||||
|         "xesam:url": mediaInfo.url, |  | ||||||
|         "mpris:artUrl": mediaInfo.image, |         "mpris:artUrl": mediaInfo.image, | ||||||
|         "mpris:length": convertDuration(mediaInfo.duration) * 1000 * 1000, |         "mpris:length": convertDuration(mediaInfo.duration) * 1000 * 1000, | ||||||
|         "mpris:trackid": "/org/mpris/MediaPlayer2/track/" + getTrackID(), |         "mpris:trackid": "/org/mpris/MediaPlayer2/track/" + getTrackID(), | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ const defaultPresence = { | |||||||
|   largeImageKey: "tidal-hifi-icon", |   largeImageKey: "tidal-hifi-icon", | ||||||
|   largeImageText: `TIDAL Hi-Fi ${app.getVersion()}`, |   largeImageText: `TIDAL Hi-Fi ${app.getVersion()}`, | ||||||
|   instance: false, |   instance: false, | ||||||
|   type: ACTIVITY_LISTENING |   type: ACTIVITY_LISTENING, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const updateActivity = () => { | const updateActivity = () => { | ||||||
| @@ -103,7 +103,8 @@ const getActivity = (): SetActivity => { | |||||||
|     if (includeTimestamps) { |     if (includeTimestamps) { | ||||||
|       const currentSeconds = convertDurationToSeconds(mediaInfo.current); |       const currentSeconds = convertDurationToSeconds(mediaInfo.current); | ||||||
|       const durationSeconds = convertDurationToSeconds(mediaInfo.duration); |       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.startTimestamp = now - currentSeconds; | ||||||
|       presence.endTimestamp = presence.startTimestamp + durationSeconds; |       presence.endTimestamp = presence.startTimestamp + durationSeconds; | ||||||
|     } |     } | ||||||
| @@ -117,15 +118,17 @@ const getActivity = (): SetActivity => { | |||||||
| const connectWithRetry = async (retryCount = 0) => { | const connectWithRetry = async (retryCount = 0) => { | ||||||
|   try { |   try { | ||||||
|     await rpc.login(); |     await rpc.login(); | ||||||
|     Logger.log('Connected to Discord'); |     Logger.log("Connected to Discord"); | ||||||
|     rpc.on("ready", updateActivity); |     rpc.on("ready", updateActivity); | ||||||
|     Object.values(globalEvents).forEach(event => ipcMain.on(event, observer)); |     Object.values(globalEvents).forEach((event) => ipcMain.on(event, observer)); | ||||||
|   } catch (error) { |   } catch (error) { | ||||||
|     if (retryCount < MAX_RETRIES) { |     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); |       setTimeout(() => connectWithRetry(retryCount + 1), RETRY_DELAY); | ||||||
|     } else { |     } 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 |  * Set up the discord rpc and listen on globalEvents.updateInfo | ||||||
|  */ |  */ | ||||||
| export const initRPC = () => { | export const initRPC = () => { | ||||||
|   rpc = new Client({ transport: {type: "ipc"}, clientId }); |   rpc = new Client({ transport: { type: "ipc" }, clientId }); | ||||||
|   connectWithRetry(); |   connectWithRetry(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user