mirror of
https://github.com/Mastermindzh/tidal-hifi.git
synced 2025-09-15 08:09:27 +02:00
Compare commits
24 Commits
16f98f4f1b
...
testing
Author | SHA1 | Date | |
---|---|---|---|
8fc49f500e | |||
|
49f5a01b58 | ||
48f4fe47ef | |||
a819e1eb45 | |||
57e6342b5f | |||
58a543a3c8 | |||
1c915d99fe | |||
|
8994360415 | ||
a5c0d9e6e8 | |||
f8eb36f4c7 | |||
5ca90c25d3 | |||
cf86969cfc | |||
afd05ae88b | |||
72c25dfdc1 | |||
|
25b30edf31 | ||
35ed4807e3 | |||
deff9524a8 | |||
34c7777eeb | |||
048e949f30 | |||
|
4a976bc58c | ||
ff4c51234b | |||
|
c4ee6b51b9 | ||
45fe336598 | |||
|
fe9f50aaf5 |
40
.github/workflows/build.yml
vendored
40
.github/workflows/build.yml
vendored
@@ -24,23 +24,27 @@ jobs:
|
|||||||
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
|
||||||
|
# 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
|
||||||
|
52
.github/workflows/release.yml
vendored
52
.github/workflows/release.yml
vendored
@@ -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/
|
||||||
|
19
CHANGELOG.md
19
CHANGELOG.md
@@ -4,6 +4,25 @@ 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.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)
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
appId: com.rickvanlieshout.tidal-hifi
|
appId: com.rickvanlieshout.tidal-hifi
|
||||||
electronVersion: 28.1.1
|
electronVersion: 35.1.1
|
||||||
electronDownload:
|
electronDownload:
|
||||||
version: 28.1.1+wvcus
|
version: 35.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:
|
||||||
@@ -22,19 +22,19 @@ linux:
|
|||||||
"--enable-features=WaylandWindowDecorations",
|
"--enable-features=WaylandWindowDecorations",
|
||||||
]
|
]
|
||||||
desktop:
|
desktop:
|
||||||
Encoding: UTF-8
|
entry:
|
||||||
Name: TIDAL Hi-Fi
|
Encoding: "UTF-8"
|
||||||
GenericName: TIDAL Hi-Fi
|
Name: "TIDAL Hi-Fi"
|
||||||
Comment: The web version of listen.tidal.com running in electron with hifi support thanks to widevine.
|
GenericName: "TIDAL Hi-Fi"
|
||||||
Icon: tidal-hifi
|
Comment: "The web version of listen.tidal.com running in electron with hifi support thanks to widevine."
|
||||||
StartupNotify: true
|
Icon: "tidal-hifi"
|
||||||
Terminal: false
|
StartupNotify: "true"
|
||||||
Type: Application
|
Terminal: "false"
|
||||||
Categories: Network;Application;AudioVideo;Audio;Video
|
Type: "Application"
|
||||||
StartupWMClass: tidal-hifi
|
Categories: "Network;Application;AudioVideo;Audio;Video"
|
||||||
X-PulseAudio-Properties: media.role=music
|
StartupWMClass: "tidal-hifi"
|
||||||
MimeType: x-scheme-handler/tidal;
|
X-PulseAudio-Properties: "media.role=music"
|
||||||
|
MimeType: "x-scheme-handler/tidal;"
|
||||||
mac:
|
mac:
|
||||||
category: public.app-category.entertainment
|
category: public.app-category.entertainment
|
||||||
win:
|
win:
|
||||||
|
4770
package-lock.json
generated
4770
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
22
package.json
22
package.json
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "tidal-hifi",
|
"name": "tidal-hifi",
|
||||||
"version": "5.17.0",
|
"version": "5.18.2",
|
||||||
"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 .",
|
"start": "electron --inspect=0.0.0.0:5858 --remote-debugging-port=8315 --remote-allow-origins=* .",
|
||||||
"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",
|
||||||
@@ -42,27 +42,29 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "^2.1.2",
|
"@electron/remote": "^2.1.2",
|
||||||
"@types/swagger-jsdoc": "^6.0.4",
|
"@types/swagger-jsdoc": "^6.0.4",
|
||||||
"@xhayper/discord-rpc": "^1.2.0",
|
"@xhayper/discord-rpc": "^1.2.1",
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.8.4",
|
||||||
"cors": "^2.8.5",
|
|
||||||
"electron-store": "^8.2.0",
|
"electron-store": "^8.2.0",
|
||||||
"express": "^4.21.2",
|
"express": "^4.21.2",
|
||||||
"hotkeys-js": "^3.13.7",
|
"hotkeys-js": "^3.13.9",
|
||||||
"mpris-service": "^2.1.2",
|
"mpris-service": "^2.1.2",
|
||||||
"sass": "^1.79.4",
|
"sass": "1.85.1",
|
||||||
"swagger-ui-express": "^5.0.1"
|
"swagger-ui-express": "^5.0.1",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"request": "^2.88.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@mastermindzh/prettier-config": "^1.0.0",
|
"@mastermindzh/prettier-config": "^1.0.0",
|
||||||
"@types/cors": "^2.8.17",
|
"@types/cors": "^2.8.17",
|
||||||
"@types/express": "^4.17.21",
|
"@types/express": "^4.17.21",
|
||||||
"@types/node": "^20.14.10",
|
"@types/node": "^20.14.10",
|
||||||
|
"@types/request": "^2.48.12",
|
||||||
"@types/swagger-ui-express": "^4.1.6",
|
"@types/swagger-ui-express": "^4.1.6",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.16.0",
|
"@typescript-eslint/eslint-plugin": "^7.16.0",
|
||||||
"@typescript-eslint/parser": "^7.15.0",
|
"@typescript-eslint/parser": "^7.15.0",
|
||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"electron": "git+https://github.com/castlabs/electron-releases#v31.1.0+wvcus",
|
"electron": "github:castlabs/electron-releases#v35.1.1+wvcus",
|
||||||
"electron-builder": "~24.9.4",
|
"electron-builder": "~26.0.12",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"markdown-toc": "^1.2.0",
|
"markdown-toc": "^1.2.0",
|
||||||
|
@@ -22,12 +22,13 @@
|
|||||||
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)',
|
||||||
playingFrom: '*[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']",
|
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"]',
|
||||||
|
@@ -15,6 +15,4 @@ export const globalEvents = {
|
|||||||
toggleFavorite: "toggleFavorite",
|
toggleFavorite: "toggleFavorite",
|
||||||
toggleShuffle: "toggleShuffle",
|
toggleShuffle: "toggleShuffle",
|
||||||
toggleRepeat: "toggleRepeat",
|
toggleRepeat: "toggleRepeat",
|
||||||
axios: "axios",
|
|
||||||
axiosReply: "axiosReply",
|
|
||||||
};
|
};
|
||||||
|
@@ -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.17.0",
|
"version": "5.18.2",
|
||||||
"description": "",
|
"description": "",
|
||||||
"license": {
|
"license": {
|
||||||
"name": "MIT",
|
"name": "MIT",
|
||||||
@@ -21,9 +21,7 @@
|
|||||||
"/current": {
|
"/current": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Get current media info",
|
"summary": "Get current media info",
|
||||||
"tags": [
|
"tags": ["current"],
|
||||||
"current"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Current media info",
|
"description": "Current media info",
|
||||||
@@ -41,9 +39,7 @@
|
|||||||
"/current/image": {
|
"/current/image": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Get current media image",
|
"summary": "Get current media image",
|
||||||
"tags": [
|
"tags": ["current"],
|
||||||
"current"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Current media image",
|
"description": "Current media image",
|
||||||
@@ -65,9 +61,7 @@
|
|||||||
"/player/play": {
|
"/player/play": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Play the current media",
|
"summary": "Play the current media",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -85,9 +79,7 @@
|
|||||||
"/player/favorite/toggle": {
|
"/player/favorite/toggle": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Add the current media to your favorites, or remove it if its already added to your favorites",
|
"summary": "Add the current media to your favorites, or remove it if its already added to your favorites",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -105,9 +97,7 @@
|
|||||||
"/player/pause": {
|
"/player/pause": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Pause the current media",
|
"summary": "Pause the current media",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -125,9 +115,7 @@
|
|||||||
"/player/next": {
|
"/player/next": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Play the next song",
|
"summary": "Play the next song",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -145,9 +133,7 @@
|
|||||||
"/player/previous": {
|
"/player/previous": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Play the previous song",
|
"summary": "Play the previous song",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -165,9 +151,7 @@
|
|||||||
"/player/shuffle/toggle": {
|
"/player/shuffle/toggle": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Play the previous song",
|
"summary": "Play the previous song",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -185,9 +169,7 @@
|
|||||||
"/player/repeat/toggle": {
|
"/player/repeat/toggle": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Toggle the repeat status, toggles between \"off\" , \"single\" and \"all\"",
|
"summary": "Toggle the repeat status, toggles between \"off\" , \"single\" and \"all\"",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -205,9 +187,7 @@
|
|||||||
"/player/playpause": {
|
"/player/playpause": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Start playing the media if paused, or pause the media if playing",
|
"summary": "Start playing the media if paused, or pause the media if playing",
|
||||||
"tags": [
|
"tags": ["player"],
|
||||||
"player"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok",
|
"description": "Ok",
|
||||||
@@ -225,9 +205,7 @@
|
|||||||
"/settings/skipped-artists": {
|
"/settings/skipped-artists": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "get a list of artists that TIDAL Hi-Fi will skip if skipping is enabled",
|
"summary": "get a list of artists that TIDAL Hi-Fi will skip if skipping is enabled",
|
||||||
"tags": [
|
"tags": ["settings"],
|
||||||
"settings"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "The list book.",
|
"description": "The list book.",
|
||||||
@@ -243,9 +221,7 @@
|
|||||||
},
|
},
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Add new artists to the list of skipped artists",
|
"summary": "Add new artists to the list of skipped artists",
|
||||||
"tags": [
|
"tags": ["settings"],
|
||||||
"settings"
|
|
||||||
],
|
|
||||||
"requestBody": {
|
"requestBody": {
|
||||||
"required": true,
|
"required": true,
|
||||||
"content": {
|
"content": {
|
||||||
@@ -266,9 +242,7 @@
|
|||||||
"/settings/skipped-artists/delete": {
|
"/settings/skipped-artists/delete": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Remove artists from the list of skipped artists",
|
"summary": "Remove artists from the list of skipped artists",
|
||||||
"tags": [
|
"tags": ["settings"],
|
||||||
"settings"
|
|
||||||
],
|
|
||||||
"requestBody": {
|
"requestBody": {
|
||||||
"required": true,
|
"required": true,
|
||||||
"content": {
|
"content": {
|
||||||
@@ -289,9 +263,7 @@
|
|||||||
"/settings/skipped-artists/current": {
|
"/settings/skipped-artists/current": {
|
||||||
"post": {
|
"post": {
|
||||||
"summary": "Add the current artist to the list of skipped artists",
|
"summary": "Add the current artist to the list of skipped artists",
|
||||||
"tags": [
|
"tags": ["settings"],
|
||||||
"settings"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok"
|
"description": "Ok"
|
||||||
@@ -300,9 +272,7 @@
|
|||||||
},
|
},
|
||||||
"delete": {
|
"delete": {
|
||||||
"summary": "Remove the current artist from the list of skipped artists",
|
"summary": "Remove the current artist from the list of skipped artists",
|
||||||
"tags": [
|
"tags": ["settings"],
|
||||||
"settings"
|
|
||||||
],
|
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Ok"
|
"description": "Ok"
|
||||||
@@ -313,9 +283,7 @@
|
|||||||
"/image": {
|
"/image": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Get current image",
|
"summary": "Get current image",
|
||||||
"tags": [
|
"tags": ["legacy"],
|
||||||
"legacy"
|
|
||||||
],
|
|
||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@@ -338,9 +306,7 @@
|
|||||||
"/play": {
|
"/play": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Play the current media",
|
"summary": "Play the current media",
|
||||||
"tags": [
|
"tags": ["legacy"],
|
||||||
"legacy"
|
|
||||||
],
|
|
||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@@ -359,9 +325,7 @@
|
|||||||
"/favorite/toggle": {
|
"/favorite/toggle": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Add the current media to your favorites, or remove it if its already added to your favorites",
|
"summary": "Add the current media to your favorites, or remove it if its already added to your favorites",
|
||||||
"tags": [
|
"tags": ["legacy"],
|
||||||
"legacy"
|
|
||||||
],
|
|
||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@@ -380,9 +344,7 @@
|
|||||||
"/pause": {
|
"/pause": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Pause the current media",
|
"summary": "Pause the current media",
|
||||||
"tags": [
|
"tags": ["legacy"],
|
||||||
"legacy"
|
|
||||||
],
|
|
||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@@ -401,9 +363,7 @@
|
|||||||
"/next": {
|
"/next": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Play the next song",
|
"summary": "Play the next song",
|
||||||
"tags": [
|
"tags": ["legacy"],
|
||||||
"legacy"
|
|
||||||
],
|
|
||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@@ -422,9 +382,7 @@
|
|||||||
"/previous": {
|
"/previous": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Play the previous song",
|
"summary": "Play the previous song",
|
||||||
"tags": [
|
"tags": ["legacy"],
|
||||||
"legacy"
|
|
||||||
],
|
|
||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@@ -443,9 +401,7 @@
|
|||||||
"/playpause": {
|
"/playpause": {
|
||||||
"get": {
|
"get": {
|
||||||
"summary": "Toggle play/pause",
|
"summary": "Toggle play/pause",
|
||||||
"tags": [
|
"tags": ["legacy"],
|
||||||
"legacy"
|
|
||||||
],
|
|
||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
@@ -558,10 +514,7 @@
|
|||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"example": [
|
"example": ["Artist1", "Artist2"]
|
||||||
"Artist1",
|
|
||||||
"Artist2"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
17
src/main.ts
17
src/main.ts
@@ -24,10 +24,8 @@ import {
|
|||||||
showSettingsWindow,
|
showSettingsWindow,
|
||||||
} from "./scripts/settings";
|
} from "./scripts/settings";
|
||||||
import { addTray, refreshTray } from "./scripts/tray";
|
import { addTray, refreshTray } from "./scripts/tray";
|
||||||
import { downloadFile } from "./scripts/download";
|
|
||||||
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";
|
||||||
@@ -99,6 +97,7 @@ function createWindow(options = { x: 0, y: 0, backgroundColor: "white" }) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
enable(mainWindow.webContents);
|
enable(mainWindow.webContents);
|
||||||
registerHttpProtocols();
|
registerHttpProtocols();
|
||||||
syncMenuBarWithStore();
|
syncMenuBarWithStore();
|
||||||
@@ -127,6 +126,7 @@ 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,6 +179,7 @@ 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)) {
|
||||||
@@ -189,6 +190,8 @@ app.on("ready", async () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger.log("components ready:", components.status());
|
||||||
|
|
||||||
createWindow();
|
createWindow();
|
||||||
addMenu(mainWindow);
|
addMenu(mainWindow);
|
||||||
createSettingsWindow();
|
createSettingsWindow();
|
||||||
@@ -251,16 +254,6 @@ ipcMain.on(globalEvents.error, (event) => {
|
|||||||
console.log(event);
|
console.log(event);
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.on(globalEvents.axios, (event, fileUrl: string, targetPath: string) => {
|
|
||||||
const download = downloadFile(fileUrl, targetPath);
|
|
||||||
download.then(() => {
|
|
||||||
event.reply(globalEvents.axiosReply, fileUrl, targetPath, false);
|
|
||||||
}).catch(() => {
|
|
||||||
// don't send error information, it isn't used anyways
|
|
||||||
event.reply(globalEvents.axiosReply, fileUrl, targetPath, true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
ipcMain.handle(globalEvents.getUniversalLink, async (event, url) => {
|
ipcMain.handle(globalEvents.getUniversalLink, async (event, url) => {
|
||||||
return SharingService.getUniversalLink(url);
|
return SharingService.getUniversalLink(url);
|
||||||
});
|
});
|
||||||
|
@@ -478,7 +478,7 @@
|
|||||||
<h4>TIDAL Hi-Fi</h4>
|
<h4>TIDAL Hi-Fi</h4>
|
||||||
<div class="about-section__version">
|
<div class="about-section__version">
|
||||||
<a target="_blank" rel="noopener"
|
<a target="_blank" rel="noopener"
|
||||||
href="https://github.com/Mastermindzh/tidal-hifi/releases/tag/5.17.0">5.17.0</a>
|
href="https://github.com/Mastermindzh/tidal-hifi/releases/tag/5.18.2">5.18.2</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="about-section__links">
|
<div class="about-section__links">
|
||||||
<a target="_blank" rel="noopener" href="https://github.com/mastermindzh/tidal-hifi/"
|
<a target="_blank" rel="noopener" href="https://github.com/mastermindzh/tidal-hifi/"
|
||||||
|
@@ -16,7 +16,7 @@ import { convertDurationToSeconds } from "./features/time/parse";
|
|||||||
import { MediaInfo } from "./models/mediaInfo";
|
import { MediaInfo } from "./models/mediaInfo";
|
||||||
import { MediaStatus } from "./models/mediaStatus";
|
import { MediaStatus } from "./models/mediaStatus";
|
||||||
import { RepeatState } from "./models/repeatState";
|
import { RepeatState } from "./models/repeatState";
|
||||||
import { downloadFile } from "./scripts/downloadPreload";
|
import { downloadFile } from "./scripts/download";
|
||||||
import { addHotkey } from "./scripts/hotkeys";
|
import { addHotkey } from "./scripts/hotkeys";
|
||||||
import { ObjectToDotNotation } from "./scripts/objectUtilities";
|
import { ObjectToDotNotation } from "./scripts/objectUtilities";
|
||||||
import { settingsStore } from "./scripts/settings";
|
import { settingsStore } from "./scripts/settings";
|
||||||
@@ -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"]',
|
||||||
@@ -483,6 +483,7 @@ 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(),
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import axios from "axios";
|
import request from "request";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* download and save a file
|
* download and save a file
|
||||||
@@ -8,20 +8,16 @@ import axios from "axios";
|
|||||||
*/
|
*/
|
||||||
export const downloadFile = function (fileUrl: string, targetPath: string) {
|
export const downloadFile = function (fileUrl: string, targetPath: string) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
axios
|
const req = request({
|
||||||
.get(fileUrl, {
|
method: "GET",
|
||||||
responseType: "stream",
|
uri: fileUrl,
|
||||||
})
|
});
|
||||||
.then((res) => {
|
|
||||||
const out = fs.createWriteStream(targetPath);
|
|
||||||
|
|
||||||
res.data.pipe(out);
|
const out = fs.createWriteStream(targetPath);
|
||||||
|
req.pipe(out);
|
||||||
|
|
||||||
out.on("finish", resolve);
|
req.on("end", resolve);
|
||||||
|
|
||||||
out.on("error", reject);
|
req.on("error", reject);
|
||||||
|
|
||||||
res.data.on("error", reject);
|
|
||||||
}).catch(reject);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@@ -1,23 +0,0 @@
|
|||||||
import { ipcRenderer } from "electron";
|
|
||||||
import { globalEvents } from "../constants/globalEvents";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* download and save a file (renderer version)
|
|
||||||
* @param {string} fileUrl url to download
|
|
||||||
* @param {string} targetPath path to save it at
|
|
||||||
*/
|
|
||||||
export const downloadFile = function (fileUrl: string, targetPath: string) {
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
|
||||||
const handler = (event: Electron.IpcRendererEvent, newFileUrl: string, newTargetPath: string, error: boolean) => {
|
|
||||||
// it's possible for 2 requests to be running at the same time, so make sure it is the right one
|
|
||||||
// if there is 2 requests with the same fileUrl and targetPath, then it doesn't matter which one we intercept because the data is the same
|
|
||||||
if (fileUrl === newFileUrl && targetPath === newTargetPath) {
|
|
||||||
ipcRenderer.removeListener(globalEvents.axiosReply, handler);
|
|
||||||
if (error) reject();
|
|
||||||
else resolve();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ipcRenderer.on(globalEvents.axiosReply, handler);
|
|
||||||
ipcRenderer.send(globalEvents.axios, fileUrl, targetPath);
|
|
||||||
});
|
|
||||||
};
|
|
Reference in New Issue
Block a user