Compare commits

...

4 Commits
4.0.1 ... 4.1.2

Author SHA1 Message Date
732710c3ef Pr dest (#166)
* Update configuration of the desktop file (#165)

* - Changed the category of the desktop file to AudioVideo
- Changed desktop file name to "TIDAL Hi-Fi"

Co-authored-by: Ivo Šmerek <ivo97@centrum.cz>
2022-09-11 22:54:08 +02:00
4941aae950 Bugfix/4.1.1 (#161)
* - Fixed `cannot read property of undefined` error because of not passing mainWindow around.
- vincens2005, fixed inconsistent auto muting

* Fix inconsistent auto-muting (#159)

* fix muting sometimes not working

* fix inconsistent unmuting

* fix bad code in inconsistent muting fig

Co-authored-by: Cukmekerb <cukmekerb@gmail.com>
2022-08-23 21:20:46 +02:00
1439a11969 Feature/4.1.0 (#156)
* added protocol handler

* Switched icon strategies to fix bugs with icons

* fixed tray icon issues

* fixed about :)

* Fixed playback, mpris and API issues
2022-08-07 16:05:48 +02:00
Tomasz Hołubowicz
3a3e0e1a2d Add instruction for installation via Nix (#153) 2022-07-05 16:41:12 +02:00
18 changed files with 1077 additions and 1026 deletions

View File

@@ -4,6 +4,27 @@ 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).
## 4.1.2
- Changed the category of the desktop file to AudioVideo
- Changed desktop file name to "TIDAL Hi-Fi"
## 4.1.1
- Fixed `cannot read property of undefined` error because of not passing mainWindow around.
- vincens2005, fixed inconsistent auto muting
## 4.1.0
- Added `tidal://` protocol support
- Switched icon strategies to fix bugs with icons
- Fixed tray icon bugs
- Menu now shows in KDE as well
- Toggle window is supported from tray icon
- regular click is still ignored, see [this issue](https://github.com/electron/electron/issues/6773)
- Fixed about tab not showing
- Fixed playback, mpris and API issues
## 4.0.1 ## 4.0.1
- Updated build config to make use of a base file that doesn't build anything. - Updated build config to make use of a base file that doesn't build anything.

View File

@@ -12,23 +12,23 @@ The web version of [listen.tidal.com](https://listen.tidal.com) running in elect
<!-- toc --> <!-- toc -->
- [Installation](#installation) - [Installation](#installation)
- [Using releases](#using-releases) * [Using releases](#using-releases)
- [Snap install](#snap-install) * [Snap](#snap)
- [Arch Linux](#arch-linux) * [Arch Linux](#arch-linux)
- [Flatpak](#flatpak) * [Flatpak](#flatpak)
- [Using source](#using-source) * [Nix](#nix)
- [features](#features) * [Using source](#using-source)
- [Features](#features)
- [Integrations](#integrations) - [Integrations](#integrations)
- [not included](#not-included) * [Known bugs](#known-bugs)
- [Known bugs](#known-bugs) + [last.fm doesn't work out of the box. Use rescrobbler as a workaround](#lastfm-doesnt-work-out-of-the-box-use-rescrobbler-as-a-workaround)
- [last.fm doesn't work out of the box. Use rescrobbler as a workaround](#lastfm-doesnt-work-out-of-the-box-use-rescrobbler-as-a-workaround)
- [Why](#why) - [Why](#why)
- [Why not extend existing projects?](#why-not-extend-existing-projects) - [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) - [Buy me a coffee? Please don't](#buy-me-a-coffee-please-dont)
- [Images](#images) - [Images](#images)
- [settings window](#settings-window) * [Settings window](#settings-window)
- [user setups](#user-setups) * [User setups](#user-setups)
<!-- tocstop --> <!-- tocstop -->
@@ -38,7 +38,7 @@ The web version of [listen.tidal.com](https://listen.tidal.com) running in elect
Various packaged versions of the software are available on the [releases](https://github.com/Mastermindzh/tidal-hifi/releases) tab. Various packaged versions of the software are available on the [releases](https://github.com/Mastermindzh/tidal-hifi/releases) tab.
#### Snap install ### Snap
To install with `snap` you need to download the pre-packaged snap-package from this repository, found under releases: To install with `snap` you need to download the pre-packaged snap-package from this repository, found under releases:
@@ -70,6 +70,14 @@ To install via [Flatpak](https://flathub.org/apps/details/com.mastermindzh.tidal
flatpak install flathub com.mastermindzh.tidal-hifi flatpak install flathub com.mastermindzh.tidal-hifi
``` ```
### Nix
To install with Nix run the following command:
```sh
nix-env -iA nixpkgs.tidal-hifi
```
### Using source ### Using source
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:
@@ -79,7 +87,7 @@ To install and work with the code on this project follow these steps:
- npm install - npm install
- npm start - npm start
## features ## Features
- HiFi playback - HiFi playback
- Notifications - Notifications
@@ -102,7 +110,7 @@ It currently includes:
- MPRIS - MPRIS media player controls/status - MPRIS - MPRIS media player controls/status
- Discord - Shows what you're listening to on Discord. - Discord - Shows what you're listening to on Discord.
### not included Not included:
- [i3 blocks config](https://github.com/Mastermindzh/dotfiles/commit/9714b2fa1d670108ce811d5511fd3b7a43180647) - My dotfiles where I use this app to fetch currently playing music (direct commit) - [i3 blocks config](https://github.com/Mastermindzh/dotfiles/commit/9714b2fa1d670108ce811d5511fd3b7a43180647) - My dotfiles where I use this app to fetch currently playing music (direct commit)
@@ -143,11 +151,11 @@ Inspired by [haydenjames' issue](https://github.com/Mastermindzh/tidal-hifi/issu
## Images ## Images
### settings window ### Settings window
![settings window](./docs/settings-preview.png) ![settings window](./docs/settings-preview.png)
### user setups ### User setups
Some of our users are kind enough to share their usage pictures. 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). 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).

View File

@@ -8,26 +8,32 @@ snap:
- default - default
- screen-inhibit-control - screen-inhibit-control
linux: linux:
category: Audio category: AudioVideo
target: target:
- dir - dir
executableName: tidal-hifi executableName: tidal-hifi
desktop: desktop:
Encoding: UTF-8 Encoding: UTF-8
Name: tidal-hifi Name: TIDAL Hi-Fi
GenericName: tidal-hifi GenericName: TIDAL Hi-Fi
Comment: The web version of listen.tidal.com running in electron with hifi support thanks to widevine. Comment: The web version of listen.tidal.com running in electron with hifi support thanks to widevine.
Icon: assets/icon.png Icon: icon.png
StartupNotify: true StartupNotify: true
Terminal: false Terminal: false
Type: Application Type: Application
Categories: Network;Application;AudioVideo;Audio;Video Categories: Network;Application;AudioVideo;Audio;Video
StartupWMClass: tidal-hifi StartupWMClass: tidal-hifi
X-PulseAudio-Properties: media.role=music 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:
icon: build/icon.png icon: icon.png
artifactName: "tidalhifi" artifactName: "tidalhifi"
appId: com.rickvanlieshout.tidalhifi appId: com.rickvanlieshout.tidalhifi
executableName: tidalhifi executableName: tidalhifi
protocols:
name: "tidal"
role: "Viewer"
schemes: ["tidal"]

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,7 +14,7 @@ linux:
- freebsd - freebsd
win: win:
target: msi target: msi
icon: build/icon.png icon: icon.png
artifactName: "tidalhifi" artifactName: "tidalhifi"
appId: com.rickvanlieshout.tidalhifi appId: com.rickvanlieshout.tidalhifi
executableName: tidalhifi executableName: tidalhifi

BIN
build/icon-inverted.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
build/icon.icns Executable file

Binary file not shown.

669
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "tidal-hifi", "name": "tidal-hifi",
"version": "4.0.1", "version": "4.1.2",
"description": "Tidal on Electron with widevine(hifi) support", "description": "Tidal on Electron with widevine(hifi) support",
"main": "src/main.js", "main": "src/main.js",
"scripts": { "scripts": {
@@ -27,17 +27,17 @@
"dependencies": { "dependencies": {
"@electron/remote": "^2.0.8", "@electron/remote": "^2.0.8",
"discord-rpc": "^4.0.1", "discord-rpc": "^4.0.1",
"electron-store": "^8.0.1", "electron-store": "^8.1.0",
"express": "^4.17.1", "express": "^4.18.1",
"hotkeys-js": "^3.8.7", "hotkeys-js": "^3.9.4",
"mpris-service": "^2.1.2", "mpris-service": "^2.1.2",
"request": "^2.88.2" "request": "^2.88.2"
}, },
"devDependencies": { "devDependencies": {
"@mastermindzh/prettier-config": "^1.0.0", "@mastermindzh/prettier-config": "^1.0.0",
"electron": "git+https://github.com/castlabs/electron-releases.git#v19.0.5+wvcus", "electron": "git+https://github.com/castlabs/electron-releases.git#v19.0.5+wvcus",
"electron-builder": "^23.2.0", "electron-builder": "^23.3.3",
"prettier": "^2.5.0" "prettier": "^2.7.1"
}, },
"prettier": "@mastermindzh/prettier-config" "prettier": "@mastermindzh/prettier-config"
} }

3
src/constants/values.js Normal file
View File

@@ -0,0 +1,3 @@
module.exports = {
name: "tidal-hifi",
};

View File

@@ -1,5 +1,5 @@
require("@electron/remote/main").initialize(); require("@electron/remote/main").initialize();
const { app, BrowserWindow, components, globalShortcut, ipcMain } = require("electron"); const { app, BrowserWindow, components, globalShortcut, ipcMain, protocol } = require("electron");
const { const {
settings, settings,
store, store,
@@ -21,6 +21,7 @@ const flagValues = require("./constants/flags");
let mainWindow; let mainWindow;
let icon = path.join(__dirname, "../assets/icon.png"); let icon = path.join(__dirname, "../assets/icon.png");
const PROTOCOL_PREFIX = "tidal";
setFlags(); setFlags();
@@ -84,7 +85,7 @@ function createWindow(options = {}) {
}, },
}); });
require("@electron/remote/main").enable(mainWindow.webContents); require("@electron/remote/main").enable(mainWindow.webContents);
registerHttpProtocols();
syncMenuBarWithStore(); syncMenuBarWithStore();
// load the Tidal website // load the Tidal website
@@ -113,6 +114,13 @@ function createWindow(options = {}) {
}); });
} }
function registerHttpProtocols() {
protocol.registerHttpProtocol(PROTOCOL_PREFIX, (request, _callback) => {
mainWindow.loadURL(`${tidalUrl}/${request.url.substring(PROTOCOL_PREFIX.length + 3)}`);
});
app.setAsDefaultProtocolClient(PROTOCOL_PREFIX);
}
function addGlobalShortcuts() { function addGlobalShortcuts() {
Object.keys(mediaKeys).forEach((key) => { Object.keys(mediaKeys).forEach((key) => {
globalShortcut.register(`${key}`, () => { globalShortcut.register(`${key}`, () => {
@@ -128,10 +136,10 @@ app.on("ready", async () => {
if (isMainInstanceOrMultipleInstancesAllowed()) { if (isMainInstanceOrMultipleInstancesAllowed()) {
await components.whenReady(); await components.whenReady();
createWindow(); createWindow();
addMenu(); addMenu(mainWindow);
createSettingsWindow(); createSettingsWindow();
addGlobalShortcuts(); addGlobalShortcuts();
store.get(settings.trayIcon) && addTray({ icon }) && refreshTray(); store.get(settings.trayIcon) && addTray(mainWindow, { icon }) && refreshTray();
store.get(settings.api) && expressModule.run(mainWindow); store.get(settings.api) && expressModule.run(mainWindow);
store.get(settings.enableDiscord) && discordModule.initRPC(); store.get(settings.enableDiscord) && discordModule.initRPC();
// mainWindow.webContents.openDevTools(); // mainWindow.webContents.openDevTools();

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
const { setTitle } = require("./scripts/window-functions"); const { setTitle } = require("./scripts/window-functions");
const { dialog, process, Notification } = require('@electron/remote'); const { dialog, process, Notification } = require("@electron/remote");
const { store, settings } = require("./scripts/settings"); const { store, settings } = require("./scripts/settings");
const { ipcRenderer } = require("electron"); const { ipcRenderer } = require("electron");
const { app } = require('@electron/remote'); const { app } = require("@electron/remote");
const { downloadFile } = require("./scripts/download"); const { downloadFile } = require("./scripts/download");
const statuses = require("./constants/statuses"); const statuses = require("./constants/statuses");
const hotkeys = require("./scripts/hotkeys"); const hotkeys = require("./scripts/hotkeys");
@@ -12,11 +12,7 @@ const appName = "Tidal Hifi";
let currentSong = ""; let currentSong = "";
let player; let player;
let currentPlayStatus = statuses.paused; let currentPlayStatus = statuses.paused;
let progressBarTime; let isMutedArtist = true;
let currentTimeChanged = false;
let currentTime;
let currentURL = undefined;
let isMutedArtist = false;
const elements = { const elements = {
play: '*[data-test="play"]', play: '*[data-test="play"]',
@@ -313,19 +309,16 @@ function updateMediaInfo(options, notify) {
/** /**
* Checks if Tidal is playing a video or song by grabbing the "a" element from the title. * Checks if Tidal is playing a video or song by grabbing the "a" element from the title.
* If it's a song it sets the track URL as currentURL, If it's a video it will set currentURL to undefined. * If it's a song it returns the track URL, if not it will return undefined
*/ */
function updateURL() { function getTrackURL() {
const URLelement = elements.get("title").querySelector("a"); const URLelement = elements.get("title").querySelector("a");
switch (URLelement) { if (URLelement !== null) {
case null: const id = URLelement.href.replace(/[^0-9]/g, "");
currentURL = undefined; return `https://tidal.com/browse/track/${id}`;
break;
default:
const id = URLelement.href.replace(/[^0-9]/g, "");
currentURL = `https://tidal.com/browse/track/${id}`;
break;
} }
return window.location;
} }
/** /**
@@ -334,10 +327,11 @@ function updateURL() {
setInterval(function () { setInterval(function () {
const title = elements.getText("title"); const title = elements.getText("title");
const artists = elements.getArtists(); const artists = elements.getArtists();
muteArtistIfFoundInMutedArtistsList(); // doing this here so that nothing can possibly fail before we call this function
const album = elements.getAlbumName(); const album = elements.getAlbumName();
const current = elements.getText("current"); const current = elements.getText("current");
const duration = elements.getText("duration"); const duration = elements.getText("duration");
const progressBarcurrentTime = elements.get("bar").getAttribute("aria-valuenow");
const songDashArtistTitle = `${title} - ${artists}`; const songDashArtistTitle = `${title} - ${artists}`;
const currentStatus = getCurrentlyPlayingStatus(); const currentStatus = getCurrentlyPlayingStatus();
const options = { const options = {
@@ -345,72 +339,48 @@ setInterval(function () {
message: artists, message: artists,
album: album, album: album,
status: currentStatus, status: currentStatus,
url: currentURL, url: getTrackURL(),
current: current, current,
duration: duration, duration,
"app-name": appName, "app-name": appName,
}; };
const playStatusChanged = currentStatus !== currentPlayStatus;
const progressBarTimeChanged = progressBarcurrentTime !== progressBarTime;
const titleOrArtistChanged = currentSong !== songDashArtistTitle; const titleOrArtistChanged = currentSong !== songDashArtistTitle;
muteArtistIfFoundInMutedArtistsList();
if (titleOrArtistChanged || playStatusChanged || progressBarTimeChanged || currentTimeChanged) { // update title, url and play info with new info
// update title, url and play info with new info setTitle(songDashArtistTitle);
setTitle(songDashArtistTitle); getTrackURL();
updateURL(); currentSong = songDashArtistTitle;
currentSong = songDashArtistTitle; currentPlayStatus = currentStatus;
currentPlayStatus = currentStatus;
// check progress bar value and make sure current stays up to date after switch const image = elements.getSongIcon();
if (progressBarTime != progressBarcurrentTime && !titleOrArtistChanged) {
progressBarTime = progressBarcurrentTime; new Promise((resolve) => {
currentTime = options.current; if (image.startsWith("http")) {
options.duration = duration; options.image = image;
currentTimeChanged = true; downloadFile(image, notificationPath).then(
() => {
options.icon = notificationPath;
resolve();
},
() => {
// if the image can't be downloaded then continue without it
resolve();
}
);
} else {
// if the image can't be found on the page continue without it
resolve();
} }
}).then(
if (currentTimeChanged) { () => {
if (options.current == currentTime && currentStatus != "paused") return; updateMediaInfo(options, titleOrArtistChanged);
currentTime = options.current; },
currentTimeChanged = false; () => {}
} );
// make sure current is set to 0 if title changes
if (titleOrArtistChanged) {
options.current = "0:00";
currentTime = options.current;
progressBarTime = progressBarcurrentTime;
}
const image = elements.getSongIcon();
new Promise((resolve) => {
if (image.startsWith("http")) {
options.image = image;
downloadFile(image, notificationPath).then(
() => {
options.icon = notificationPath;
resolve();
},
() => {
// if the image can't be downloaded then continue without it
resolve();
}
);
} else {
// if the image can't be found on the page continue without it
resolve();
}
}).then(
() => {
updateMediaInfo(options, titleOrArtistChanged);
},
() => {}
);
}
/** /**
* Checks whether the current artist is included in the "muted artists" list and if so it will automatically mute the player * Checks whether the current artist is included in the "muted artists" list and if so it will automatically mute the player
@@ -423,13 +393,13 @@ setInterval(function () {
isMutedArtist = true; isMutedArtist = true;
elements.click("volume"); elements.click("volume");
} }
} else if (currentStatus === statuses.playing && isMutedArtist && elements.isMuted()) { } else if (isMutedArtist && elements.isMuted()) {
elements.click("volume"); elements.click("volume");
isMutedArtist = false; isMutedArtist = false;
} }
} }
} }
}, 500); }, 1000);
if (process.platform === "linux" && store.get(settings.mpris)) { if (process.platform === "linux" && store.get(settings.mpris)) {
try { try {

View File

@@ -1,6 +1,7 @@
const { Menu, app } = require("electron"); const { Menu, app } = require("electron");
const { showSettingsWindow } = require("./settings"); const { showSettingsWindow } = require("./settings");
const isMac = process.platform === "darwin"; const isMac = process.platform === "darwin";
const { name } = require("./../constants/values");
const settingsMenuEntry = { const settingsMenuEntry = {
label: "Settings", label: "Settings",
@@ -15,97 +16,107 @@ const quitMenuEntry = {
click() { click() {
app.exit(0); app.exit(0);
}, },
accelerator: "Control+Q" accelerator: "Control+Q",
}; };
const mainMenu = [ const menuModule = {};
...(isMac
? [ menuModule.getMenu = function (mainWindow) {
{ const toggleWindow = {
label: app.name, label: "Toggle Window",
submenu: [ click: function () {
{ role: "about" }, mainWindow.isVisible() ? mainWindow.hide() : mainWindow.show();
settingsMenuEntry,
{ type: "separator" },
{ role: "services" },
{ type: "separator" },
{ role: "hide" },
{ role: "hideothers" },
{ role: "unhide" },
{ type: "separator" },
quitMenuEntry,
],
},
]
: []),
{
label: "File",
submenu: [settingsMenuEntry, isMac ? { role: "close" } : quitMenuEntry],
},
{
label: "Edit",
submenu: [
{ role: "undo" },
{ role: "redo" },
{ type: "separator" },
{ role: "cut" },
{ role: "copy" },
{ role: "paste" },
...(isMac
? [
{ role: "pasteAndMatchStyle" },
{ role: "delete" },
{ role: "selectAll" },
{ type: "separator" },
{
label: "Speech",
submenu: [{ role: "startspeaking" }, { role: "stopspeaking" }],
},
]
: [{ role: "delete" }, { type: "separator" }, { role: "selectAll" }]),
{ type: "separator" },
settingsMenuEntry,
],
},
{
label: "View",
submenu: [
{ role: "reload" },
{ role: "forcereload" },
{ type: "separator" },
{ role: "resetzoom" },
{ role: "zoomin" },
{ role: "zoomout" },
{ type: "separator" },
{ role: "togglefullscreen" },
],
},
{
label: "Window",
submenu: [
{ role: "minimize" },
...(isMac
? [{ type: "separator" }, { role: "front" }, { type: "separator" }, { role: "window" }]
: [{ role: "close" }]),
],
},
settingsMenuEntry,
{
label: "About",
click() {
showSettingsWindow("about");
}, },
}, };
];
const menuModule = { mainMenu }; const mainMenu = [
...(isMac
? [
{
label: name,
submenu: [
{ role: "about" },
settingsMenuEntry,
{ type: "separator" },
{ role: "services" },
{ type: "separator" },
{ role: "hide" },
{ role: "hideothers" },
{ role: "unhide" },
{ type: "separator" },
quitMenuEntry,
],
},
]
: []),
{
label: "File",
submenu: [settingsMenuEntry, isMac ? { role: "close" } : quitMenuEntry],
},
{
label: "Edit",
submenu: [
{ role: "undo" },
{ role: "redo" },
{ type: "separator" },
{ role: "cut" },
{ role: "copy" },
{ role: "paste" },
...(isMac
? [
{ role: "pasteAndMatchStyle" },
{ role: "delete" },
{ role: "selectAll" },
{ type: "separator" },
{
label: "Speech",
submenu: [{ role: "startspeaking" }, { role: "stopspeaking" }],
},
]
: [{ role: "delete" }, { type: "separator" }, { role: "selectAll" }]),
{ type: "separator" },
settingsMenuEntry,
],
},
{
label: "View",
submenu: [
{ role: "reload" },
{ role: "forcereload" },
{ type: "separator" },
{ role: "resetzoom" },
{ role: "zoomin" },
{ role: "zoomout" },
{ type: "separator" },
{ role: "togglefullscreen" },
{ role: "toggledevtools" },
],
},
{
label: "Window",
submenu: [
{ role: "minimize" },
toggleWindow,
...(isMac
? [{ type: "separator" }, { role: "front" }, { type: "separator" }, { role: "window" }]
: [{ role: "close" }]),
],
},
settingsMenuEntry,
{
label: "About",
click() {
showSettingsWindow("about");
},
},
toggleWindow,
];
menuModule.getMenu = function () {
return Menu.buildFromTemplate(mainMenu); return Menu.buildFromTemplate(mainMenu);
}; };
menuModule.addMenu = function () { menuModule.addMenu = function (mainWindow) {
Menu.setApplicationMenu(menuModule.getMenu()); Menu.setApplicationMenu(menuModule.getMenu(mainWindow));
}; };
module.exports = menuModule; module.exports = menuModule;

View File

@@ -1,48 +1,21 @@
const { Tray, app } = require("electron"); const { Tray } = require("electron");
const { Menu } = require("electron"); const { getMenu } = require("./menu");
const { getMenu, mainMenu } = require("./menu");
const { store, settings } = require("./settings");
const trayModule = {}; const trayModule = {};
let tray; let tray;
trayModule.addTray = function (options = { icon: "" }) { trayModule.addTray = function (mainWindow, options = { icon: "" }) {
tray = new Tray(options.icon); tray = new Tray(options.icon);
tray.setIgnoreDoubleClickEvents(true);
tray.setToolTip("Tidal-hifi");
const menu = getMenu(mainWindow);
tray.setContextMenu(menu);
}; };
trayModule.refreshTray = function (mainWindow) { trayModule.refreshTray = function (mainWindow) {
if (!tray) { if (!tray) {
trayModule.addTray(); trayModule.addTray(mainWindow);
}
tray.on("click", function (e) {
if (mainWindow) {
mainWindow.show();
}
});
tray.setToolTip("Tidal-hifi");
if (mainWindow && store.get(settings.minimizeOnClose)) {
tray.setContextMenu(
Menu.buildFromTemplate([
{
label: "Toggle Window",
click: function () {
mainWindow.isVisible() ? mainWindow.hide() : mainWindow.show();
},
},
{
label: "Quit",
click: function () {
mainWindow.destroy();
app.quit();
},
},
...mainMenu, //we add menu items from the other context
])
);
} else {
tray.setContextMenu(getMenu());
} }
}; };