diff --git a/CHANGELOG.md b/CHANGELOG.md index 764e5ec83..7d799c87d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,18 @@ 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.7.0 + +- Switched to the native Notifier (removed node-notifier) +- Album art now also has a name, based on [best effort](https://github.com/Mastermindzh/tidal-hifi/pull/88#pullrequestreview-840814847) + +## 2.6.0 + +- Add album images to mediainfo and discord + ## 2.5.0 - Notify-send now correctly shows "Tidal Hifi" as the program name - - Updated dependencies (including electron itself) ### known issues diff --git a/README.md b/README.md index 1e938c36f..72b14f81f 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ To install and work with the code on this project follow these steps: - API for status and playback - Custom [integrations](#integrations) - [Settings feature](./docs/settings.png) to disable certain functionality. (`ctrl+=`) +- AlbumArt in integrations ([best-effort](https://github.com/Mastermindzh/tidal-hifi/pull/88#pullrequestreview-840814847)) ## Integrations diff --git a/package-lock.json b/package-lock.json index 04bb8666b..39ff278f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tidal-hifi", - "version": "2.5.1", + "version": "2.7.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tidal-hifi", - "version": "2.5.1", + "version": "2.7.0", "license": "MIT", "dependencies": { "discord-rpc": "^4.0.1", @@ -14,7 +14,6 @@ "express": "^4.17.1", "hotkeys-js": "^3.8.7", "mpris-service": "^2.1.2", - "node-notifier": "^10.0.0", "request": "^2.88.2" }, "devDependencies": { @@ -2477,11 +2476,6 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2753,17 +2747,6 @@ "node": ">= 0.4" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2875,17 +2858,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -2913,7 +2885,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "node_modules/isstream": { "version": "0.1.2", @@ -3351,27 +3324,6 @@ "node": "4.x || >=6.0.0" } }, - "node_modules/node-notifier": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.0.tgz", - "integrity": "sha512-ZTqP90y1eyb2xAZTa7j4AlAayTwh6cL8mn0nlJhLDq8itXGnJUmQGYOnpaMUvqZVfGo0vhU7KZ3HtDW6CT2SiQ==", - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", - "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - } - }, - "node_modules/node-notifier/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4182,11 +4134,6 @@ "node": ">=8" } }, - "node_modules/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, "node_modules/signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", @@ -4722,6 +4669,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -6858,11 +6806,6 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -7055,11 +6998,6 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7135,14 +7073,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, "is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -7164,7 +7094,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -7515,26 +7446,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, - "node-notifier": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.0.tgz", - "integrity": "sha512-ZTqP90y1eyb2xAZTa7j4AlAayTwh6cL8mn0nlJhLDq8itXGnJUmQGYOnpaMUvqZVfGo0vhU7KZ3HtDW6CT2SiQ==", - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.5", - "shellwords": "^0.1.1", - "uuid": "^8.3.2", - "which": "^2.0.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -8183,11 +8094,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, "signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", @@ -8616,6 +8522,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/package.json b/package.json index f38fdbfe7..4cc853d98 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidal-hifi", - "version": "2.5.0", + "version": "2.7.0", "description": "Tidal on Electron with widevine(hifi) support", "main": "src/main.js", "scripts": { @@ -28,7 +28,6 @@ "express": "^4.17.1", "hotkeys-js": "^3.8.7", "mpris-service": "^2.1.2", - "node-notifier": "^10.0.0", "request": "^2.88.2" }, "devDependencies": { diff --git a/src/preload.js b/src/preload.js index 00872553a..89d8067a4 100644 --- a/src/preload.js +++ b/src/preload.js @@ -1,5 +1,5 @@ const { setTitle } = require("./scripts/window-functions"); -const { dialog, process } = require("electron").remote; +const { dialog, process, Notification } = require("electron").remote; const { store, settings } = require("./scripts/settings"); const { ipcRenderer } = require("electron"); const { app } = require("electron").remote; @@ -7,7 +7,6 @@ const { downloadFile } = require("./scripts/download"); const statuses = require("./constants/statuses"); const hotkeys = require("./scripts/hotkeys"); const globalEvents = require("./constants/globalEvents"); -const notifier = require("node-notifier"); const notificationPath = `${app.getPath("userData")}/notification.jpg`; let currentSong = ""; let player; @@ -39,6 +38,10 @@ const elements = { duration: '*[data-test="duration-time"]', bar: '*[data-test="progress-bar"]', footer: "#footerPlayer", + album_header_title: '.header-details [data-test="title"]', + playing_title: 'span[data-test="table-cell-title"].css-geqnfr', + album_name_cell: '[data-test="table-cell-album"]', + tracklist_row: '[data-test="tracklist-row"]', /** * Get an element from the dom @@ -77,6 +80,26 @@ const elements = { return "unknown artist(s)"; }, + getAlbumName: function () { + //If listening to an album, get its name from the header title + if(window.location.href.includes('/album/')) { + const albumName = window.document.querySelector(this.album_header_title); + if(albumName) { + return albumName.textContent; + } + //If listening to a playlist or a mix, get album name from the list + } else if(window.location.href.includes('/playlist/') || window.location.href.includes('/mix/')) { + if(currentPlayStatus === statuses.playing) { + const row = window.document.querySelector(this.playing_title).closest(this.tracklist_row); + if(row) { + return row.querySelector(this.album_name_cell).textContent; + } + } + } + + return ""; + }, + /** * Shorthand function to get the text of a dom element * @param {*} key key in elements object to fetch @@ -251,13 +274,16 @@ function convertDuration(duration) { function updateMediaInfo(options, notify) { if (options) { ipcRenderer.send(globalEvents.updateInfo, options); - store.get(settings.notifications) && notify && notifier.notify(options); + if(store.get(settings.notifications) && notify) { + new Notification({ title: options.title, body: options.message, icon: options.icon}).show(); + } if (player) { player.metadata = { ...player.metadata, ...{ "xesam:title": options.title, "xesam:artist": [options.message], + "xesam:album": options.album, "mpris:artUrl": options.image, "mpris:length": convertDuration(options.duration) * 1000 * 1000, }, @@ -290,6 +316,7 @@ function updateURL() { setInterval(function () { const title = elements.getText("title"); const artists = elements.getArtists(); + const album = elements.getAlbumName(); const current = elements.getText("current"); const duration = elements.getText("duration"); const appName = "Tidal Hifi"; @@ -299,6 +326,7 @@ setInterval(function () { const options = { title, message: artists, + album: album, status: currentStatus, url: currentURL, current: current, diff --git a/src/scripts/discord.js b/src/scripts/discord.js index 7560c0901..28b94fc6e 100644 --- a/src/scripts/discord.js +++ b/src/scripts/discord.js @@ -32,6 +32,7 @@ const observer = (event, arg) => { startTimestamp: parseInt(now), endTimestamp: parseInt(remaining), largeImageKey: mediaInfoModule.mediaInfo.image, + largeImageText: (mediaInfoModule.mediaInfo.album) ? mediaInfoModule.mediaInfo.album : `${idleStatus.largeImageText}`, buttons: [{ label: "Play on Tidal", url: mediaInfoModule.mediaInfo.url }], }, }); diff --git a/src/scripts/mediaInfo.js b/src/scripts/mediaInfo.js index ecc37ee66..ab5b30bad 100644 --- a/src/scripts/mediaInfo.js +++ b/src/scripts/mediaInfo.js @@ -3,6 +3,7 @@ const statuses = require("./../constants/statuses"); const mediaInfo = { title: "", artist: "", + album: "", icon: "", status: statuses.paused, url: "", @@ -20,6 +21,7 @@ const mediaInfoModule = { mediaInfoModule.update = function (arg) { mediaInfo.title = propOrDefault(arg.title); mediaInfo.artist = propOrDefault(arg.message); + mediaInfo.album = propOrDefault(arg.album); mediaInfo.icon = propOrDefault(arg.icon); mediaInfo.url = propOrDefault(arg.url); mediaInfo.status = propOrDefault(arg.status);