Compare commits

...

24 Commits

Author SHA1 Message Date
6385375fd6 Merge branch 'master' of github.com:Mastermindzh/tidal-hifi into feature/tidalControllers 2025-04-18 14:53:12 +02:00
8fc49f500e
Merge pull request #577 from Mastermindzh/snyk-upgrade-b144be84df6292449bfe4eacd9662b97
[Snyk] Upgrade sass from 1.79.4 to 1.85.1
2025-04-18 14:50:52 +02:00
snyk-bot
49f5a01b58
fix: upgrade sass from 1.79.4 to 1.85.1
Snyk has created this PR to upgrade sass from 1.79.4 to 1.85.1.

See this package in npm:
sass

See this project in Snyk:
https://app.snyk.io/org/mastermindzh/project/dade8f03-2064-49a3-8957-edbacec3887c?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-04-05 07:45:32 +00:00
48f4fe47ef
Merge pull request #573 from Mastermindzh/next
Next
2025-03-30 13:10:28 +02:00
a819e1eb45 removing mac/win builds, they aren't targetted anyway 2025-03-30 12:52:48 +02:00
57e6342b5f Merge branch 'next' of github.com:Mastermindzh/tidal-hifi into next 2025-03-30 12:50:31 +02:00
58a543a3c8 fixed .desktop file 2025-03-30 12:50:27 +02:00
1c915d99fe
Merge pull request #572 from QF0xB/fix/nix-build-temporarily
Reverted sass to 1.79.4
2025-03-30 12:49:29 +02:00
Quirin Brändli
8994360415
Reverted sass to 1.79.4 2025-03-30 00:06:46 +01:00
a5c0d9e6e8
Merge pull request #570 from Mastermindzh/fix/login
Fix/login
2025-03-29 20:45:40 +01:00
f8eb36f4c7 bumped versions 2025-03-29 17:12:28 +01:00
5ca90c25d3 update builder to v35 as well 2025-03-29 17:05:17 +01:00
cf86969cfc updated builder, removed abstract-socket 2025-03-29 16:27:24 +01:00
afd05ae88b updated electron, deps, and moved remote calls after start 2025-03-29 15:58:28 +01:00
72c25dfdc1
Merge pull request #564 from Mastermindzh/snyk-fix-1995dd90a05e86ea7c2e4f0f7a284930
[Snyk] Security upgrade @xhayper/discord-rpc from 1.2.0 to 1.2.1
2025-03-23 21:32:20 +01:00
snyk-bot
25b30edf31
fix: package.json & package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-UNDICI-8641354
2025-03-22 08:54:58 +00:00
a08fad421a Merge branch 'master' of github.com:Mastermindzh/tidal-hifi into feature/tidalControllers 2025-03-18 10:55:07 +01:00
35ed4807e3
Merge pull request #558 from Mastermindzh/next
Next
2025-03-18 09:10:40 +01:00
deff9524a8 album & playingfrom info added to mediaInfo again. fixes #548 2025-03-17 11:05:10 +01:00
34c7777eeb
Merge pull request #554 from Dianoga/duration-fix
fix duration selector
2025-03-17 10:27:42 +01:00
048e949f30 Merge branch 'master' of github.com:Mastermindzh/tidal-hifi into next 2025-03-17 09:54:06 +01:00
Brian Steere
4a976bc58c
fix duration selector
Should fix the MPRIS issue as long as duration doesn't break again.
2025-03-12 14:21:13 -05:00
aaf7a1b662
Merge pull request #504 from darkiox/master
Fix Discord RPC Timestamp jitter
2024-12-09 11:21:27 +01:00
Darkiox
a3aa45a96b fix: discord rpc timestamp jitter 2024-11-25 19:15:26 -03:00
12 changed files with 3686 additions and 2099 deletions

View File

@ -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

View File

@ -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/

View File

@ -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)

View File

@ -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:

4540
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -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",
@ -43,16 +43,16 @@
"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.9", "hotkeys-js": "^3.13.9",
"mpris-service": "^2.1.2", "mpris-service": "^2.1.2",
"request": "^2.88.2", "sass": "1.85.1",
"sass": "^1.79.4", "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",
@ -64,8 +64,8 @@
"@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",

View File

@ -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"]',

View File

@ -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"
]
} }
} }
}, },

View File

@ -26,7 +26,6 @@ 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";
@ -98,6 +97,7 @@ function createWindow(options = { x: 0, y: 0, backgroundColor: "white" }) {
}, },
}, },
}); });
enable(mainWindow.webContents); enable(mainWindow.webContents);
registerHttpProtocols(); registerHttpProtocols();
syncMenuBarWithStore(); syncMenuBarWithStore();
@ -126,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);
@ -178,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)) {
@ -188,6 +190,8 @@ app.on("ready", async () => {
}); });
} }
Logger.log("components ready:", components.status());
createWindow(); createWindow();
addMenu(mainWindow); addMenu(mainWindow);
createSettingsWindow(); createSettingsWindow();

View File

@ -1,34 +1,25 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<title>Tidal Hi-Fi settings</title> <title>Tidal Hi-Fi settings</title>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" />
<link rel="stylesheet" href="./settings.css" /> <link rel="stylesheet" href="./settings.css" />
<link <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
/>
</head> </head>
<body class="settings-window"> <body class="settings-window">
<div class="settings-window__wrapper"> <div class="settings-window__wrapper">
<div class="settings-window__drag-area"></div> <div class="settings-window__drag-area"></div>
<a id="close" class="settings-window__close-button" title="Close settings"> <a id="close" class="settings-window__close-button" title="Close settings">
<svg <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 348.333 348.334" class="settings-window__svg-icon">
xmlns="http://www.w3.org/2000/svg" <path fill="white" d="M336.559,68.611L231.016,174.165l105.543,105.549c15.699,15.705,15.699,41.145,0,56.85
viewBox="0 0 348.333 348.334"
class="settings-window__svg-icon"
>
<path
fill="white"
d="M336.559,68.611L231.016,174.165l105.543,105.549c15.699,15.705,15.699,41.145,0,56.85
c-7.844,7.844-18.128,11.769-28.407,11.769c-10.296,0-20.581-3.919-28.419-11.769L174.167,231.003L68.609,336.563 c-7.844,7.844-18.128,11.769-28.407,11.769c-10.296,0-20.581-3.919-28.419-11.769L174.167,231.003L68.609,336.563
c-7.843,7.844-18.128,11.769-28.416,11.769c-10.285,0-20.563-3.919-28.413-11.769c-15.699-15.698-15.699-41.139,0-56.85 c-7.843,7.844-18.128,11.769-28.416,11.769c-10.285,0-20.563-3.919-28.413-11.769c-15.699-15.698-15.699-41.139,0-56.85
l105.54-105.549L11.774,68.611c-15.699-15.699-15.699-41.145,0-56.844c15.696-15.687,41.127-15.687,56.829,0l105.563,105.554 l105.54-105.549L11.774,68.611c-15.699-15.699-15.699-41.145,0-56.844c15.696-15.687,41.127-15.687,56.829,0l105.563,105.554
L279.721,11.767c15.705-15.687,41.139-15.687,56.832,0C352.258,27.466,352.258,52.912,336.559,68.611z" L279.721,11.767c15.705-15.687,41.139-15.687,56.832,0C352.258,27.466,352.258,52.912,336.559,68.611z" />
/>
</svg> </svg>
</a> </a>
@ -75,13 +66,7 @@
<span class="switch__slider"></span> <span class="switch__slider"></span>
</label> </label>
</div> </div>
<textarea <textarea id="skippedArtists" class="textarea" cols="40" rows="5" spellcheck="false"></textarea>
id="skippedArtists"
class="textarea"
cols="40"
rows="5"
spellcheck="false"
></textarea>
<div class="group__option"> <div class="group__option">
<div class="group__description"> <div class="group__description">
<h4>Block ads</h4> <h4>Block ads</h4>
@ -149,9 +134,7 @@
<h4>Hotkeys</h4> <h4>Hotkeys</h4>
<p> <p>
Enable extra hotkeys to achieve feature parity with the Enable extra hotkeys to achieve feature parity with the
<a class="external-link" data-url="https://defkey.com/tidal-desktop-shortcuts" <a class="external-link" data-url="https://defkey.com/tidal-desktop-shortcuts">desktop apps</a>.
>desktop apps</a
>.
</p> </p>
</div> </div>
<label class="switch"> <label class="switch">
@ -272,12 +255,7 @@
<div class="group__description"> <div class="group__description">
<h4>Idle Text</h4> <h4>Idle Text</h4>
<p>The text displayed on Discord's rich presence while idling in the app.</p> <p>The text displayed on Discord's rich presence while idling in the app.</p>
<input <input id="discord_idle_text" type="text" class="text-input" name="discord_idle_text" />
id="discord_idle_text"
type="text"
class="text-input"
name="discord_idle_text"
/>
</div> </div>
</div> </div>
@ -287,12 +265,7 @@
<p> <p>
The text displayed on Discord's rich presence while "showSong" is turned off The text displayed on Discord's rich presence while "showSong" is turned off
</p> </p>
<input <input id="discord_using_text" type="text" class="text-input" name="discord_using_text" />
id="discord_using_text"
type="text"
class="text-input"
name="discord_using_text"
/>
</div> </div>
</div> </div>
@ -323,12 +296,7 @@
<div class="group__description"> <div class="group__description">
<h4>Details prefix</h4> <h4>Details prefix</h4>
<p>Prefix for the "details" field of Discord's rich presence.</p> <p>Prefix for the "details" field of Discord's rich presence.</p>
<input <input id="discord_details_prefix" type="text" class="text-input" name="discord_details_prefix" />
id="discord_details_prefix"
type="text"
class="text-input"
name="discord_details_prefix"
/>
</div> </div>
</div> </div>
@ -336,12 +304,7 @@
<div class="group__description"> <div class="group__description">
<h4>Button text</h4> <h4>Button text</h4>
<p>Text to display on the button below the media information.</p> <p>Text to display on the button below the media information.</p>
<input <input id="discord_button_text" type="text" class="text-input" name="discord_button_text" />
id="discord_button_text"
type="text"
class="text-input"
name="discord_button_text"
/>
</div> </div>
</div> </div>
</div> </div>
@ -367,24 +330,14 @@
There are multiple instances for ListenBrainz you can set the corresponding There are multiple instances for ListenBrainz you can set the corresponding
API url below. API url below.
</p> </p>
<input <input id="ListenBrainzAPI" type="text" class="text-input" name="ListenBrainzAPI" />
id="ListenBrainzAPI"
type="text"
class="text-input"
name="ListenBrainzAPI"
/>
</div> </div>
</div> </div>
<div class="group__option"> <div class="group__option">
<div class="group__description"> <div class="group__description">
<h4>ListenBrainz User Token</h4> <h4>ListenBrainz User Token</h4>
<p>Provide the user token you can get from the settings page.</p> <p>Provide the user token you can get from the settings page.</p>
<input <input id="ListenBrainzToken" type="text" class="text-input" name="ListenBrainzToken" />
id="ListenBrainzToken"
type="text"
class="text-input"
name="ListenBrainzToken"
/>
</div> </div>
</div> </div>
</div> </div>
@ -394,12 +347,7 @@
The delay (in ms) to send a listen to ListenBrainz. Prevents spamming the API when The delay (in ms) to send a listen to ListenBrainz. Prevents spamming the API when
you fast forward immediately you fast forward immediately
</p> </p>
<input <input id="listenbrainz_delay" type="number" class="text-input" name="listenbrainz_delay" />
id="listenbrainz_delay"
type="number"
class="text-input"
name="listenbrainz_delay"
/>
</div> </div>
</div> </div>
</section> </section>
@ -415,12 +363,7 @@
info by scraping the website. The default of 500 seems to work in more cases but info by scraping the website. The default of 500 seems to work in more cases but
if you are fine with a bit more resource usage you can decrease it as well. if you are fine with a bit more resource usage you can decrease it as well.
</p> </p>
<input <input id="updateFrequency" type="number" class="text-input" name="updateFrequency" />
id="updateFrequency"
type="number"
class="text-input"
name="updateFrequency"
/>
</div> </div>
</div> </div>
@ -506,13 +449,7 @@
</div> </div>
</div> </div>
</div> </div>
<textarea <textarea id="customCSS" class="textarea" cols="40" rows="8" spellcheck="false"></textarea>
id="customCSS"
class="textarea"
cols="40"
rows="8"
spellcheck="false"
></textarea>
<div class="group"> <div class="group">
<p class="group__title">Theme files</p> <p class="group__title">Theme files</p>
@ -537,13 +474,7 @@
<div> <div>
<span class="file-btn">Choose files</span> <span class="file-btn">Choose files</span>
<span id="file-message" class="file-msg">or drag and drop files here</span> <span id="file-message" class="file-msg">or drag and drop files here</span>
<input <input id="theme-files" class="file-input" type="file" accept=".css" multiple />
id="theme-files"
class="file-input"
type="file"
accept=".css"
multiple
/>
</div> </div>
</div> </div>
</div> </div>
@ -555,35 +486,17 @@
<img alt="tidal icon" class="about-section__icon" src="./icon.png" /> <img alt="tidal icon" class="about-section__icon" src="./icon.png" />
<h4>TIDAL Hi-Fi</h4> <h4>TIDAL Hi-Fi</h4>
<div class="about-section__version"> <div class="about-section__version">
<a <a target="_blank" rel="noopener"
target="_blank" href="https://github.com/Mastermindzh/tidal-hifi/releases/tag/5.18.2">5.18.2</a>
rel="noopener"
href="https://github.com/Mastermindzh/tidal-hifi/releases/tag/5.17.0"
>5.17.0</a
>
</div> </div>
<div class="about-section__links"> <div class="about-section__links">
<a <a target="_blank" rel="noopener" href="https://github.com/mastermindzh/tidal-hifi/"
target="_blank" class="about-section__button">Github
rel="noopener" <i class="fa fa-external-link"></i></a>
href="https://github.com/mastermindzh/tidal-hifi/" <a target="_blank" rel="noopener" href="https://github.com/Mastermindzh/tidal-hifi/issues"
class="about-section__button" class="about-section__button">Report an issue <i class="fa fa-external-link"></i></a>
>Github <i class="fa fa-external-link"></i <a target="_blank" rel="noopener" href="https://github.com/Mastermindzh/tidal-hifi/graphs/contributors"
></a> class="about-section__button">Contributors <i class="fa fa-external-link"></i></a>
<a
target="_blank"
rel="noopener"
href="https://github.com/Mastermindzh/tidal-hifi/issues"
class="about-section__button"
>Report an issue <i class="fa fa-external-link"></i
></a>
<a
target="_blank"
rel="noopener"
href="https://github.com/Mastermindzh/tidal-hifi/graphs/contributors"
class="about-section__button"
>Contributors <i class="fa fa-external-link"></i
></a>
</div> </div>
</section> </section>
@ -596,4 +509,5 @@
</main> </main>
</div> </div>
</body> </body>
</html> </html>

View File

@ -313,6 +313,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": convertDurationToSeconds(mediaInfo.duration) * 1000 * 1000, "mpris:length": convertDurationToSeconds(mediaInfo.duration) * 1000 * 1000,
"mpris:trackid": "/org/mpris/MediaPlayer2/track/" + tidalController.getTrackId(), "mpris:trackid": "/org/mpris/MediaPlayer2/track/" + tidalController.getTrackId(),

View File

@ -103,8 +103,7 @@ 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 date = new Date(); const now = Math.trunc((Date.now() + 500) / 1000);
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;
} }