From de2d31631aada158d9560dd5999a01fa7192277c Mon Sep 17 00:00:00 2001 From: BigBrainAFK Date: Sat, 23 Nov 2019 01:39:57 +0100 Subject: [PATCH] Added media player buttons to Windows preview --- main.js | 106 +++++++++++++++++- package.json | 15 ++- .../assets}/build/linux/icon_2048x2048.png | Bin .../assets}/build/osx/icon.icns | Bin .../assets}/build/win/icon.ico | Bin .../assets}/images/Youtube Music logo.svg | 0 .../assets}/images/Youtube-Music-logo.png | Bin resources/assets/images/next.png | Bin 0 -> 8813 bytes resources/assets/images/next.svg | 11 ++ resources/assets/images/pause.png | Bin 0 -> 4862 bytes resources/assets/images/pause.svg | 11 ++ resources/assets/images/play.png | Bin 0 -> 7329 bytes resources/assets/images/play.svg | 11 ++ resources/assets/images/prev.png | Bin 0 -> 9477 bytes resources/assets/images/prev.svg | 11 ++ .../assets}/rpc/Youttube Music Pause.png | Bin .../assets}/rpc/Youtube Music Pause.svg | 0 {assets => resources/assets}/rpc/pause.png | Bin {assets => resources/assets}/rpc/pause.svg | 0 {assets => resources/assets}/rpc/play.png | Bin {assets => resources/assets}/rpc/play.svg | 0 21 files changed, 155 insertions(+), 10 deletions(-) rename {assets => resources/assets}/build/linux/icon_2048x2048.png (100%) rename {assets => resources/assets}/build/osx/icon.icns (100%) rename {assets => resources/assets}/build/win/icon.ico (100%) rename {assets => resources/assets}/images/Youtube Music logo.svg (100%) rename {assets => resources/assets}/images/Youtube-Music-logo.png (100%) create mode 100644 resources/assets/images/next.png create mode 100644 resources/assets/images/next.svg create mode 100644 resources/assets/images/pause.png create mode 100644 resources/assets/images/pause.svg create mode 100644 resources/assets/images/play.png create mode 100644 resources/assets/images/play.svg create mode 100644 resources/assets/images/prev.png create mode 100644 resources/assets/images/prev.svg rename {assets => resources/assets}/rpc/Youttube Music Pause.png (100%) rename {assets => resources/assets}/rpc/Youtube Music Pause.svg (100%) rename {assets => resources/assets}/rpc/pause.png (100%) rename {assets => resources/assets}/rpc/pause.svg (100%) rename {assets => resources/assets}/rpc/play.png (100%) rename {assets => resources/assets}/rpc/play.svg (100%) diff --git a/main.js b/main.js index 5cf91ff..b79e951 100644 --- a/main.js +++ b/main.js @@ -1,13 +1,17 @@ 'use strict'; const DiscordRPC = require('discord-rpc'); -const { app, BrowserWindow, Menu } = require('electron'); +const { app, BrowserWindow, Menu, nativeImage } = require('electron'); +const path = require('path'); let reconnectTimer; +const resourcePath = process.platform === 'darwin' ? 'Contents/Resources' : 'resources'; + function executeJavaScript(code) { return new Promise(resolve => { win.webContents.executeJavaScript(code, resolve); }); } + let win; const menuTemplate = [ { @@ -18,6 +22,10 @@ const menuTemplate = [ }, ]; +if (process.platform === 'darwin') { + menuTemplate.unshift({}); +} + function createWindow() { // Create the browser window. win = new BrowserWindow({ width: 800, height: 700 }); @@ -56,6 +64,7 @@ function getContent() { artist, time, paused, + isFirst, result; result = @@ -77,7 +86,10 @@ function getContent() { if (!result) return reject('Error grabbing time'); paused = result !== 'Pause'; - return resolve({ title, artist, time, paused }); + result = await executeJavaScript('document.querySelector(\'div.ytmusic-player-queue\').firstElementChild.selected'); + isFirst = result; + + return resolve({ title, artist, time, paused, isFirst }); }); } @@ -89,18 +101,21 @@ let startTimestamp = new Date(), endTimestamp, prevSong; -async function setActivity() { +let songInfo; + +function setActivity() { if (!rpc || !win) { return; } // eslint-disable-next-line no-empty-function - const { title, artist, time, paused } = await getContent().catch(() => {}) || + const { title, artist, time, paused } = songInfo || { title: undefined, artist: undefined, time: undefined, paused: undefined, + isFirst: undefined, }; const now = new Date(); @@ -146,6 +161,84 @@ async function setActivity() { rpc.setActivity(activity); } + +async function updateSongInfo() { + if (!rpc || !win) { + return; + } + + songInfo = await getContent().catch(() => null); + + // eslint-disable-next-line no-empty-function + const { title, artist, time, paused, isFirst } = songInfo || + { + title: undefined, + artist: undefined, + time: undefined, + paused: undefined, + isFirst: undefined, + }; + + win.setThumbnailClip({ + x: 0, + y: 0, + width: 0, + height: 0, + }); + + const toolTipButtons = [ + { + tooltip: 'Previous Song', + icon: getNativeImage('assets/images/prev.png'), + async click() { + await executeJavaScript('document.querySelector(\'paper-icon-button.previous-button\').click();'); + }, + }, { + tooltip: 'Play', + icon: getNativeImage('assets/images/play.png'), + async click() { + await executeJavaScript('document.querySelector(\'paper-icon-button.play-pause-button\').click();'); + }, + }, { + tooltip: 'Next Song', + icon: getNativeImage('assets/images/next.png'), + async click() { + await executeJavaScript('document.querySelector(\'paper-icon-button.next-button\').click();'); + }, + }, + ]; + + if (!title && !artist) { + if (process.platform === 'win32') { + win.setProgressBar(1.000000001); + } + win.setOverlayIcon(null, 'Browsing'); + } else if (process.platform === 'win32') { + win.setProgressBar(time[0] / time[1], { + mode: paused ? 'paused' : 'normal', + }); + + if (isFirst) { + toolTipButtons[0].flags = ['disabled']; + } + + if (paused) { + win.setOverlayIcon(getNativeImage('assets/images/pause.png'), 'Paused'); + win.setThumbarButtons(toolTipButtons); + } else if (prevSong !== { title, artist }) { + prevSong = { title, artist }; + win.setOverlayIcon(getNativeImage('assets/images/play.png'), 'Listening'); + + toolTipButtons[1].tooltip = 'Pause'; + toolTipButtons[1].icon = getNativeImage('assets/images/pause.png'); + + win.setThumbarButtons(toolTipButtons); + } + } else { + win.setProgressBar(time[0] / time[1]); + } +} + rpc.once('disconnected', () => { rpc = null; reconnectTimer = setInterval(reconnect, 5e3); @@ -162,9 +255,14 @@ function reconnect() { }); } +function getNativeImage(filePath) { + return nativeImage.createFromPath(path.join(process.cwd(), resourcePath, filePath)); +} + rpc.on('ready', () => { setActivity(); setInterval(setActivity, 15e3); + setInterval(updateSongInfo, 100); }); // eslint-disable-next-line no-console diff --git a/package.json b/package.json index c07f092..fd26ee0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "youtube_music_client", - "version": "1.0.2", + "version": "1.1.0", "description": "YouTube Music Client with Discord RPC support", "main": "main.js", "scripts": { @@ -53,14 +53,14 @@ "appId": "youtube.music.client", "mac": { "category": "youtube.music.client", - "icon": "assets/build/osx/icon.icns", + "icon": "resources/assets/build/osx/icon.icns", "target": [ "zip", "dmg" ] }, "win": { - "icon": "assets/build/win/icon.ico" + "icon": "resources/assets/build/win/icon.ico" }, "nsis": { "artifactName": "${productName}-Setup-${version}.${ext}", @@ -68,7 +68,7 @@ }, "linux": { "target": "AppImage", - "icon": "assets/build/linux/icon_2048x2048.png", + "icon": "resources/assets/build/linux/icon_2048x2048.png", "synopsis": "Small YouTube Music App with DiscordRPC integration", "description": "A small Electron app for YouTube Music which also integrates with Discord using its RPC functionallity", "maintainer": "BigBrainAFK", @@ -80,8 +80,11 @@ "!dist_old/*" ], "directories": { - "buildResources": "assets/*", + "buildResources": "resources/assets/*", "output": "dist" - } + }, + "extraFiles": [ + "resources/assets/images/*.png" + ] } } diff --git a/assets/build/linux/icon_2048x2048.png b/resources/assets/build/linux/icon_2048x2048.png similarity index 100% rename from assets/build/linux/icon_2048x2048.png rename to resources/assets/build/linux/icon_2048x2048.png diff --git a/assets/build/osx/icon.icns b/resources/assets/build/osx/icon.icns similarity index 100% rename from assets/build/osx/icon.icns rename to resources/assets/build/osx/icon.icns diff --git a/assets/build/win/icon.ico b/resources/assets/build/win/icon.ico similarity index 100% rename from assets/build/win/icon.ico rename to resources/assets/build/win/icon.ico diff --git a/assets/images/Youtube Music logo.svg b/resources/assets/images/Youtube Music logo.svg similarity index 100% rename from assets/images/Youtube Music logo.svg rename to resources/assets/images/Youtube Music logo.svg diff --git a/assets/images/Youtube-Music-logo.png b/resources/assets/images/Youtube-Music-logo.png similarity index 100% rename from assets/images/Youtube-Music-logo.png rename to resources/assets/images/Youtube-Music-logo.png diff --git a/resources/assets/images/next.png b/resources/assets/images/next.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8e881988f4979f044b215f8347d512014570ba GIT binary patch literal 8813 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 + + + + + + + diff --git a/resources/assets/images/pause.png b/resources/assets/images/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..ae089f74f01b15b6be82c034020ccf811468b8f0 GIT binary patch literal 4862 zcmeAS@N?(olHy`uVBq!ia0y~yV15C@9Be=l-^Ev+04d25*NBqf{Irtt#G+IN$CUh} zR0Yr6#Prml)Wnp^!jq{s3=BdGJY5_^DsH{Gevr38LBQ4VT7-aVhG$rkXB3m{Le+}m zqcgd`%R5yp1)4VsMnhmU1n`Eygvc2T$F5h~uW@kFRWdW4@Zs#8_lu*NO60$HT;(#@ zc9Z1;cQ+@4-0FM24EGFXf{bFZ0ul-r7#SEG7BB;uOtPbblmv(Xuo#4dCqpA2EIdaA zK?#if0BLYwhiT_10kXj1IVuQFVB`k~IO~J8gR?#)JVymV35?_bF$bmZ(Xa$nA=FDp zqty}(s$}v@VQ_SeY6rKF&}($^OJNEN@nNVvk7=}uhZUn#i{1n?#y^KLnS`>`4%}q{ nhVLjC4S~@Rz#jtp9tkBdlzRv)@i>-y2&B~0)z4*}Q$iB}{&%)E literal 0 HcmV?d00001 diff --git a/resources/assets/images/pause.svg b/resources/assets/images/pause.svg new file mode 100644 index 0000000..cff06a1 --- /dev/null +++ b/resources/assets/images/pause.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/resources/assets/images/play.png b/resources/assets/images/play.png new file mode 100644 index 0000000000000000000000000000000000000000..8df65362d1182f72496125656027b21b4e2d17c6 GIT binary patch literal 7329 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 lc`$(o6Zk(9s63bZP^iLp($RmeJL=)$ + + + + + + + diff --git a/resources/assets/images/prev.png b/resources/assets/images/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..d091fd9705ddb758339433c600da384c3407a8ff GIT binary patch literal 9477 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 RFkp#qz7aF0Y_@LwzX294fi3_5 literal 0 HcmV?d00001 diff --git a/resources/assets/images/prev.svg b/resources/assets/images/prev.svg new file mode 100644 index 0000000..d662305 --- /dev/null +++ b/resources/assets/images/prev.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/assets/rpc/Youttube Music Pause.png b/resources/assets/rpc/Youttube Music Pause.png similarity index 100% rename from assets/rpc/Youttube Music Pause.png rename to resources/assets/rpc/Youttube Music Pause.png diff --git a/assets/rpc/Youtube Music Pause.svg b/resources/assets/rpc/Youtube Music Pause.svg similarity index 100% rename from assets/rpc/Youtube Music Pause.svg rename to resources/assets/rpc/Youtube Music Pause.svg diff --git a/assets/rpc/pause.png b/resources/assets/rpc/pause.png similarity index 100% rename from assets/rpc/pause.png rename to resources/assets/rpc/pause.png diff --git a/assets/rpc/pause.svg b/resources/assets/rpc/pause.svg similarity index 100% rename from assets/rpc/pause.svg rename to resources/assets/rpc/pause.svg diff --git a/assets/rpc/play.png b/resources/assets/rpc/play.png similarity index 100% rename from assets/rpc/play.png rename to resources/assets/rpc/play.png diff --git a/assets/rpc/play.svg b/resources/assets/rpc/play.svg similarity index 100% rename from assets/rpc/play.svg rename to resources/assets/rpc/play.svg