diff --git a/CHANGELOG.md b/CHANGELOG.md index ad19ee4..c466dbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ 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). +## 4.4.0 + +- Updated shortcut hint on the menubar to reflect the new `ctrl+=` shortcut. +- Reverted icon path to `icon.png` instead of the hardcoded linux path. +- Add support to autoHide the menubar and showing it with the `alt` key. +- Move the quit command from the system sub-menu to the main menu +- Added single click focus/show on the tray icon + - Doesn't work on all platforms. Nothing I can do about that unfortunately! +- Added a list of artists to automatically skip. + - I don't like the vast majority of dutch music so I added one of them to my list to test: [./docs/no-dutch-music.mp4](./docs/no-dutch-music.mp4) + ## 4.3.1 - fix: App always requests a default-url-handler-scheme change on start diff --git a/build/electron-builder.base.yml b/build/electron-builder.base.yml index daef921..206adfa 100644 --- a/build/electron-builder.base.yml +++ b/build/electron-builder.base.yml @@ -18,7 +18,7 @@ linux: Name: TIDAL Hi-Fi GenericName: TIDAL Hi-Fi Comment: The web version of listen.tidal.com running in electron with hifi support thanks to widevine. - Icon: /usr/share/icons/hicolor/0x0/apps/tidal-hifi.png + Icon: icon.png StartupNotify: true Terminal: false Type: Application diff --git a/docs/no-dutch-music.mp4 b/docs/no-dutch-music.mp4 new file mode 100644 index 0000000..d20de1b Binary files /dev/null and b/docs/no-dutch-music.mp4 differ diff --git a/package.json b/package.json index eddca5d..7efda62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidal-hifi", - "version": "4.3.1", + "version": "4.4.0", "description": "Tidal on Electron with widevine(hifi) support", "main": "src/main.js", "scripts": { @@ -50,4 +50,4 @@ "sass-lint-auto-fix": "^0.21.2" }, "prettier": "@mastermindzh/prettier-config" -} \ No newline at end of file +} diff --git a/src/constants/settings.js b/src/constants/settings.js index f84bc40..1a4e7ff 100644 --- a/src/constants/settings.js +++ b/src/constants/settings.js @@ -15,6 +15,8 @@ const settings = { playBackControl: "playBackControl", muteArtists: "muteArtists", mutedArtists: "mutedArtists", + skipArtists: "skipArtists", + skippedArtists: "skippedArtists", disableBackgroundThrottle: "disableBackgroundThrottle", apiSettings: { root: "apiSettings", diff --git a/src/main.js b/src/main.js index 234c105..c09e380 100644 --- a/src/main.js +++ b/src/main.js @@ -49,7 +49,10 @@ function setFlags() { * */ function syncMenuBarWithStore() { - mainWindow.setMenuBarVisibility(store.get(settings.menuBar)); + const fixedMenuBar = store.get(settings.menuBar); + + mainWindow.autoHideMenuBar = !fixedMenuBar; + mainWindow.setMenuBarVisibility(fixedMenuBar); } /** @@ -78,6 +81,7 @@ function createWindow(options = {}) { height: store && store.get(settings.windowBounds.height), icon, backgroundColor: options.backgroundColor, + autoHideMenuBar: true, webPreferences: { preload: path.join(__dirname, "preload.js"), plugins: true, @@ -123,7 +127,7 @@ function registerHttpProtocols() { protocol.registerHttpProtocol(PROTOCOL_PREFIX, (request, _callback) => { mainWindow.loadURL(`${tidalUrl}/${request.url.substring(PROTOCOL_PREFIX.length + 3)}`); }); - if (!app.isDefaultProtocolClient(PROTOCOL_PREFIX)) { + if (!app.isDefaultProtocolClient(PROTOCOL_PREFIX)) { app.setAsDefaultProtocolClient(PROTOCOL_PREFIX); } } diff --git a/src/pages/settings/preload.js b/src/pages/settings/preload.js index fc663a9..49c23a8 100644 --- a/src/pages/settings/preload.js +++ b/src/pages/settings/preload.js @@ -4,12 +4,14 @@ let trayIcon, enableCustomHotkeys, enableDiscord, muteArtists, + skipArtists, notifications, playBackControl, api, port, menuBar, mutedArtists, + skippedArtists, disableBackgroundThrottle, singleInstance, disableHardwareMediaKeys, @@ -36,6 +38,8 @@ function refreshSettings() { minimizeOnClose.checked = store.get(settings.minimizeOnClose); muteArtists.checked = store.get(settings.muteArtists); mutedArtists.value = store.get(settings.mutedArtists).join("\n"); + skipArtists.checked = store.get(settings.skipArtists); + skippedArtists.value = store.get(settings.skippedArtists).join("\n"); singleInstance.checked = store.get(settings.singleInstance); disableHardwareMediaKeys.checked = store.get(settings.flags.disableHardwareMediaKeys); gpuRasterization.checked = store.get(settings.flags.gpuRasterization); @@ -119,6 +123,8 @@ window.addEventListener("DOMContentLoaded", () => { enableDiscord = get("enableDiscord"); muteArtists = get("muteArtists"); mutedArtists = get("mutedArtists"); + skipArtists = get("skipArtists"); + skippedArtists = get("skippedArtists"); disableBackgroundThrottle = get("disableBackgroundThrottle"); singleInstance = get("singleInstance"); disableHardwareMediaKeys = get("disableHardwareMediaKeys"); @@ -138,6 +144,8 @@ window.addEventListener("DOMContentLoaded", () => { addInputListener(minimizeOnClose, settings.minimizeOnClose); addInputListener(muteArtists, settings.muteArtists); addTextAreaListener(mutedArtists, settings.mutedArtists); + addInputListener(skipArtists, settings.skipArtists); + addTextAreaListener(skippedArtists, settings.skippedArtists); addInputListener(disableBackgroundThrottle, settings.disableBackgroundThrottle); addInputListener(singleInstance, settings.singleInstance); addInputListener(disableHardwareMediaKeys, settings.flags.disableHardwareMediaKeys); diff --git a/src/pages/settings/settings.html b/src/pages/settings/settings.html index 6ec8991..85bf67f 100644 --- a/src/pages/settings/settings.html +++ b/src/pages/settings/settings.html @@ -63,13 +63,25 @@ +
+
+

Skip Artists automatically

+

The following list of artists (1 per line) will be skipped automatically.

+
+ +
+ +

UI

-

Menubar

-

Show TIDAL Hi-Fi's menu bar.

+

Fixed menubar

+

Always show TIDAL Hi-Fi's menu bar.

- \ No newline at end of file + diff --git a/src/preload.js b/src/preload.js index 4cf3a65..e23d6ed 100644 --- a/src/preload.js +++ b/src/preload.js @@ -7,6 +7,7 @@ const { downloadFile } = require("./scripts/download"); const statuses = require("./constants/statuses"); const hotkeys = require("./scripts/hotkeys"); const globalEvents = require("./constants/globalEvents"); +const { skipArtists } = require("./constants/settings"); const notificationPath = `${app.getPath("userData")}/notification.jpg`; const appName = "Tidal Hifi"; let currentSong = ""; @@ -327,8 +328,9 @@ function getTrackURL() { setInterval(function () { const title = elements.getText("title"); const artists = elements.getArtists(); - muteArtistIfFoundInMutedArtistsList(); // doing this here so that nothing can possibly fail before we call this function - + skipArtistsIfFoundInSkippedArtistsList(artists); + muteArtistIfFoundInMutedArtistsList(artists); // doing this here so that nothing can possibly fail before we call this function + const album = elements.getAlbumName(); const current = elements.getText("current"); const duration = elements.getText("duration"); @@ -344,12 +346,9 @@ setInterval(function () { duration, "app-name": appName, }; - - const titleOrArtistChanged = currentSong !== songDashArtistTitle; - // update title, url and play info with new info setTitle(songDashArtistTitle); getTrackURL(); @@ -385,7 +384,7 @@ setInterval(function () { /** * Checks whether the current artist is included in the "muted artists" list and if so it will automatically mute the player */ - function muteArtistIfFoundInMutedArtistsList() { + function muteArtistIfFoundInMutedArtistsList(artists) { if (store.get(settings.muteArtists)) { const mutedArtists = store.get(settings.mutedArtists); if (mutedArtists.find((artist) => artist === artists) !== undefined) { @@ -399,6 +398,19 @@ setInterval(function () { } } } + + /** + * automatically skip a song if the artists are found in the list of artists to skip + * @param {*} artists list of artists to skip + */ + function skipArtistsIfFoundInSkippedArtistsList(artists) { + if (store.get(skipArtists)) { + const skippedArtists = store.get(settings.skippedArtists); + if (skippedArtists.find((artist) => artist === artists) !== undefined) { + elements.click("next"); + } + } + } }, 1000); if (process.platform === "linux" && store.get(settings.mpris)) { diff --git a/src/scripts/menu.js b/src/scripts/menu.js index 886684d..f62ded6 100644 --- a/src/scripts/menu.js +++ b/src/scripts/menu.js @@ -8,7 +8,7 @@ const settingsMenuEntry = { click() { showSettingsWindow(); }, - accelerator: "Control+/", + accelerator: "Control+=", }; const quitMenuEntry = { @@ -110,6 +110,7 @@ menuModule.getMenu = function (mainWindow) { }, }, toggleWindow, + quitMenuEntry, ]; return Menu.buildFromTemplate(mainMenu); diff --git a/src/scripts/settings.js b/src/scripts/settings.js index 0601934..fe79179 100644 --- a/src/scripts/settings.js +++ b/src/scripts/settings.js @@ -12,6 +12,8 @@ const store = new Store({ playBackControl: true, muteArtists: false, mutedArtists: ["TIDAL"], + skipArtists: false, + skippedArtists: [""], disableBackgroundThrottle: true, menuBar: true, apiSettings: { diff --git a/src/scripts/tray.js b/src/scripts/tray.js index 8d75a43..0000fe5 100644 --- a/src/scripts/tray.js +++ b/src/scripts/tray.js @@ -11,6 +11,10 @@ trayModule.addTray = function (mainWindow, options = { icon: "" }) { const menu = getMenu(mainWindow); tray.setContextMenu(menu); + + tray.on("click", function () { + mainWindow.isVisible() ? mainWindow.focus() : mainWindow.show(); + }); }; trayModule.refreshTray = function (mainWindow) {