Compare commits

..

23 Commits
0.5 ... 1.3.0

Author SHA1 Message Date
87a4ff3fc5 Merge pull request #32 from Mastermindzh/feature/mpris-403-fix 2020-11-29 12:32:47 +01:00
1e5b7d61f5 added changelog etc 2020-11-29 12:31:58 +01:00
8177e6e3ca re-enabled mpris after the 403 has been fixed 2020-11-29 10:55:01 +01:00
9f26db22fc updated arch install files. fixes #27 2020-10-07 20:33:39 +02:00
e2ea4d13c4 added the option to disable the system tray icon and fixed the settings menu 2020-10-07 20:10:31 +02:00
c222113cf1 updated arch builds 2020-10-05 10:50:15 +02:00
bdab6c3a17 added homepage attribute for electron-builder.. 2020-10-05 10:38:34 +02:00
813beec863 having pkgbuild run the internal electron-builder 2020-10-05 10:17:27 +02:00
591d42b31a updated arch info 2020-10-04 12:00:19 +02:00
beacedd64b Develop (#25) 2020-10-04 11:52:08 +02:00
dependabot[bot]
e13af7a2d5 Bump yargs-parser from 13.1.1 to 13.1.2 (#21)
Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 13.1.1 to 13.1.2.
- [Release notes](https://github.com/yargs/yargs-parser/releases)
- [Changelog](https://github.com/yargs/yargs-parser/blob/master/docs/CHANGELOG-full.md)
- [Commits](https://github.com/yargs/yargs-parser/commits)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-09-14 09:12:06 +02:00
73cba7f761 Create stale.yml 2020-08-16 16:30:51 +02:00
71208bbf81 updated the aur info 2020-04-10 11:36:34 +02:00
ef37478788 trying to fix the pipeline, have to test on master because apparantly the master branch always tries to release 2020-04-10 11:07:45 +02:00
c411c2cf85 Updated NPM packages to fix CVE-2020-7598 2020-04-10 10:45:24 +02:00
Steffen Sun Lyng
b6185c3e12 Fix/add readme for local snap install (#10)
* Added more explicit installation guide for snap

* changed a few details about snap installation

* Removed unwanted character
2020-04-09 17:02:49 +02:00
Luka Jankovic
c90902e9a9 RPM support and icns icon (#9)
* rpm support and a new icon

* removed unneeded dependency
2020-03-19 21:26:40 +01:00
e72b607f29 updated aur scripts 2020-02-02 10:17:19 +00:00
d05d8f48b6 v1.0 (#6) 2020-02-01 21:14:34 +01:00
Matthieu Le brazidec
30844cb51b Updated the express api to only listen on localhost (#5) 2020-02-01 20:55:05 +01:00
a59cc16f34 Update README.md 2020-01-18 12:10:49 +01:00
52b32c0783 added arch (AUR) PKGBUILD files
Package is visible on: https://aur.archlinux.org/packages/tidal-hifi-git/
2019-12-02 22:55:10 +01:00
José Augusto Bolina
0636c8b92f added individual build scripts. (#1)
* added individual build scripts.

- squashed + changed commit messages.
2019-12-01 23:02:59 +01:00
26 changed files with 1185 additions and 740 deletions

View File

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

7
.gitignore vendored
View File

@@ -1,2 +1,9 @@
node_modules
dist
# ignore all build files except for the .desktop and PKGBUILD files
build/linux/arch/*
!build/linux/arch/PKGBUILD
!build/linux/arch/.SRCINFO
!build/linux/arch/tidal-hifi.desktop
!build/linux/arch/install.sh

28
CHANGELOG.md Normal file
View File

@@ -0,0 +1,28 @@
# 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).
## 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

View File

@@ -13,6 +13,7 @@ The web version of [listen.tidal.com](listen.tidal.com) running in electron with
- [Installation](#installation)
- [Using releases](#using-releases)
- [Snap install](#snap-install)
- [Using source](#using-source)
- [features](#features)
- [Integrations](#integrations)
@@ -28,6 +29,30 @@ 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:
```sh
trizen tidal-hifi
```
### Using source
To install and work with the code on this project follow these steps:
@@ -44,12 +69,15 @@ To install and work with the code on this project follow these steps:
- Shortcuts ([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)
## 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
I moved from Spotify over to Tidal and found Linux support to be lacking.
@@ -67,7 +95,12 @@ 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)

BIN
assets/TIDAL.icns Executable file

Binary file not shown.

View File

@@ -0,0 +1,6 @@
extends: ./build/electron-builder.yml
linux:
category: Audio
icon: ./assets/icon.png
target:
- deb

View File

@@ -0,0 +1,6 @@
extends: ./build/electron-builder.yml
linux:
category: Audio
icon: ./assets/icon.png
target:
- pacman

View File

@@ -0,0 +1,6 @@
extends: ./build/electron-builder.yml
linux:
category: Audio
icon: ./assets/TIDAL.icns
target:
- rpm

View File

@@ -0,0 +1,6 @@
extends: ./build/electron-builder.yml
linux:
category: Audio
icon: ./assets/icon.png
target:
- snap

View File

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

20
build/linux/arch/.SRCINFO Normal file
View File

@@ -0,0 +1,20 @@
pkgbase = tidal-hifi-git
pkgdesc = The web version of listen.tidal.com running in electron with hifi support thanks to widevine.
pkgver = 1.2.0
pkgrel = 1
url = https://github.com/Mastermindzh/tidal-hifi
arch = x86_64
license = custom:MIT
makedepends = npm
makedepends = git
depends = libxss
depends = nss
depends = gtk3
provides = tidal-hifi
source = https://github.com/Mastermindzh/tidal-hifi/archive/1.2.0.zip
source = tidal-hifi.desktop
sha512sums = e1c0e47257cebe6b2609131964f0971c3eb70fc28c86f3d7177cb3cea09a3311236f4147bafa91347210fe2c96e6bd9d2e4ac7ca5b105e0c899657645705913d
sha512sums = 35f38ac308b871c1822d7f6f760f2fb54c3748cf769822cb0f0dfb90f0f5754ba9316da5e903a0d2e9839de3a43ec76f238f3f2e44021956fa1da19142081349
pkgname = tidal-hifi-git

56
build/linux/arch/PKGBUILD Normal file
View File

@@ -0,0 +1,56 @@
# Maintainer: Rick van Lieshout <info@rickvanlieshout.com>
_pkgname=tidal-hifi
pkgname="$_pkgname-git"
pkgver=1.2.0
pkgrel=1
pkgdesc="The web version of listen.tidal.com running in electron with hifi support thanks to widevine."
arch=("x86_64")
url="https://github.com/Mastermindzh/tidal-hifi"
license=("custom:MIT")
depends=("libxss" "nss" "gtk3")
makedepends=("npm" "git")
provides=("$_pkgname")
source=("https://github.com/Mastermindzh/tidal-hifi/archive/$pkgver.zip"
"${_pkgname}.desktop")
sha512sums=('e1c0e47257cebe6b2609131964f0971c3eb70fc28c86f3d7177cb3cea09a3311236f4147bafa91347210fe2c96e6bd9d2e4ac7ca5b105e0c899657645705913d'
'35f38ac308b871c1822d7f6f760f2fb54c3748cf769822cb0f0dfb90f0f5754ba9316da5e903a0d2e9839de3a43ec76f238f3f2e44021956fa1da19142081349')
cdToPkg(){
cd "tidal-hifi-$pkgver"
}
prepare() {
cdToPkg
# install build dependencies
npm install
}
build() {
cdToPkg
# We are not using the systems Electron as we need castlab's Electron.
npm run build-arch
}
package() {
cdToPkg
install -d "${pkgdir}/opt/${_pkgname}/" "${pkgdir}/usr/bin" "${pkgdir}/usr/share/doc" "${pkgdir}/usr/share/licenses"
cp -r dist/linux-unpacked/* "${pkgdir}/opt/${_pkgname}/"
chmod +x "${pkgdir}/opt/${_pkgname}/${_pkgname}"
ln -s "/opt/${_pkgname}/${_pkgname}" "${pkgdir}/usr/bin/${_pkgname}"
install -Dm 644 "build/icon.png" "${pkgdir}/usr/share/pixmaps/${_pkgname}.png"
install -Dm 644 "${srcdir}/${_pkgname}.desktop" "${pkgdir}/usr/share/applications/${_pkgname}.desktop"
install -Dm 644 "README.md" "${pkgdir}/usr/share/doc/${pkgname}/README.md"
install -Dm 644 "LICENSE" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE"
ln -s "/opt/${_pkgname}/LICENSE.electron.txt" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE.electron.txt"
ln -s "/opt/${_pkgname}/LICENSES.chromium.html" "${pkgdir}/usr/share/licenses/${pkgname}/LICENSES.chromium.html"
}

View File

@@ -0,0 +1,18 @@
#!/bin/bash
# Will generate a correctly formatted SRCINFO file
SCRIPT_DIST=".SRCINFO"
# generate SRCINFO
makepkg --printsrcinfo > $SCRIPT_DIST
# replace pkgbase with tidal-hifi-git
pkgName="tidal-hifi-git"
sed -i "1s/.*/pkgbase = $pkgName/" $SCRIPT_DIST
# replace pkgbase with tidal-hifi-git
sed -i '/^pkgname/ d' $SCRIPT_DIST
echo "pkgname = $pkgName" >> $SCRIPT_DIST
# remove double line breaks and replace with single line breaks
sed -i '/^$/N;/^\n$/D' $SCRIPT_DIST

View File

@@ -0,0 +1,13 @@
[Desktop Entry]
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.
Exec=tidal-hifi %u
Icon=tidal-hifi.png
StartupNotify=true
Terminal=false
Type=Application
Categories=Network;Application;Audio;Video
StartupWMClass=tidal-hifi
X-PulseAudio-Properties=media.role=music

1407
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,17 @@
{
"name": "tidal-hifi",
"version": "0.1.0",
"version": "1.3.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-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",
@@ -16,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"
}

View File

@@ -17,6 +17,8 @@ const settings = {
root: "apiSettings",
port: "apiSettings.port",
},
mpris: "mpris",
trayIcon: "trayIcon",
windowBounds: {
root: "windowBounds",
width: "windowBounds.width",

View File

@@ -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
},
});
@@ -56,7 +56,7 @@ function createWindow(options = {}) {
mainWindow.webContents.once("did-finish-load", () => {});
// Emitted when the window is closed.
mainWindow.on("closed", function() {
mainWindow.on("closed", function () {
closeSettingsWindow();
app.quit();
});
@@ -83,12 +83,11 @@ app.on("ready", () => {
addMenu();
createSettingsWindow();
addGlobalShortcuts();
addTray({ icon });
refreshTray();
store.get(settings.trayIcon) && addTray({ icon }) && refreshTray();
store.get(settings.api) && expressModule.run(mainWindow);
});
app.on("activate", function() {
app.on("activate", function () {
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) {

View File

@@ -17,12 +17,14 @@ 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);
}
/**
* Open an url in the default browsers
*/
window.openExternal = function(url) {
window.openExternal = function (url) {
const { shell } = require("electron");
shell.openExternal(url);
};
@@ -30,14 +32,14 @@ window.openExternal = function(url) {
/**
* hide the settings window
*/
window.hide = function() {
window.hide = function () {
ipcRenderer.send(globalEvents.hideSettings);
};
/**
* Restart tidal-hifi after changes
*/
window.restart = function() {
window.restart = function () {
const remote = require("electron").remote;
remote.app.relaunch();
remote.app.exit(0);
@@ -52,7 +54,7 @@ window.addEventListener("DOMContentLoaded", () => {
}
function addInputListener(source, key) {
source.addEventListener("input", function(event, data) {
source.addEventListener("input", function (event, data) {
if (this.value === "on") {
store.set(key, source.checked);
} else {
@@ -66,7 +68,7 @@ window.addEventListener("DOMContentLoaded", () => {
refreshSettings();
});
ipcRenderer.on("goToTab", (event, tab) => {
ipcRenderer.on("goToTab", (_, tab) => {
document.getElementById(tab).click();
});
@@ -75,6 +77,8 @@ window.addEventListener("DOMContentLoaded", () => {
api = get("apiCheckbox");
port = get("port");
menuBar = get("menuBar");
trayIcon = get("trayIcon");
mpris = get("mprisCheckbox");
refreshSettings();
@@ -83,4 +87,6 @@ window.addEventListener("DOMContentLoaded", () => {
addInputListener(api, settings.api);
addInputListener(port, settings.apiSettings.port);
addInputListener(menuBar, settings.menuBar);
addInputListener(trayIcon, settings.trayIcon);
addInputListener(mpris, settings.mpris);
});

View File

@@ -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,25 @@
</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>
</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 +114,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 +143,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 +205,7 @@
.exitWindow {
border: none;
outline: none;
text-decoration: none;
font-size: 1.4rem;
float: right;
@@ -178,6 +214,11 @@
line-height: 50px;
}
.exitWindow:focus {
border: none;
outline: none;
}
.exitWindow svg {
height: 50px;
color: white;
@@ -263,7 +304,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;
}

View File

@@ -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"]',
@@ -34,14 +35,14 @@ const elements = {
* Get an element from the dom
* @param {*} key key in elements object to fetch
*/
get: function(key) {
get: function (key) {
return window.document.querySelector(this[key.toLowerCase()]);
},
/**
* Get the icon of the current song
*/
getSongIcon: function() {
getSongIcon: function () {
const figure = this.get("media");
if (figure) {
@@ -58,7 +59,7 @@ const elements = {
* Shorthand function to get the text of a dom element
* @param {*} key key in elements object to fetch
*/
getText: function(key) {
getText: function (key) {
const element = this.get(key);
return element ? element.textContent : "";
},
@@ -67,7 +68,7 @@ const elements = {
* Shorthand function to click a dom element
* @param {*} key key in elements object to fetch
*/
click: function(key) {
click: function (key) {
this.get(key).click();
return this;
},
@@ -76,7 +77,7 @@ const elements = {
* Shorthand function to focus a dom element
* @param {*} key key in elements object to fetch
*/
focus: function(key) {
focus: function (key) {
return this.get(key).focus();
},
};
@@ -100,55 +101,55 @@ function playPause() {
* https://defkey.com/tidal-desktop-shortcuts
*/
function addHotKeys() {
hotkeys.add("Control+p", function() {
hotkeys.add("Control+p", function () {
elements.click("account").click("settings");
});
hotkeys.add("Control+l", function() {
hotkeys.add("Control+l", function () {
handleLogout();
});
hotkeys.add("Control+h", function() {
hotkeys.add("Control+h", function () {
elements.click("home");
});
hotkeys.add("backspace", function() {
hotkeys.add("backspace", function () {
elements.click("back");
});
hotkeys.add("shift+backspace", function() {
hotkeys.add("shift+backspace", function () {
elements.click("forward");
});
hotkeys.add("control+f", function() {
hotkeys.add("control+f", function () {
elements.focus("search");
});
hotkeys.add("control+u", function() {
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() {
hotkeys.add("control+left", function () {
elements.click("previous");
});
hotkeys.add("control+right", function() {
hotkeys.add("control+right", function () {
elements.click("next");
});
hotkeys.add("control+right", function() {
hotkeys.add("control+right", function () {
elements.click("next");
});
hotkeys.add("control+s", function() {
hotkeys.add("control+s", function () {
elements.click("shuffle");
});
hotkeys.add("control+r", function() {
hotkeys.add("control+r", function () {
elements.click("repeat");
});
hotkeys.add("control+/", function() {
hotkeys.add("control+/", function () {
ipcRenderer.send(globalEvents.showSettings);
});
}
@@ -169,7 +170,7 @@ function handleLogout() {
buttons: logoutOptions,
defaultId: 2,
},
function(response) {
function (response) {
if (logoutOptions.indexOf("Yes, please") == response) {
for (i = 0; i < window.localStorage.length; i++) {
key = window.localStorage.key(i);
@@ -216,19 +217,28 @@ 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";
}
}
ipcRenderer.send(globalEvents.updateStatus, status);
}
/**
* Watch for song changes and update title + notify
*/
setInterval(function() {
setInterval(function () {
const title = elements.getText("title");
const artists = elements.getText("artists");
const songDashArtistTitle = `${title} - ${artists}`;
@@ -264,6 +274,17 @@ setInterval(function() {
() => {
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 +292,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();

View File

@@ -53,7 +53,7 @@ expressModule.run = function(mainWindow) {
if (store.get(settings.api)) {
let port = store.get(settings.apiSettings.port);
expressInstance = expressApp.listen(port, () => {});
expressInstance = expressApp.listen(port, "127.0.0.1", () => {});
expressInstance.on("error", function(e) {
let message = e.code;
if (e.code === "EADDRINUSE") {

View File

@@ -89,18 +89,18 @@ const mainMenu = [
{
label: "About",
click() {
showSettingsWindow("tab3");
showSettingsWindow("about");
},
},
];
const menuModule = { mainMenu };
menuModule.getMenu = function() {
menuModule.getMenu = function () {
return Menu.buildFromTemplate(mainMenu);
};
menuModule.addMenu = function() {
menuModule.addMenu = function () {
Menu.setApplicationMenu(menuModule.getMenu());
};

View File

@@ -14,7 +14,8 @@ const store = new Store({
apiSettings: {
port: 47836,
},
trayIcon: true,
mpris: false,
windowBounds: { width: 800, height: 600 },
},
});
@@ -25,7 +26,7 @@ const settingsModule = {
settingsWindow,
};
settingsModule.createSettingsWindow = function() {
settingsModule.createSettingsWindow = function () {
settingsWindow = new BrowserWindow({
width: 500,
height: 600,
@@ -52,18 +53,18 @@ 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
settingsWindow.webContents.send("refreshData");
settingsWindow.show();
};
settingsModule.hideSettingsWindow = function() {
settingsModule.hideSettingsWindow = function () {
settingsWindow.hide();
};
settingsModule.closeSettingsWindow = function() {
settingsModule.closeSettingsWindow = function () {
settingsWindow = null;
};

View File

@@ -3,12 +3,15 @@ const { getMenu } = require("./menu");
const trayModule = {};
let tray;
trayModule.addTray = function(options = { icon: "" }) {
trayModule.addTray = function (options = { icon: "" }) {
tray = new Tray(options.icon);
};
trayModule.refreshTray = function() {
tray.on("click", function(e) {
trayModule.refreshTray = function () {
if (!tray) {
trayModule.addTray();
}
tray.on("click", function (e) {
// do nothing on click
});

18
stale.yml Normal file
View 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