mirror of
https://github.com/Mastermindzh/tidal-hifi.git
synced 2025-09-19 10:09:28 +02:00
Compare commits
18 Commits
5.14.1
...
fde7ffc35f
Author | SHA1 | Date | |
---|---|---|---|
|
fde7ffc35f | ||
15cc6bb6d4 | |||
e0e9d99173 | |||
daa797fc00 | |||
|
4e011a47d8 | ||
|
965d19318e | ||
|
403354186e | ||
9cd89c9f31 | |||
|
c7b97a49c4 | ||
c63e05357e | |||
42dac4a7f1 | |||
|
595895dbc1 | ||
1ff94e45a7 | |||
|
95776d1aab | ||
5669cb4c6a | |||
5946c47442 | |||
|
111238f6b2 | ||
|
65a4600c4d |
@@ -131,7 +131,7 @@ nix-env -iA nixpkgs.tidal-hifi
|
|||||||
|
|
||||||
To install and work with the code on this project follow these steps:
|
To install and work with the code on this project follow these steps:
|
||||||
|
|
||||||
- `git clone [https://github.com/Mastermindzh/tidal-hifi.git](https://github.com/Mastermindzh/tidal-hifi.git)`
|
- `git clone https://github.com/Mastermindzh/tidal-hifi.git`
|
||||||
- `cd tidal-hifi`
|
- `cd tidal-hifi`
|
||||||
- `npm install`
|
- `npm install`
|
||||||
- `npm run watch` to watch for auto-reload of Typescript/SCSS changes.
|
- `npm run watch` to watch for auto-reload of Typescript/SCSS changes.
|
||||||
|
47
package-lock.json
generated
47
package-lock.json
generated
@@ -11,7 +11,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "^2.1.2",
|
"@electron/remote": "^2.1.2",
|
||||||
"@types/swagger-jsdoc": "^6.0.4",
|
"@types/swagger-jsdoc": "^6.0.4",
|
||||||
"axios": "^1.6.8",
|
"axios": "^1.7.2",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"discord-rpc": "^4.0.1",
|
"discord-rpc": "^4.0.1",
|
||||||
"electron-store": "^8.2.0",
|
"electron-store": "^8.2.0",
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
"hotkeys-js": "^3.13.7",
|
"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.75.0",
|
"sass": "^1.77.4",
|
||||||
"swagger-ui-express": "^5.0.0"
|
"swagger-ui-express": "^5.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@mastermindzh/prettier-config": "^1.0.0",
|
"@mastermindzh/prettier-config": "^1.0.0",
|
||||||
@@ -2057,9 +2057,10 @@
|
|||||||
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
|
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
|
||||||
},
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "1.6.8",
|
"version": "1.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
|
||||||
"integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
|
"integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"follow-redirects": "^1.15.6",
|
"follow-redirects": "^1.15.6",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
@@ -2235,20 +2236,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/braces": {
|
"node_modules/braces": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fill-range": "^7.0.1"
|
"fill-range": "^7.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/braces/node_modules/fill-range": {
|
"node_modules/braces/node_modules/fill-range": {
|
||||||
"version": "7.0.1",
|
"version": "7.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"to-regex-range": "^5.0.1"
|
"to-regex-range": "^5.0.1"
|
||||||
},
|
},
|
||||||
@@ -7295,9 +7296,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/sass": {
|
"node_modules/sass": {
|
||||||
"version": "1.75.0",
|
"version": "1.77.4",
|
||||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz",
|
"resolved": "https://registry.npmjs.org/sass/-/sass-1.77.4.tgz",
|
||||||
"integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==",
|
"integrity": "sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chokidar": ">=3.0.0 <4.0.0",
|
"chokidar": ">=3.0.0 <4.0.0",
|
||||||
"immutable": "^4.0.0",
|
"immutable": "^4.0.0",
|
||||||
@@ -8164,9 +8166,10 @@
|
|||||||
"integrity": "sha512-fp8SYeEK216KS1/noDvursUOGojEbkvtckOpOmAGZUjlx/ma7VLD2PLQwyermjlzFrlHI5uCt1V+M1C3qBvRyQ=="
|
"integrity": "sha512-fp8SYeEK216KS1/noDvursUOGojEbkvtckOpOmAGZUjlx/ma7VLD2PLQwyermjlzFrlHI5uCt1V+M1C3qBvRyQ=="
|
||||||
},
|
},
|
||||||
"node_modules/swagger-ui-express": {
|
"node_modules/swagger-ui-express": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz",
|
||||||
"integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==",
|
"integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"swagger-ui-dist": ">=5.0.0"
|
"swagger-ui-dist": ">=5.0.0"
|
||||||
},
|
},
|
||||||
@@ -8797,9 +8800,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ws": {
|
"node_modules/ws": {
|
||||||
"version": "7.5.9",
|
"version": "7.5.10",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
|
||||||
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
|
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8.3.0"
|
"node": ">=8.3.0"
|
||||||
},
|
},
|
||||||
|
@@ -42,7 +42,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@electron/remote": "^2.1.2",
|
"@electron/remote": "^2.1.2",
|
||||||
"@types/swagger-jsdoc": "^6.0.4",
|
"@types/swagger-jsdoc": "^6.0.4",
|
||||||
"axios": "^1.6.8",
|
"axios": "^1.7.2",
|
||||||
"cors": "^2.8.5",
|
"cors": "^2.8.5",
|
||||||
"discord-rpc": "^4.0.1",
|
"discord-rpc": "^4.0.1",
|
||||||
"electron-store": "^8.2.0",
|
"electron-store": "^8.2.0",
|
||||||
@@ -50,8 +50,8 @@
|
|||||||
"hotkeys-js": "^3.13.7",
|
"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.75.0",
|
"sass": "^1.77.4",
|
||||||
"swagger-ui-express": "^5.0.0"
|
"swagger-ui-express": "^5.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@mastermindzh/prettier-config": "^1.0.0",
|
"@mastermindzh/prettier-config": "^1.0.0",
|
||||||
|
@@ -3,7 +3,110 @@ import fs from "fs";
|
|||||||
import { mediaInfo } from "../../../scripts/mediaInfo";
|
import { mediaInfo } from "../../../scripts/mediaInfo";
|
||||||
|
|
||||||
export const addCurrentInfo = (expressApp: Router) => {
|
export const addCurrentInfo = (expressApp: Router) => {
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* tags:
|
||||||
|
* name: current
|
||||||
|
* description: The current media info API
|
||||||
|
* components:
|
||||||
|
* schemas:
|
||||||
|
* MediaInfo:
|
||||||
|
* type: object
|
||||||
|
* properties:
|
||||||
|
* title:
|
||||||
|
* type: string
|
||||||
|
* artists:
|
||||||
|
* type: string
|
||||||
|
* album:
|
||||||
|
* type: string
|
||||||
|
* icon:
|
||||||
|
* type: string
|
||||||
|
* format: uri
|
||||||
|
* playingFrom:
|
||||||
|
* type: string
|
||||||
|
* status:
|
||||||
|
* type: string
|
||||||
|
* url:
|
||||||
|
* type: string
|
||||||
|
* format: uri
|
||||||
|
* current:
|
||||||
|
* type: string
|
||||||
|
* currentInSeconds:
|
||||||
|
* type: integer
|
||||||
|
* duration:
|
||||||
|
* type: string
|
||||||
|
* durationInSeconds:
|
||||||
|
* type: integer
|
||||||
|
* image:
|
||||||
|
* type: string
|
||||||
|
* format: uri
|
||||||
|
* favorite:
|
||||||
|
* type: boolean
|
||||||
|
* player:
|
||||||
|
* type: object
|
||||||
|
* properties:
|
||||||
|
* status:
|
||||||
|
* type: string
|
||||||
|
* shuffle:
|
||||||
|
* type: boolean
|
||||||
|
* repeat:
|
||||||
|
* type: string
|
||||||
|
* artist:
|
||||||
|
* type: string
|
||||||
|
* example:
|
||||||
|
* title: "Sample Title"
|
||||||
|
* artists: "Sample Artist"
|
||||||
|
* album: "Sample Album"
|
||||||
|
* icon: "/path/to/sample/icon.jpg"
|
||||||
|
* playingFrom: "Sample Playlist"
|
||||||
|
* status: "playing"
|
||||||
|
* url: "https://tidal.com/browse/track/sample"
|
||||||
|
* current: "1:23"
|
||||||
|
* currentInSeconds: 83
|
||||||
|
* duration: "3:45"
|
||||||
|
* durationInSeconds: 225
|
||||||
|
* image: "https://example.com/sample-image.jpg"
|
||||||
|
* favorite: true
|
||||||
|
* player:
|
||||||
|
* status: "playing"
|
||||||
|
* shuffle: true
|
||||||
|
* repeat: "one"
|
||||||
|
* artist: "Sample Artist"
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /current:
|
||||||
|
* get:
|
||||||
|
* summary: Get current media info
|
||||||
|
* tags: [current]
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Current media info
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* $ref: '#/components/schemas/MediaInfo'
|
||||||
|
*/
|
||||||
expressApp.get("/current", (req, res) => res.json({ ...mediaInfo, artist: mediaInfo.artists }));
|
expressApp.get("/current", (req, res) => res.json({ ...mediaInfo, artist: mediaInfo.artists }));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /current/image:
|
||||||
|
* get:
|
||||||
|
* summary: Get current media image
|
||||||
|
* tags: [current]
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Current media image
|
||||||
|
* content:
|
||||||
|
* image/png:
|
||||||
|
* schema:
|
||||||
|
* type: string
|
||||||
|
* format: binary
|
||||||
|
* 404:
|
||||||
|
* description: Not found
|
||||||
|
*/
|
||||||
expressApp.get("/current/image", getCurrentImage);
|
expressApp.get("/current/image", getCurrentImage);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
||||||
import { BrowserWindow } from "electron";
|
import { BrowserWindow } from "electron";
|
||||||
import { Router } from "express";
|
import { Router } from "express";
|
||||||
import { globalEvents } from "../../../constants/globalEvents";
|
import { globalEvents } from "../../../constants/globalEvents";
|
||||||
@@ -12,19 +11,113 @@ export const addPlaybackControl = (expressApp: Router, mainWindow: BrowserWindow
|
|||||||
const windowEvent = handleWindowEvent(mainWindow);
|
const windowEvent = handleWindowEvent(mainWindow);
|
||||||
const createRoute = (route: string) => `/player${route}`;
|
const createRoute = (route: string) => `/player${route}`;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* tags:
|
||||||
|
* name: player
|
||||||
|
* description: The player control API
|
||||||
|
* components:
|
||||||
|
* schemas:
|
||||||
|
* OkResponse:
|
||||||
|
* type: string
|
||||||
|
* example: "OK"
|
||||||
|
*/
|
||||||
const createPlayerAction = (route: string, action: string) => {
|
const createPlayerAction = (route: string, action: string) => {
|
||||||
expressApp.post(createRoute(route), (req, res) => windowEvent(res, action));
|
expressApp.post(createRoute(route), (req, res) => windowEvent(res, action));
|
||||||
};
|
};
|
||||||
|
|
||||||
if (settingsStore.get(settings.playBackControl)) {
|
if (settingsStore.get(settings.playBackControl)) {
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /play:
|
||||||
|
* get:
|
||||||
|
* summary: Play action
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Action performed
|
||||||
|
* content:
|
||||||
|
* text/plain:
|
||||||
|
* schema:
|
||||||
|
* $ref: '#/components/schemas/OkResponse'
|
||||||
|
*/
|
||||||
createPlayerAction("/play", globalEvents.play);
|
createPlayerAction("/play", globalEvents.play);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /favorite/toggle:
|
||||||
|
* post:
|
||||||
|
* summary: Toggle favorite
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Action performed
|
||||||
|
* content:
|
||||||
|
* text/plain:
|
||||||
|
* schema:
|
||||||
|
* $ref: '#/components/schemas/OkResponse'
|
||||||
|
*/
|
||||||
createPlayerAction("/favorite/toggle", globalEvents.toggleFavorite);
|
createPlayerAction("/favorite/toggle", globalEvents.toggleFavorite);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /pause:
|
||||||
|
* get:
|
||||||
|
* summary: Pause action
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Action performed
|
||||||
|
* content:
|
||||||
|
* text/plain:
|
||||||
|
* schema:
|
||||||
|
* $ref: '#/components/schemas/OkResponse'
|
||||||
|
*/
|
||||||
createPlayerAction("/pause", globalEvents.pause);
|
createPlayerAction("/pause", globalEvents.pause);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /next:
|
||||||
|
* get:
|
||||||
|
* summary: Next action
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Action performed
|
||||||
|
* content:
|
||||||
|
* text/plain:
|
||||||
|
* schema:
|
||||||
|
* $ref: '#/components/schemas/OkResponse'
|
||||||
|
*/
|
||||||
createPlayerAction("/next", globalEvents.next);
|
createPlayerAction("/next", globalEvents.next);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /previous:
|
||||||
|
* get:
|
||||||
|
* summary: Previous action
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Action performed
|
||||||
|
* content:
|
||||||
|
* text/plain:
|
||||||
|
* schema:
|
||||||
|
* $ref: '#/components/schemas/OkResponse'
|
||||||
|
*/
|
||||||
createPlayerAction("/previous", globalEvents.previous);
|
createPlayerAction("/previous", globalEvents.previous);
|
||||||
|
|
||||||
createPlayerAction("/shuffle/toggle", globalEvents.toggleShuffle);
|
createPlayerAction("/shuffle/toggle", globalEvents.toggleShuffle);
|
||||||
createPlayerAction("/repeat/toggle", globalEvents.toggleRepeat);
|
createPlayerAction("/repeat/toggle", globalEvents.toggleRepeat);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /playpause:
|
||||||
|
* get:
|
||||||
|
* summary: Toggle play/pause
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Action performed
|
||||||
|
* content:
|
||||||
|
* text/plain:
|
||||||
|
* schema:
|
||||||
|
* $ref: '#/components/schemas/OkResponse'
|
||||||
|
*/
|
||||||
expressApp.post(createRoute("/playpause"), (req, res) => {
|
expressApp.post(createRoute("/playpause"), (req, res) => {
|
||||||
if (mediaInfo.status === MediaStatus.playing) {
|
if (mediaInfo.status === MediaStatus.playing) {
|
||||||
windowEvent(res, globalEvents.pause);
|
windowEvent(res, globalEvents.pause);
|
||||||
|
@@ -13,6 +13,23 @@ import { getCurrentImage } from "./features/current";
|
|||||||
* @param mainWindow
|
* @param mainWindow
|
||||||
*/
|
*/
|
||||||
export const addLegacyApi = (expressApp: Router, mainWindow: BrowserWindow) => {
|
export const addLegacyApi = (expressApp: Router, mainWindow: BrowserWindow) => {
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /image:
|
||||||
|
* get:
|
||||||
|
* summary: Get current image
|
||||||
|
* deprecated: true
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Current image
|
||||||
|
* content:
|
||||||
|
* image/png:
|
||||||
|
* schema:
|
||||||
|
* type: string
|
||||||
|
* format: binary
|
||||||
|
* 404:
|
||||||
|
* description: Not found
|
||||||
|
*/
|
||||||
expressApp.get("/image", getCurrentImage);
|
expressApp.get("/image", getCurrentImage);
|
||||||
|
|
||||||
if (settingsStore.get(settings.playBackControl)) {
|
if (settingsStore.get(settings.playBackControl)) {
|
||||||
|
@@ -18,6 +18,152 @@
|
|||||||
"url": "swagger.json"
|
"url": "swagger.json"
|
||||||
},
|
},
|
||||||
"paths": {
|
"paths": {
|
||||||
|
"/current": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Get current media info",
|
||||||
|
"tags": [
|
||||||
|
"current"
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Current media info",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/MediaInfo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/current/image": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Get current media image",
|
||||||
|
"tags": [
|
||||||
|
"current"
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Current media image",
|
||||||
|
"content": {
|
||||||
|
"image/png": {
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "binary"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not found"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/play": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Play action",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Action performed",
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/OkResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/favorite/toggle": {
|
||||||
|
"post": {
|
||||||
|
"summary": "Toggle favorite",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Action performed",
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/OkResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/pause": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Pause action",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Action performed",
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/OkResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/next": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Next action",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Action performed",
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/OkResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/previous": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Previous action",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Action performed",
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/OkResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/playpause": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Toggle play/pause",
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Action performed",
|
||||||
|
"content": {
|
||||||
|
"text/plain": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/OkResponse"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"/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",
|
||||||
@@ -105,10 +251,121 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"/image": {
|
||||||
|
"get": {
|
||||||
|
"summary": "Get current image",
|
||||||
|
"deprecated": true,
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "Current image",
|
||||||
|
"content": {
|
||||||
|
"image/png": {
|
||||||
|
"schema": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "binary"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not found"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"components": {
|
"components": {
|
||||||
"schemas": {
|
"schemas": {
|
||||||
|
"MediaInfo": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"title": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"artists": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"album": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"icon": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uri"
|
||||||
|
},
|
||||||
|
"playingFrom": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uri"
|
||||||
|
},
|
||||||
|
"current": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"currentInSeconds": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"duration": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"durationInSeconds": {
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "uri"
|
||||||
|
},
|
||||||
|
"favorite": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"player": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"status": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"shuffle": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"repeat": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"artist": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"example": {
|
||||||
|
"title": "Sample Title",
|
||||||
|
"artists": "Sample Artist",
|
||||||
|
"album": "Sample Album",
|
||||||
|
"icon": "/path/to/sample/icon.jpg",
|
||||||
|
"playingFrom": "Sample Playlist",
|
||||||
|
"status": "playing",
|
||||||
|
"url": "https://tidal.com/browse/track/sample",
|
||||||
|
"current": "1:23",
|
||||||
|
"currentInSeconds": 83,
|
||||||
|
"duration": "3:45",
|
||||||
|
"durationInSeconds": 225,
|
||||||
|
"image": "https://example.com/sample-image.jpg",
|
||||||
|
"favorite": true,
|
||||||
|
"player": {
|
||||||
|
"status": "playing",
|
||||||
|
"shuffle": true,
|
||||||
|
"repeat": "one"
|
||||||
|
},
|
||||||
|
"artist": "Sample Artist"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"OkResponse": {
|
||||||
|
"type": "string",
|
||||||
|
"example": "OK"
|
||||||
|
},
|
||||||
"StringArray": {
|
"StringArray": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
@@ -122,6 +379,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
|
{
|
||||||
|
"name": "current",
|
||||||
|
"description": "The current media info API"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "player",
|
||||||
|
"description": "The player control API"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "settings",
|
"name": "settings",
|
||||||
"description": "The settings management API"
|
"description": "The settings management API"
|
||||||
|
Reference in New Issue
Block a user