mirror of
https://github.com/Mastermindzh/tidal-hifi.git
synced 2025-09-10 22:04:53 +02:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
9ca3d3b37d | |||
fb9082e995 | |||
87a4ff3fc5 | |||
1e5b7d61f5 | |||
8177e6e3ca | |||
9f26db22fc | |||
e2ea4d13c4 | |||
c222113cf1 | |||
bdab6c3a17 | |||
813beec863 | |||
591d42b31a | |||
beacedd64b | |||
|
e13af7a2d5 | ||
73cba7f761 | |||
71208bbf81 | |||
ef37478788 | |||
c411c2cf85 | |||
|
b6185c3e12 | ||
|
c90902e9a9 | ||
e72b607f29 |
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
||||
- uses: actions/upload-artifact@master
|
||||
with:
|
||||
name: mac-builds
|
||||
path: dist/
|
||||
path: ./dist/
|
||||
|
||||
build_on_win:
|
||||
runs-on: windows-latest
|
||||
|
39
CHANGELOG.md
Normal file
39
CHANGELOG.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## 2.0.0
|
||||
|
||||
### Breaking changes
|
||||
|
||||
- Changed settings hotkey from "ctrl+/" to "ctrl+=" to avoid a conflict with the default Tidal hotkeys
|
||||
|
||||
## Other changes
|
||||
|
||||
- Added a setting to disable custom hotkeys
|
||||
- Fixed the bug that the previous song hotkey would register 3 times. (Twice due to a duplicate block of code + once from the default tidal hotkey)
|
||||
|
||||
## 1.3.0
|
||||
|
||||
-- re-enabled mpris-service wit the electron downloader fixes
|
||||
|
||||
## 1.2.0
|
||||
|
||||
- Added the ability to disable the tray icon
|
||||
|
||||
## 1.1.1
|
||||
|
||||
Bugfixes:
|
||||
|
||||
- Arch AUR install failed before, it is fixed now by using the included build scripts
|
||||
|
||||
## 1.1.0
|
||||
|
||||
- updated to electron 8.0.0
|
||||
- Added a beta-version of the mpris service
|
||||
|
||||
- Bugfixes:
|
||||
- icon on gnome not showing in launcher
|
||||
- app not remembering size on startup
|
49
README.md
49
README.md
@@ -13,12 +13,19 @@ The web version of [listen.tidal.com](listen.tidal.com) running in electron with
|
||||
|
||||
- [Installation](#installation)
|
||||
- [Using releases](#using-releases)
|
||||
- [Snap install](#snap-install)
|
||||
- [Arch Linux](#arch-linux)
|
||||
- [Using source](#using-source)
|
||||
- [features](#features)
|
||||
- [Integrations](#integrations)
|
||||
- [Known bugs](#known-bugs)
|
||||
- [Why](#why)
|
||||
- [Why not extend existing projects?](#why-not-extend-existing-projects)
|
||||
- [Special thanks to..](#special-thanks-to)
|
||||
- [Special thanks to...](#special-thanks-to)
|
||||
- [Buy me a coffee? Please don't](#buy-me-a-coffee-please-dont)
|
||||
- [Images](#images)
|
||||
- [settings window](#settings-window)
|
||||
- [user setups](#user-setups)
|
||||
|
||||
<!-- tocstop -->
|
||||
|
||||
@@ -28,6 +35,22 @@ The web version of [listen.tidal.com](listen.tidal.com) running in electron with
|
||||
|
||||
Various packaged versions of the software are available on the [releases](https://github.com/Mastermindzh/tidal-hifi/releases) tab.
|
||||
|
||||
#### Snap install
|
||||
|
||||
To install with `snap` you need to download the pre-packaged snap-package from this repository, found under releases:
|
||||
|
||||
1. Download:
|
||||
|
||||
```sh
|
||||
wget <URI> #for instance: https://github.com/Mastermindzh/tidal-hifi/releases/download/1.0/tidal-hifi_1.0.0_amd64.snap
|
||||
```
|
||||
|
||||
2. Install:
|
||||
|
||||
```sh
|
||||
snap install --dangerous <path> #for instance: tidal-hifi_1.0.0_amd64.snap
|
||||
```
|
||||
|
||||
### Arch Linux
|
||||
|
||||
Arch Linux users can use the AUR to install tidal-hifi:
|
||||
@@ -49,16 +72,16 @@ To install and work with the code on this project follow these steps:
|
||||
|
||||
- HiFi playback
|
||||
- Notifications
|
||||
- Shortcuts ([source](https://defkey.com/tidal-desktop-shortcuts))
|
||||
- Custom hotkeys ([source](https://defkey.com/tidal-desktop-shortcuts))
|
||||
- API for status and playback
|
||||
- [Settings feature](./docs/settings.png) to disable certain functionality. (`ctrl+/`)
|
||||
- Tray(/mini) player (coming soon)
|
||||
- [Settings feature](./docs/settings.png) to disable certain functionality. (`ctrl+=`)
|
||||
|
||||
## Integrations
|
||||
|
||||
- [i3 blocks config](https://github.com/Mastermindzh/dotfiles/commit/9714b2fa1d670108ce811d5511fd3b7a43180647) - My dotfiles where I use this app to fetch currently playing music (direct commit)
|
||||
|
||||
### Known bugs
|
||||
|
||||
- [Last.fm login doesn't work](https://github.com/Mastermindzh/tidal-hifi/issues/4).
|
||||
|
||||
## Why
|
||||
@@ -78,7 +101,23 @@ Whilst there are a handful of projects attempting to run Tidal on Electron they
|
||||
|
||||
Sometimes it's just easier to start over, cover my own needs and then making it available to the public :)
|
||||
|
||||
## Special thanks to..
|
||||
## Special thanks to...
|
||||
|
||||
- [Castlabs](https://castlabs.com/)
|
||||
For maintaining Electron with Widevine CDM installation, Verified Media Path (VMP), and persistent licenses (StorageID)
|
||||
|
||||
## Buy me a coffee? Please don't
|
||||
|
||||
Instead spend some money on a charity I care for: [kwf.nl](secure.kwf.nl/donation).
|
||||
Inspired by [haydenjames' issue](https://github.com/Mastermindzh/tidal-hifi/issues/27#issuecomment-704198429)
|
||||
|
||||
## Images
|
||||
|
||||
### settings window
|
||||
|
||||

|
||||
|
||||
### user setups
|
||||
|
||||
Some of our users are kind enough to share their usage pictures.
|
||||
If you want to see them or possibly even add one please do so in the following issue: [#3 - image thread](https://github.com/Mastermindzh/tidal-hifi/issues/3).
|
||||
|
BIN
assets/TIDAL.icns
Executable file
BIN
assets/TIDAL.icns
Executable file
Binary file not shown.
6
build/electron-builder.rpm.yml
Normal file
6
build/electron-builder.rpm.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
extends: ./build/electron-builder.yml
|
||||
linux:
|
||||
category: Audio
|
||||
icon: ./assets/TIDAL.icns
|
||||
target:
|
||||
- rpm
|
@@ -1,5 +1,7 @@
|
||||
appId: com.rickvanlieshout.tidal-hifi
|
||||
electronVersion: 8.5.2
|
||||
electronDownload:
|
||||
version: 8.5.2-wvvmp
|
||||
mirror: https://github.com/castlabs/electron-releases/releases/download/v
|
||||
snap:
|
||||
plugs:
|
||||
@@ -11,8 +13,23 @@ linux:
|
||||
# - pacman
|
||||
- tar.gz
|
||||
- deb
|
||||
- rpm
|
||||
- AppImage
|
||||
- snap
|
||||
- freebsd
|
||||
executableName: tidal-hifi
|
||||
desktop:
|
||||
Encoding: UTF-8
|
||||
Name: tidal-hifi
|
||||
GenericName: tidal-hifi
|
||||
Comment: The web version of listen.tidal.com running in electron with hifi support thanks to widevine.
|
||||
Icon: assets/icon.png
|
||||
StartupNotify: true
|
||||
Terminal: false
|
||||
Type: Application
|
||||
Categories: Network;Application;Audio;Video
|
||||
StartupWMClass: tidal-hifi
|
||||
X-PulseAudio-Properties: media.role=music
|
||||
mac:
|
||||
category: public.app-category.entertainment
|
||||
win:
|
||||
|
@@ -1,6 +1,6 @@
|
||||
pkgbase = tidal-hifi-git
|
||||
pkgdesc = The web version of listen.tidal.com running in electron with hifi support thanks to widevine.
|
||||
pkgver = 0.5
|
||||
pkgver = 2.0.0
|
||||
pkgrel = 1
|
||||
url = https://github.com/Mastermindzh/tidal-hifi
|
||||
arch = x86_64
|
||||
@@ -11,9 +11,10 @@ pkgbase = tidal-hifi-git
|
||||
depends = nss
|
||||
depends = gtk3
|
||||
provides = tidal-hifi
|
||||
source = https://github.com/Mastermindzh/tidal-hifi/archive/0.5.zip
|
||||
source = https://github.com/Mastermindzh/tidal-hifi/archive/2.0.0.zip
|
||||
source = tidal-hifi.desktop
|
||||
sha512sums = a25a9189a10aa35a62ad41299792909b0ac6547544802ef9d1f58d6d0bff75b4d364975c81d5a4d73eabf64bdb772c3823c3b3cd58540d40acaedf6594033f61
|
||||
sha512sums = fa5fa918ea890baa5f500db3153a6eff3d63966528ffa3349acda3ea02fbecb1ea78a1ba1d23ef7402de2228fc0a483252e0b7e72c73cfb25ed401bedaf856f5
|
||||
sha512sums = e1c0e47257cebe6b2609131964f0971c3eb70fc28c86f3d7177cb3cea09a3311236f4147bafa91347210fe2c96e6bd9d2e4ac7ca5b105e0c899657645705913d
|
||||
sha512sums = 35f38ac308b871c1822d7f6f760f2fb54c3748cf769822cb0f0dfb90f0f5754ba9316da5e903a0d2e9839de3a43ec76f238f3f2e44021956fa1da19142081349
|
||||
|
||||
pkgname = tidal-hifi-git
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
# Maintainer: Rick van Lieshout <info@rickvanlieshout.com>
|
||||
|
||||
_pkgname=tidal-hifi
|
||||
pkgname="$_pkgname"
|
||||
pkgver=0.5
|
||||
pkgname="$_pkgname-git"
|
||||
pkgver=2.0.0
|
||||
pkgrel=1
|
||||
pkgdesc="The web version of listen.tidal.com running in electron with hifi support thanks to widevine."
|
||||
arch=("x86_64")
|
||||
@@ -15,8 +15,8 @@ provides=("$_pkgname")
|
||||
|
||||
source=("https://github.com/Mastermindzh/tidal-hifi/archive/$pkgver.zip"
|
||||
"${_pkgname}.desktop")
|
||||
sha512sums=('a25a9189a10aa35a62ad41299792909b0ac6547544802ef9d1f58d6d0bff75b4d364975c81d5a4d73eabf64bdb772c3823c3b3cd58540d40acaedf6594033f61'
|
||||
'fa5fa918ea890baa5f500db3153a6eff3d63966528ffa3349acda3ea02fbecb1ea78a1ba1d23ef7402de2228fc0a483252e0b7e72c73cfb25ed401bedaf856f5')
|
||||
sha512sums=('e1c0e47257cebe6b2609131964f0971c3eb70fc28c86f3d7177cb3cea09a3311236f4147bafa91347210fe2c96e6bd9d2e4ac7ca5b105e0c899657645705913d'
|
||||
'35f38ac308b871c1822d7f6f760f2fb54c3748cf769822cb0f0dfb90f0f5754ba9316da5e903a0d2e9839de3a43ec76f238f3f2e44021956fa1da19142081349')
|
||||
|
||||
cdToPkg(){
|
||||
cd "tidal-hifi-$pkgver"
|
||||
@@ -33,7 +33,7 @@ build() {
|
||||
cdToPkg
|
||||
|
||||
# We are not using the systems Electron as we need castlab's Electron.
|
||||
npx electron-builder --linux dir
|
||||
npm run build-arch
|
||||
}
|
||||
|
||||
package() {
|
||||
|
@@ -10,3 +10,4 @@ Terminal=false
|
||||
Type=Application
|
||||
Categories=Network;Application;Audio;Video
|
||||
StartupWMClass=tidal-hifi
|
||||
X-PulseAudio-Properties=media.role=music
|
||||
|
BIN
docs/settings-preview.png
Normal file
BIN
docs/settings-preview.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 726 KiB |
1411
package-lock.json
generated
1411
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
28
package.json
28
package.json
@@ -1,16 +1,17 @@
|
||||
{
|
||||
"name": "tidal-hifi",
|
||||
"version": "1.0.0",
|
||||
"version": "2.0.0",
|
||||
"description": "Tidal on Electron with widevine(hifi) support",
|
||||
"main": "src/main.js",
|
||||
"scripts": {
|
||||
"start": "electron .",
|
||||
"build": "electron-builder -c ./build/electron-builder.yml",
|
||||
"build-deb": "electron-builder -c ./build/electron-builder.deb.yml",
|
||||
"build-snap": "electron-builder -c ./build/electron-builder.snap.yml",
|
||||
"build-arch": "electron-builder -c ./build/electron-builder.pacman.yml",
|
||||
"build-wl": "electron-builder -c ./build/electron-builder.yml -wl",
|
||||
"build-mac": "electron-builder -c ./build/electron-builder.yml -m"
|
||||
"build": "electron-builder --publish=never -c ./build/electron-builder.yml",
|
||||
"build-deb": "electron-builder --publish=never -c ./build/electron-builder.deb.yml",
|
||||
"build-rpm": "electron-builder --publish=never -c ./build/electron-builder.rpm.yml",
|
||||
"build-snap": "electron-builder --publish=never -c ./build/electron-builder.snap.yml",
|
||||
"build-arch": "electron-builder --publish=never -c ./build/electron-builder.pacman.yml",
|
||||
"build-wl": "electron-builder --publish=never -c ./build/electron-builder.yml -wl",
|
||||
"build-mac": "electron-builder --publish=never -c ./build/electron-builder.yml -m"
|
||||
},
|
||||
"keywords": [
|
||||
"electron",
|
||||
@@ -19,20 +20,23 @@
|
||||
"linux"
|
||||
],
|
||||
"author": "Rick van Lieshout <info@rickvanlieshout.com> (http://rickvanlieshout.com)",
|
||||
"homepage": "https://github.com/Mastermindzh/tidal-hifi",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"electron-store": "^5.1.0",
|
||||
"electron-store": "^5.1.1",
|
||||
"express": "^4.17.1",
|
||||
"hotkeys-js": "^3.7.1",
|
||||
"hotkeys-js": "^3.7.6",
|
||||
"mpris-service": "^2.1.0",
|
||||
"node-notifier": "^6.0.0",
|
||||
"request": "^2.88.0"
|
||||
"request": "^2.88.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@mastermindzh/prettier-config": "^1.0.0",
|
||||
"electron": "https://github.com/castlabs/electron-releases#v6.1.0-wvvmp",
|
||||
"electron": "git+https://github.com/castlabs/electron-releases.git#v8.5.2-wvvmp",
|
||||
"electron-builder": "^21.2.0",
|
||||
"electron-reload": "^1.5.0",
|
||||
"prettier": "^1.18.2"
|
||||
"prettier": "^2.0.4",
|
||||
"dot-prop": ">=4.2.1"
|
||||
},
|
||||
"prettier": "@mastermindzh/prettier-config"
|
||||
}
|
||||
|
@@ -17,6 +17,9 @@ const settings = {
|
||||
root: "apiSettings",
|
||||
port: "apiSettings.port",
|
||||
},
|
||||
mpris: "mpris",
|
||||
enableCustomHotkeys: "enableCustomHotkeys",
|
||||
trayIcon: "trayIcon",
|
||||
windowBounds: {
|
||||
root: "windowBounds",
|
||||
width: "windowBounds.width",
|
||||
|
@@ -34,8 +34,8 @@ function createWindow(options = {}) {
|
||||
mainWindow = new BrowserWindow({
|
||||
x: options.x,
|
||||
y: options.y,
|
||||
width: 1024,
|
||||
height: 800,
|
||||
width: store && store.get(settings.windowBounds.width),
|
||||
height: store && store.get(settings.windowBounds.height),
|
||||
icon,
|
||||
tray: true,
|
||||
backgroundColor: options.backgroundColor,
|
||||
@@ -43,7 +43,7 @@ function createWindow(options = {}) {
|
||||
affinity: "window",
|
||||
preload: path.join(__dirname, "preload.js"),
|
||||
plugins: true,
|
||||
devTools: !app.isPackaged,
|
||||
devTools: true, // I like tinkering, others might too
|
||||
},
|
||||
});
|
||||
|
||||
@@ -83,8 +83,7 @@ app.on("ready", () => {
|
||||
addMenu();
|
||||
createSettingsWindow();
|
||||
addGlobalShortcuts();
|
||||
addTray({ icon });
|
||||
refreshTray();
|
||||
store.get(settings.trayIcon) && addTray({ icon }) && refreshTray();
|
||||
store.get(settings.api) && expressModule.run(mainWindow);
|
||||
});
|
||||
|
||||
|
@@ -17,6 +17,9 @@ function refreshSettings() {
|
||||
api.checked = store.get(settings.api);
|
||||
port.value = store.get(settings.apiSettings.port);
|
||||
menuBar.checked = store.get(settings.menuBar);
|
||||
trayIcon.checked = store.get(settings.trayIcon);
|
||||
mpris.checked = store.get(settings.mpris);
|
||||
enableCustomHotkeys.checked = store.get(settings.enableCustomHotkeys);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,7 +69,7 @@ window.addEventListener("DOMContentLoaded", () => {
|
||||
refreshSettings();
|
||||
});
|
||||
|
||||
ipcRenderer.on("goToTab", (event, tab) => {
|
||||
ipcRenderer.on("goToTab", (_, tab) => {
|
||||
document.getElementById(tab).click();
|
||||
});
|
||||
|
||||
@@ -75,6 +78,9 @@ window.addEventListener("DOMContentLoaded", () => {
|
||||
api = get("apiCheckbox");
|
||||
port = get("port");
|
||||
menuBar = get("menuBar");
|
||||
trayIcon = get("trayIcon");
|
||||
mpris = get("mprisCheckbox");
|
||||
enableCustomHotkeys = get("enableCustomHotkeys");
|
||||
|
||||
refreshSettings();
|
||||
|
||||
@@ -83,4 +89,7 @@ window.addEventListener("DOMContentLoaded", () => {
|
||||
addInputListener(api, settings.api);
|
||||
addInputListener(port, settings.apiSettings.port);
|
||||
addInputListener(menuBar, settings.menuBar);
|
||||
addInputListener(trayIcon, settings.trayIcon);
|
||||
addInputListener(mpris, settings.mpris);
|
||||
addInputListener(enableCustomHotkeys, settings.enableCustomHotkeys);
|
||||
});
|
||||
|
@@ -26,14 +26,19 @@
|
||||
<div class="body">
|
||||
<div class="tabset">
|
||||
<!-- Tab 1 -->
|
||||
<input type="radio" name="tabset" id="tab1" checked />
|
||||
<label for="tab1">General</label>
|
||||
<input type="radio" name="tabset" id="general" checked />
|
||||
<label for="general">General</label>
|
||||
<!-- Tab 2 -->
|
||||
<input type="radio" name="tabset" id="tab2" />
|
||||
<label for="tab2">Api</label>
|
||||
<!-- Tab 3 -->
|
||||
<input type="radio" name="tabset" id="tab3" />
|
||||
<label for="tab3">About</label>
|
||||
<input type="radio" name="tabset" id="api" />
|
||||
<label for="api">Api</label>
|
||||
|
||||
<!-- Integrations tab -->
|
||||
<input type="radio" name="tabset" id="integrations" />
|
||||
<label for="integrations">Integrations</label>
|
||||
|
||||
<!-- about tab -->
|
||||
<input type="radio" name="tabset" id="about" />
|
||||
<label for="about">About</label>
|
||||
|
||||
<div class="tab-panels">
|
||||
<section id="general" class="tab-panel">
|
||||
@@ -63,15 +68,35 @@
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section">
|
||||
<h3>System</h3>
|
||||
<div class="option">
|
||||
<h4>Tray icon</h4>
|
||||
<p>
|
||||
Show Tidal-hifi's tray icon<br />
|
||||
</p>
|
||||
<label class="switch">
|
||||
<input id="trayIcon" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="option">
|
||||
<h4>Hotkeys</h4>
|
||||
<p>
|
||||
Enables extra hotkeys to achieve feature parity with the <a href = "javascript:openExternal('https://defkey.com/tidal-desktop-shortcuts')">desktop apps</a><br />
|
||||
</p>
|
||||
<label class="switch">
|
||||
<input id="enableCustomHotkeys" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="api" class="tab-panel">
|
||||
<div class="section">
|
||||
<h3>Api</h3>
|
||||
<p style="margin-bottom: 15px;">
|
||||
Tidal-hifi has a web api built in to allow users to get current song information. You can optionally enable playback control as well.
|
||||
<br />
|
||||
<br />
|
||||
<small>* api changes require a restart to update</small>
|
||||
</p>
|
||||
|
||||
<div class="option">
|
||||
@@ -99,9 +124,26 @@
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<button onClick="restart()">Restart Tidal-hifi</button>
|
||||
</section>
|
||||
<section id="general" class="tab-panel">
|
||||
<section id="integrations" class="tab-panel">
|
||||
<div class="section">
|
||||
<h3>integrations</h3>
|
||||
<p style="margin-bottom: 15px;">
|
||||
Tidal-hifi is extensible trough the use of integrations. You can enable or disable integrations here
|
||||
</p>
|
||||
<div class="option">
|
||||
<h4>mpris-player</h4>
|
||||
<p>
|
||||
Whether to enable the mpris media player controls for Linux systems
|
||||
</p>
|
||||
<label class="switch">
|
||||
<input id="mprisCheckbox" type="checkbox">
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="about" class="tab-panel">
|
||||
<div class="section">
|
||||
<img style="width: 100px; height: auto; display: block; margin: 0 auto; margin-bottom: 20px; margin-top: 20px;" src = "./icon.png">
|
||||
<p style="max-width: 350px; display:block; margin: 0 auto; text-align: center;">
|
||||
@@ -111,6 +153,9 @@
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<small>Some settings require a restart of Tidal-hifi. To do so click the button below:</small>
|
||||
<button onClick="restart()" style ="width: 100%">Restart Tidal-hifi</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -170,6 +215,7 @@
|
||||
|
||||
.exitWindow {
|
||||
border: none;
|
||||
outline: none;
|
||||
text-decoration: none;
|
||||
font-size: 1.4rem;
|
||||
float: right;
|
||||
@@ -178,6 +224,11 @@
|
||||
line-height: 50px;
|
||||
}
|
||||
|
||||
.exitWindow:focus {
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.exitWindow svg {
|
||||
height: 50px;
|
||||
color: white;
|
||||
@@ -263,7 +314,9 @@
|
||||
|
||||
.tabset > input:first-child:checked ~ .tab-panels > .tab-panel:first-child,
|
||||
.tabset > input:nth-child(3):checked ~ .tab-panels > .tab-panel:nth-child(2),
|
||||
.tabset > input:nth-child(5):checked ~ .tab-panels > .tab-panel:nth-child(3) {
|
||||
.tabset > input:nth-child(5):checked ~ .tab-panels > .tab-panel:nth-child(3),
|
||||
.tabset > input:nth-child(7):checked ~ .tab-panels > .tab-panel:nth-child(4)
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
116
src/preload.js
116
src/preload.js
@@ -1,5 +1,5 @@
|
||||
const { setTitle, getTitle } = require("./scripts/window-functions");
|
||||
const { dialog } = require("electron").remote;
|
||||
const { dialog, process } = require("electron").remote;
|
||||
const { store, settings } = require("./scripts/settings");
|
||||
const { ipcRenderer } = require("electron");
|
||||
const { app } = require("electron").remote;
|
||||
@@ -10,6 +10,7 @@ const globalEvents = require("./constants/globalEvents");
|
||||
const notifier = require("node-notifier");
|
||||
const notificationPath = `${app.getPath("userData")}/notification.jpg`;
|
||||
let currentSong = "";
|
||||
let player;
|
||||
|
||||
const elements = {
|
||||
play: '*[data-test="play"]',
|
||||
@@ -28,7 +29,7 @@ const elements = {
|
||||
account: '*[data-test^="profile-image-button"]',
|
||||
settings: '*[data-test^="open-settings"]',
|
||||
media: '*[data-test="current-media-imagery"]',
|
||||
image: '*[class^="image--"]',
|
||||
image: "img",
|
||||
|
||||
/**
|
||||
* Get an element from the dom
|
||||
@@ -100,6 +101,7 @@ function playPause() {
|
||||
* https://defkey.com/tidal-desktop-shortcuts
|
||||
*/
|
||||
function addHotKeys() {
|
||||
if (store.get(settings.enableCustomHotkeys)) {
|
||||
hotkeys.add("Control+p", function () {
|
||||
elements.click("account").click("settings");
|
||||
});
|
||||
@@ -119,36 +121,18 @@ function addHotKeys() {
|
||||
elements.click("forward");
|
||||
});
|
||||
|
||||
hotkeys.add("control+f", function() {
|
||||
elements.focus("search");
|
||||
});
|
||||
|
||||
hotkeys.add("control+u", function () {
|
||||
// reloading window without cache should show the update bar if applicable
|
||||
window.location.reload(true);
|
||||
});
|
||||
|
||||
hotkeys.add("control+left", function() {
|
||||
elements.click("previous");
|
||||
});
|
||||
|
||||
hotkeys.add("control+right", function() {
|
||||
elements.click("next");
|
||||
});
|
||||
|
||||
hotkeys.add("control+right", function() {
|
||||
elements.click("next");
|
||||
});
|
||||
|
||||
hotkeys.add("control+s", function() {
|
||||
elements.click("shuffle");
|
||||
});
|
||||
|
||||
hotkeys.add("control+r", function () {
|
||||
elements.click("repeat");
|
||||
});
|
||||
}
|
||||
|
||||
hotkeys.add("control+/", function() {
|
||||
// always add the hotkey for the settings window
|
||||
hotkeys.add("control+=", function () {
|
||||
ipcRenderer.send(globalEvents.showSettings);
|
||||
});
|
||||
}
|
||||
@@ -216,13 +200,22 @@ function addIPCEventListeners() {
|
||||
* Update the current status of tidal (e.g playing or paused)
|
||||
*/
|
||||
function updateStatus() {
|
||||
const play = elements.get("play");
|
||||
let status = statuses.paused;
|
||||
// if play button is NOT visible tidal is playing
|
||||
if (!play) {
|
||||
let pause = elements.get("pause");
|
||||
let status;
|
||||
|
||||
// if pause button is visible tidal is playing
|
||||
if (pause) {
|
||||
status = statuses.playing;
|
||||
} else {
|
||||
status = statuses.paused;
|
||||
}
|
||||
|
||||
if (status) {
|
||||
ipcRenderer.send(globalEvents.updateStatus, status);
|
||||
if (player) {
|
||||
player.playbackStatus = status == statuses.paused ? "Paused" : "Playing";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -254,16 +247,29 @@ setInterval(function() {
|
||||
resolve();
|
||||
},
|
||||
() => {
|
||||
reject();
|
||||
// if the image can't be downloaded then continue without it
|
||||
resolve();
|
||||
}
|
||||
);
|
||||
} else {
|
||||
reject();
|
||||
// if the image can't be found on the page continue without it
|
||||
resolve();
|
||||
}
|
||||
}).then(
|
||||
() => {
|
||||
ipcRenderer.send(globalEvents.updateInfo, options);
|
||||
store.get(settings.notifications) && notifier.notify(options);
|
||||
|
||||
if (player) {
|
||||
player.metadata = {
|
||||
...player.metadata,
|
||||
...{
|
||||
"xesam:title": title,
|
||||
"xesam:artist": [artists],
|
||||
"mpris:artUrl": image,
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
() => {}
|
||||
);
|
||||
@@ -271,5 +277,57 @@ setInterval(function() {
|
||||
}
|
||||
}, 200);
|
||||
|
||||
if (process.platform === "linux" && store.get(settings.mpris)) {
|
||||
try {
|
||||
const Player = require("mpris-service");
|
||||
player = Player({
|
||||
name: "tidal-hifi",
|
||||
identity: "tidal-hifi",
|
||||
supportedUriSchemes: ["file"],
|
||||
supportedMimeTypes: [
|
||||
"audio/mpeg",
|
||||
"audio/flac",
|
||||
"audio/x-flac",
|
||||
"application/ogg",
|
||||
"audio/wav",
|
||||
],
|
||||
supportedInterfaces: ["player"],
|
||||
desktopEntry: "tidal-hifi",
|
||||
});
|
||||
|
||||
// Events
|
||||
var events = {
|
||||
next: "next",
|
||||
previous: "previous",
|
||||
pause: "pause",
|
||||
playpause: "playpause",
|
||||
stop: "stop",
|
||||
play: "play",
|
||||
loopStatus: "repeat",
|
||||
shuffle: "shuffle",
|
||||
seek: "seek",
|
||||
};
|
||||
Object.keys(events).forEach(function (eventName) {
|
||||
player.on(eventName, function () {
|
||||
const eventValue = events[eventName];
|
||||
switch (events[eventValue]) {
|
||||
case events.playpause:
|
||||
playPause();
|
||||
break;
|
||||
|
||||
default:
|
||||
elements.click(eventValue);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
player.on("quit", function () {
|
||||
app.quit();
|
||||
});
|
||||
} catch (exception) {
|
||||
console.log("player api not working");
|
||||
}
|
||||
}
|
||||
|
||||
addHotKeys();
|
||||
addIPCEventListeners();
|
||||
|
@@ -89,7 +89,7 @@ const mainMenu = [
|
||||
{
|
||||
label: "About",
|
||||
click() {
|
||||
showSettingsWindow("tab3");
|
||||
showSettingsWindow("about");
|
||||
},
|
||||
},
|
||||
];
|
||||
|
@@ -14,7 +14,9 @@ const store = new Store({
|
||||
apiSettings: {
|
||||
port: 47836,
|
||||
},
|
||||
|
||||
trayIcon: true,
|
||||
mpris: false,
|
||||
enableCustomHotkeys: false,
|
||||
windowBounds: { width: 800, height: 600 },
|
||||
},
|
||||
});
|
||||
@@ -52,7 +54,7 @@ settingsModule.createSettingsWindow = function() {
|
||||
settingsModule.settingsWindow = settingsWindow;
|
||||
};
|
||||
|
||||
settingsModule.showSettingsWindow = function(tab = "tab1") {
|
||||
settingsModule.showSettingsWindow = function (tab = "general") {
|
||||
settingsWindow.webContents.send("goToTab", tab);
|
||||
|
||||
// refresh data just before showing the window
|
||||
|
@@ -8,6 +8,9 @@ trayModule.addTray = function(options = { icon: "" }) {
|
||||
};
|
||||
|
||||
trayModule.refreshTray = function () {
|
||||
if (!tray) {
|
||||
trayModule.addTray();
|
||||
}
|
||||
tray.on("click", function (e) {
|
||||
// do nothing on click
|
||||
});
|
||||
|
18
stale.yml
Normal file
18
stale.yml
Normal file
@@ -0,0 +1,18 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 30
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 2
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- good first issue
|
||||
- waiting for support
|
||||
- security
|
||||
# Label to use when marking an issue as stale
|
||||
staleLabel: stale
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
Reference in New Issue
Block a user