From ccfe7434bf708ee58156c2952234a049706edfc2 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Wed, 10 Nov 2021 00:53:44 +0200 Subject: [PATCH 1/7] fix mpris --- plugins/shortcuts/back.js | 117 ++++++++++++++++++------------- preload.js | 4 ++ providers/song-controls-front.js | 30 ++++++++ providers/song-info-front.js | 10 +++ providers/song-info.js | 2 + 5 files changed, 113 insertions(+), 50 deletions(-) create mode 100644 providers/song-controls-front.js diff --git a/plugins/shortcuts/back.js b/plugins/shortcuts/back.js index c32d0f8d..ddb70c75 100644 --- a/plugins/shortcuts/back.js +++ b/plugins/shortcuts/back.js @@ -1,12 +1,10 @@ -const { globalShortcut } = require("electron"); +const { globalShortcut, ipcMain } = require("electron"); const is = require("electron-is"); const electronLocalshortcut = require("electron-localshortcut"); const getSongControls = require("../../providers/song-controls"); const { setupMPRIS } = require("./mpris"); const registerCallback = require("../../providers/song-info"); -let player; - function _registerGlobalShortcut(webContents, shortcut, action) { globalShortcut.register(shortcut, () => { action(webContents); @@ -31,54 +29,8 @@ function registerShortcuts(win, options) { _registerLocalShortcut(win, "CommandOrControl+F", search); _registerLocalShortcut(win, "CommandOrControl+L", search); - registerCallback(songInfo => { - if (player) { - player.metadata = { - 'mpris:length': songInfo.songDuration * 60 * 1000 * 1000, // In microseconds - 'mpris:artUrl': songInfo.imageSrc, - 'xesam:title': songInfo.title, - 'xesam:artist': songInfo.artist - }; - if (!songInfo.isPaused) { - player.playbackStatus = "Playing" - } - } - } - ) - if (is.linux()) { - try { - const MPRISPlayer = setupMPRIS(); - - MPRISPlayer.on("raise", () => { - win.setSkipTaskbar(false); - win.show(); - }); - MPRISPlayer.on("play", () => { - if (MPRISPlayer.playbackStatus !== 'Playing') { - MPRISPlayer.playbackStatus = 'Playing'; - playPause() - } - }); - MPRISPlayer.on("pause", () => { - if (MPRISPlayer.playbackStatus !== 'Paused') { - MPRISPlayer.playbackStatus = 'Paused'; - playPause() - } - }); - MPRISPlayer.on("next", () => { - next() - }); - MPRISPlayer.on("previous", () => { - previous() - }); - - player = MPRISPlayer - - } catch (e) { - console.warn("Error in MPRIS", e); - } - } + if (is.linux()) registerMPRIS(); const { global, local } = options; const shortcutOptions = { global, local }; @@ -106,6 +58,71 @@ function registerShortcuts(win, options) { } } } + function registerMPRIS() { + try { + const secToMicro = n => Math.round(Number(n) * (1000 * 1000)); + const microToSec = n => Math.round(Number(n) / 1000 / 1000); + + const seekTo = e => win.webContents.send("seekTo", microToSec(e.position)); + const seek = o => win.webContents.send("seek", microToSec(o)); + + const player = setupMPRIS(); + + const mprisSeek = p => { + player.seeked(p); + } + win.webContents.send("registerOnSeek"); + + ipcMain.on('seeked', (_, t) => mprisSeek(secToMicro(t))); + + let currentSeconds = 0; + ipcMain.on('timeChanged', (_, t) => currentSeconds = t); + + player.getPosition = () => secToMicro(currentSeconds) + + player.on("raise", () => { + win.setSkipTaskbar(false); + win.show(); + }); + + player.on("play", () => { + if (player.playbackStatus !== 'Playing') { + player.playbackStatus = 'Playing'; + playPause() + } + }); + player.on("pause", () => { + if (player.playbackStatus !== 'Paused') { + player.playbackStatus = 'Paused'; + playPause() + } + }); + + player.on("playpause", playPause); + player.on("next", next); + player.on("previous", previous); + + player.on('seek', seek); + player.on('position', seekTo); + + registerCallback(songInfo => { + if (player) { + player.metadata = { + 'mpris:length': secToMicro(songInfo.songDuration), + 'mpris:artUrl': songInfo.imageSrc, + 'xesam:title': songInfo.title, + 'xesam:artist': songInfo.artist, + 'mpris:trackid': '/' + };; + mprisSeek(secToMicro(songInfo.elapsedSeconds)) + player.playbackStatus = songInfo.isPaused ? "Paused" : "Playing" + } + }) + + } catch (e) { + console.warn("Error in MPRIS", e); + } + } } module.exports = registerShortcuts; diff --git a/preload.js b/preload.js index 6c7c1b16..daffe887 100644 --- a/preload.js +++ b/preload.js @@ -6,6 +6,7 @@ const config = require("./config"); const { fileExists } = require("./plugins/utils"); const setupFrontLogger = require("./providers/front-logger"); const setupSongInfo = require("./providers/song-info-front"); +const { setupSongControls } = require("./providers/song-controls-front"); const plugins = config.plugins.getEnabled(); @@ -45,6 +46,9 @@ document.addEventListener("DOMContentLoaded", () => { // inject song-info provider setupSongInfo(); + // inject song-controls + setupSongControls(); + // inject front logger setupFrontLogger(); diff --git a/providers/song-controls-front.js b/providers/song-controls-front.js new file mode 100644 index 00000000..bb98ae30 --- /dev/null +++ b/providers/song-controls-front.js @@ -0,0 +1,30 @@ +const { ipcRenderer } = require("electron"); + +module.exports.seekTo = seekTo; +function seekTo(t) { + document.querySelector('video').currentTime = t; +} + +module.exports.seek = seek; +function seek(o) { + document.querySelector('video').currentTime += o; +} + +module.exports.setupSongControls = () => { + ipcRenderer.on("seekTo", async (_, t) => seekTo(t)); + ipcRenderer.on("seek", async (_, t) => seek(t)); + ipcRenderer.once("registerOnSeek", registerOnSeek) +}; + +async function registerOnSeek() { + const register = v => v.addEventListener('seeked', () => ipcRenderer.send('seeked', v.currentTime)); + let video = document.querySelector('video'); + if (video) { + register(video); + } + else { + document.addEventListener('apiLoaded', () => { + register(document.querySelector('video')) + }, { once: true, passive: true }) + } +} diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 4ff6041d..6e14dd7a 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -11,9 +11,19 @@ ipcRenderer.on("update-song-info", async (_, extractedSongInfo) => { module.exports = () => { document.addEventListener('apiLoaded', e => { + setupTimeChangeListener(); + document.querySelector('video').addEventListener('loadedmetadata', () => { const data = e.detail.getPlayerResponse(); ipcRenderer.send("song-info-request", JSON.stringify(data)); }); }, { once: true, passive: true }) }; + +function setupTimeChangeListener() { + const progressObserver = new MutationObserver(mutations => { + ipcRenderer.send('timeChanged', mutations[0].target.value); + global.songInfo.elapsedSeconds = mutations[0].target.value; + }); + progressObserver.observe(document.querySelector('#progress-bar'), { attributeFilter: ["value"] }) +} diff --git a/providers/song-info.js b/providers/song-info.js index 37cd55fa..ebd1d6c4 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -45,6 +45,7 @@ const songInfo = { songDuration: 0, elapsedSeconds: 0, url: "", + videoId: "", }; const handleData = async (responseText, win) => { @@ -57,6 +58,7 @@ const handleData = async (responseText, win) => { songInfo.image = await getImage(songInfo.imageSrc); songInfo.uploadDate = data?.microformat?.microformatDataRenderer?.uploadDate; songInfo.url = data?.microformat?.microformatDataRenderer?.urlCanonical?.split("&")[0]; + songInfo.videoId = data?.videoDetails?.videoId; // used for options.resumeOnStart config.set("url", data?.microformat?.microformatDataRenderer?.urlCanonical); From 9a7baeac231d7c5e4747eab779facee4b224a569 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Wed, 10 Nov 2021 18:37:16 +0200 Subject: [PATCH 2/7] fix tuna time update --- plugins/tuna-obs/back.js | 51 ++++++++++++++++++++++++++-------------- providers/song-info.js | 2 -- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index d9882e4d..b7a54719 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -1,33 +1,50 @@ -const { ipcRenderer } = require("electron"); +const { ipcMain } = require("electron"); const fetch = require('node-fetch'); const registerCallback = require("../../providers/song-info"); -const post = (data) => { +const secToMilisec = t => Math.round(Number(t) * 1000); +const data = { + cover_url: '', + title: '', + artists: [], + status: '', + progress: 0, + duration: 0, + album_url: '' +}; + +const post = async (data) => { const port = 1608; - headers = {'Content-Type': 'application/json', + headers = { + 'Content-Type': 'application/json', 'Accept': 'application/json', 'Access-Control-Allow-Headers': '*', - 'Access-Control-Allow-Origin': '*'} + 'Access-Control-Allow-Origin': '*' + } const url = `http://localhost:${port}/`; - fetch(url, {method: 'POST', headers, body:JSON.stringify({data})}); + fetch(url, { method: 'POST', headers, body: JSON.stringify({ data }) }); } -module.exports = async (win) => { - registerCallback((songInfo) => { +module.exports = async () => { + ipcMain.on('timeChanged', async (_, t) => { + if (!data.title) return; + data.progress = secToMilisec(t); + post(data); + }); - // Register the callback - if (songInfo.title.length === 0 && songInfo.artist.length === 0) { + registerCallback((songInfo) => { + if (!songInfo.title && !songInfo.artist) { return; } - const duration = Number(songInfo.songDuration)*1000 - const progress = Number(songInfo.elapsedSeconds)*1000 - const cover_url = songInfo.imageSrc - const album_url = songInfo.imageSrc - const title = songInfo.title - const artists = [songInfo.artist] - const status = !songInfo.isPaused ? 'Playing': 'Paused' - post({ cover_url, title, artists, status, progress, duration, album_url}); + data.duration = secToMilisec(songInfo.songDuration) + data.progress = secToMilisec(songInfo.elapsedSeconds) + data.cover_url = songInfo.imageSrc; + data.album_url = songInfo.imageSrc; + data.title = songInfo.title; + data.artists = [songInfo.artist]; + data.status = songInfo.isPaused ? 'Paused' : 'Playing'; + post(data); }) } diff --git a/providers/song-info.js b/providers/song-info.js index ebd1d6c4..37cd55fa 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -45,7 +45,6 @@ const songInfo = { songDuration: 0, elapsedSeconds: 0, url: "", - videoId: "", }; const handleData = async (responseText, win) => { @@ -58,7 +57,6 @@ const handleData = async (responseText, win) => { songInfo.image = await getImage(songInfo.imageSrc); songInfo.uploadDate = data?.microformat?.microformatDataRenderer?.uploadDate; songInfo.url = data?.microformat?.microformatDataRenderer?.urlCanonical?.split("&")[0]; - songInfo.videoId = data?.videoDetails?.videoId; // used for options.resumeOnStart config.set("url", data?.microformat?.microformatDataRenderer?.urlCanonical); From 5492afe5f6959940729b1859470c1fc0b8402c36 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Wed, 10 Nov 2021 19:08:19 +0200 Subject: [PATCH 3/7] add catch to fetch --- plugins/tuna-obs/back.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index b7a54719..13c472a0 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -23,7 +23,7 @@ const post = async (data) => { 'Access-Control-Allow-Origin': '*' } const url = `http://localhost:${port}/`; - fetch(url, { method: 'POST', headers, body: JSON.stringify({ data }) }); + fetch(url, { method: 'POST', headers, body: JSON.stringify({ data }) }).catch(e => console.log(`Error: '${e.code || e.errno}' - when trying to access obs-tuna webserver at port ${port}`)); } module.exports = async () => { From 02d5b78f553a1e7257647208dad06e320670697d Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Wed, 10 Nov 2021 20:11:45 +0200 Subject: [PATCH 4/7] add songInfo.album --- plugins/shortcuts/back.js | 11 ++++++----- plugins/tuna-obs/back.js | 6 ++++-- providers/song-info-front.js | 7 +++++-- providers/song-info.js | 2 ++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/plugins/shortcuts/back.js b/plugins/shortcuts/back.js index ddb70c75..22a0319f 100644 --- a/plugins/shortcuts/back.js +++ b/plugins/shortcuts/back.js @@ -68,9 +68,8 @@ function registerShortcuts(win, options) { const player = setupMPRIS(); - const mprisSeek = p => { - player.seeked(p); - } + const mprisSeek = player.seeked; + win.webContents.send("registerOnSeek"); ipcMain.on('seeked', (_, t) => mprisSeek(secToMicro(t))); @@ -107,13 +106,15 @@ function registerShortcuts(win, options) { registerCallback(songInfo => { if (player) { - player.metadata = { + const data = { 'mpris:length': secToMicro(songInfo.songDuration), 'mpris:artUrl': songInfo.imageSrc, 'xesam:title': songInfo.title, 'xesam:artist': songInfo.artist, 'mpris:trackid': '/' - };; + }; + if (songInfo.album) data['xesam:album'] = songInfo.album; + player.metadata = data; mprisSeek(secToMicro(songInfo.elapsedSeconds)) player.playbackStatus = songInfo.isPaused ? "Paused" : "Playing" } diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index 13c472a0..e4ba39ba 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -11,7 +11,8 @@ const data = { status: '', progress: 0, duration: 0, - album_url: '' + album_url: '', + album: undefined }; const post = async (data) => { @@ -44,7 +45,8 @@ module.exports = async () => { data.album_url = songInfo.imageSrc; data.title = songInfo.title; data.artists = [songInfo.artist]; - data.status = songInfo.isPaused ? 'Paused' : 'Playing'; + data.status = songInfo.isPaused ? 'stopped' : 'playing'; + data.album = songInfo.album; post(data); }) } diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 6e14dd7a..04fcbe08 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -4,6 +4,8 @@ const { getImage } = require("./song-info"); global.songInfo = {}; +function $(selector) { return document.querySelector(selector); } + ipcRenderer.on("update-song-info", async (_, extractedSongInfo) => { global.songInfo = JSON.parse(extractedSongInfo); global.songInfo.image = await getImage(global.songInfo.imageSrc); @@ -13,8 +15,9 @@ module.exports = () => { document.addEventListener('apiLoaded', e => { setupTimeChangeListener(); - document.querySelector('video').addEventListener('loadedmetadata', () => { + $('video').addEventListener('loadedmetadata', () => { const data = e.detail.getPlayerResponse(); + data.videoDetails.album = $('ytmusic-player-page')?.__data?.playerPageWatchMetadata?.albumName?.runs[0].text ipcRenderer.send("song-info-request", JSON.stringify(data)); }); }, { once: true, passive: true }) @@ -25,5 +28,5 @@ function setupTimeChangeListener() { ipcRenderer.send('timeChanged', mutations[0].target.value); global.songInfo.elapsedSeconds = mutations[0].target.value; }); - progressObserver.observe(document.querySelector('#progress-bar'), { attributeFilter: ["value"] }) + progressObserver.observe($('#progress-bar'), { attributeFilter: ["value"] }) } diff --git a/providers/song-info.js b/providers/song-info.js index 37cd55fa..b7d257ed 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -45,6 +45,7 @@ const songInfo = { songDuration: 0, elapsedSeconds: 0, url: "", + album: undefined }; const handleData = async (responseText, win) => { @@ -57,6 +58,7 @@ const handleData = async (responseText, win) => { songInfo.image = await getImage(songInfo.imageSrc); songInfo.uploadDate = data?.microformat?.microformatDataRenderer?.uploadDate; songInfo.url = data?.microformat?.microformatDataRenderer?.urlCanonical?.split("&")[0]; + songInfo.album = data?.videoDetails?.album // used for options.resumeOnStart config.set("url", data?.microformat?.microformatDataRenderer?.urlCanonical); From 4362101c0a2ebb7f0536f615cecba8a55ac96702 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Mon, 22 Nov 2021 22:08:24 +0200 Subject: [PATCH 5/7] lint --- plugins/shortcuts/back.js | 73 ++------------------------------------ plugins/shortcuts/mpris.js | 73 ++++++++++++++++++++++++++++++++++++-- plugins/tuna-obs/back.js | 2 +- 3 files changed, 74 insertions(+), 74 deletions(-) diff --git a/plugins/shortcuts/back.js b/plugins/shortcuts/back.js index 22a0319f..06d899d7 100644 --- a/plugins/shortcuts/back.js +++ b/plugins/shortcuts/back.js @@ -1,9 +1,8 @@ -const { globalShortcut, ipcMain } = require("electron"); +const { globalShortcut } = require("electron"); const is = require("electron-is"); const electronLocalshortcut = require("electron-localshortcut"); const getSongControls = require("../../providers/song-controls"); -const { setupMPRIS } = require("./mpris"); -const registerCallback = require("../../providers/song-info"); +const registerMPRIS = require("./mpris"); function _registerGlobalShortcut(webContents, shortcut, action) { globalShortcut.register(shortcut, () => { @@ -30,7 +29,7 @@ function registerShortcuts(win, options) { _registerLocalShortcut(win, "CommandOrControl+F", search); _registerLocalShortcut(win, "CommandOrControl+L", search); - if (is.linux()) registerMPRIS(); + if (is.linux()) registerMPRIS(win); const { global, local } = options; const shortcutOptions = { global, local }; @@ -58,72 +57,6 @@ function registerShortcuts(win, options) { } } } - function registerMPRIS() { - try { - const secToMicro = n => Math.round(Number(n) * (1000 * 1000)); - const microToSec = n => Math.round(Number(n) / 1000 / 1000); - - const seekTo = e => win.webContents.send("seekTo", microToSec(e.position)); - const seek = o => win.webContents.send("seek", microToSec(o)); - - const player = setupMPRIS(); - - const mprisSeek = player.seeked; - - win.webContents.send("registerOnSeek"); - - ipcMain.on('seeked', (_, t) => mprisSeek(secToMicro(t))); - - let currentSeconds = 0; - ipcMain.on('timeChanged', (_, t) => currentSeconds = t); - - player.getPosition = () => secToMicro(currentSeconds) - - player.on("raise", () => { - win.setSkipTaskbar(false); - win.show(); - }); - - player.on("play", () => { - if (player.playbackStatus !== 'Playing') { - player.playbackStatus = 'Playing'; - playPause() - } - }); - player.on("pause", () => { - if (player.playbackStatus !== 'Paused') { - player.playbackStatus = 'Paused'; - playPause() - } - }); - - player.on("playpause", playPause); - player.on("next", next); - player.on("previous", previous); - - player.on('seek', seek); - player.on('position', seekTo); - - registerCallback(songInfo => { - if (player) { - const data = { - 'mpris:length': secToMicro(songInfo.songDuration), - 'mpris:artUrl': songInfo.imageSrc, - 'xesam:title': songInfo.title, - 'xesam:artist': songInfo.artist, - 'mpris:trackid': '/' - }; - if (songInfo.album) data['xesam:album'] = songInfo.album; - player.metadata = data; - mprisSeek(secToMicro(songInfo.elapsedSeconds)) - player.playbackStatus = songInfo.isPaused ? "Paused" : "Playing" - } - }) - - } catch (e) { - console.warn("Error in MPRIS", e); - } - } } module.exports = registerShortcuts; diff --git a/plugins/shortcuts/mpris.js b/plugins/shortcuts/mpris.js index 705599c0..6b6b8590 100644 --- a/plugins/shortcuts/mpris.js +++ b/plugins/shortcuts/mpris.js @@ -1,4 +1,6 @@ const mpris = require("mpris-service"); +const { ipcMain } = require("electron"); +const registerCallback = require("../../providers/song-info"); function setupMPRIS() { const player = mpris({ @@ -14,6 +16,71 @@ function setupMPRIS() { return player; } -module.exports = { - setupMPRIS, -}; +function registerMPRIS(win) { + try { + const secToMicro = n => Math.round(Number(n) * 1e6); + const microToSec = n => Math.round(Number(n) / 1e6); + + const seekTo = e => win.webContents.send("seekTo", microToSec(e.position)); + const seek = o => win.webContents.send("seek", microToSec(o)); + + const player = setupMPRIS(); + + const mprisSeek = player.seeked; + + win.webContents.send("registerOnSeek"); + + ipcMain.on('seeked', (_, t) => mprisSeek(secToMicro(t))); + + let currentSeconds = 0; + ipcMain.on('timeChanged', (_, t) => currentSeconds = t); + + player.getPosition = () => secToMicro(currentSeconds) + + player.on("raise", () => { + win.setSkipTaskbar(false); + win.show(); + }); + + player.on("play", () => { + if (player.playbackStatus !== 'Playing') { + player.playbackStatus = 'Playing'; + playPause() + } + }); + player.on("pause", () => { + if (player.playbackStatus !== 'Paused') { + player.playbackStatus = 'Paused'; + playPause() + } + }); + + player.on("playpause", playPause); + player.on("next", next); + player.on("previous", previous); + + player.on('seek', seek); + player.on('position', seekTo); + + registerCallback(songInfo => { + if (player) { + const data = { + 'mpris:length': secToMicro(songInfo.songDuration), + 'mpris:artUrl': songInfo.imageSrc, + 'xesam:title': songInfo.title, + 'xesam:artist': songInfo.artist, + 'mpris:trackid': '/' + }; + if (songInfo.album) data['xesam:album'] = songInfo.album; + player.metadata = data; + mprisSeek(secToMicro(songInfo.elapsedSeconds)) + player.playbackStatus = songInfo.isPaused ? "Paused" : "Playing" + } + }) + + } catch (e) { + console.warn("Error in MPRIS", e); + } +} + +module.exports = registerMPRIS; diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index e4ba39ba..cf5ad1c5 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -3,7 +3,7 @@ const fetch = require('node-fetch'); const registerCallback = require("../../providers/song-info"); -const secToMilisec = t => Math.round(Number(t) * 1000); +const secToMilisec = t => Math.round(Number(t) * 1e3); const data = { cover_url: '', title: '', From c99b95e611c0c36d7577650b6fc2703738af72dc Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Mon, 22 Nov 2021 22:52:38 +0200 Subject: [PATCH 6/7] use `config.plugins.isEnabled` --- plugins/shortcuts/mpris.js | 6 ++---- plugins/tuna-obs/back.js | 2 +- providers/song-controls-front.js | 35 +++++++++----------------------- providers/song-info-front.js | 6 +++++- 4 files changed, 18 insertions(+), 31 deletions(-) diff --git a/plugins/shortcuts/mpris.js b/plugins/shortcuts/mpris.js index 6b6b8590..e6c6539f 100644 --- a/plugins/shortcuts/mpris.js +++ b/plugins/shortcuts/mpris.js @@ -22,14 +22,12 @@ function registerMPRIS(win) { const microToSec = n => Math.round(Number(n) / 1e6); const seekTo = e => win.webContents.send("seekTo", microToSec(e.position)); - const seek = o => win.webContents.send("seek", microToSec(o)); + const seekBy = o => win.webContents.send("seekBy", microToSec(o)); const player = setupMPRIS(); const mprisSeek = player.seeked; - win.webContents.send("registerOnSeek"); - ipcMain.on('seeked', (_, t) => mprisSeek(secToMicro(t))); let currentSeconds = 0; @@ -59,7 +57,7 @@ function registerMPRIS(win) { player.on("next", next); player.on("previous", previous); - player.on('seek', seek); + player.on('seek', seekBy); player.on('position', seekTo); registerCallback(songInfo => { diff --git a/plugins/tuna-obs/back.js b/plugins/tuna-obs/back.js index cf5ad1c5..0a2bc3a3 100644 --- a/plugins/tuna-obs/back.js +++ b/plugins/tuna-obs/back.js @@ -27,7 +27,7 @@ const post = async (data) => { fetch(url, { method: 'POST', headers, body: JSON.stringify({ data }) }).catch(e => console.log(`Error: '${e.code || e.errno}' - when trying to access obs-tuna webserver at port ${port}`)); } -module.exports = async () => { +module.exports = async (win) => { ipcMain.on('timeChanged', async (_, t) => { if (!data.title) return; data.progress = secToMilisec(t); diff --git a/providers/song-controls-front.js b/providers/song-controls-front.js index bb98ae30..19031388 100644 --- a/providers/song-controls-front.js +++ b/providers/song-controls-front.js @@ -1,30 +1,15 @@ const { ipcRenderer } = require("electron"); - -module.exports.seekTo = seekTo; -function seekTo(t) { - document.querySelector('video').currentTime = t; -} - -module.exports.seek = seek; -function seek(o) { - document.querySelector('video').currentTime += o; -} +const config = require("../config"); +const is = require("electron-is"); module.exports.setupSongControls = () => { - ipcRenderer.on("seekTo", async (_, t) => seekTo(t)); - ipcRenderer.on("seek", async (_, t) => seek(t)); - ipcRenderer.once("registerOnSeek", registerOnSeek) -}; + document.addEventListener('apiLoaded', e => { + ipcRenderer.on("seekTo", (_, t) => e.target.seekTo(t)); + ipcRenderer.on("seekBy", (_, t) => e.target.seekBy(t)); -async function registerOnSeek() { - const register = v => v.addEventListener('seeked', () => ipcRenderer.send('seeked', v.currentTime)); - let video = document.querySelector('video'); - if (video) { - register(video); + }, { once: true, passive: true }) + + if (is.linux() && config.plugins.isEnabled('shortcuts')) { // MPRIS Enabled + document.querySelector('video').addEventListener('seeked', () => ipcRenderer.send('seeked', v.currentTime)); } - else { - document.addEventListener('apiLoaded', () => { - register(document.querySelector('video')) - }, { once: true, passive: true }) - } -} +}; diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 04fcbe08..0d8df3e9 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -2,6 +2,8 @@ const { ipcRenderer } = require("electron"); const { getImage } = require("./song-info"); +const config = require("../config"); + global.songInfo = {}; function $(selector) { return document.querySelector(selector); } @@ -13,7 +15,9 @@ ipcRenderer.on("update-song-info", async (_, extractedSongInfo) => { module.exports = () => { document.addEventListener('apiLoaded', e => { - setupTimeChangeListener(); + if (config.plugins.isEnabled('tuna-obs')) { + setupTimeChangeListener(); + } $('video').addEventListener('loadedmetadata', () => { const data = e.detail.getPlayerResponse(); From 8ce4b5b297f59b3b354733fc6c5ad1a4a8ac872f Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Wed, 1 Dec 2021 21:44:48 +0200 Subject: [PATCH 7/7] lint --- providers/song-info-front.js | 4 ++-- providers/song-info.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 0c11f927..6e0349b1 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -18,7 +18,7 @@ const srcChangedEvent = new CustomEvent('srcChanged'); module.exports = () => { document.addEventListener('apiLoaded', apiEvent => { - if (config.plugins.isEnabled('tuna-obs')) { + if (config.plugins.isEnabled('tuna-obs')) { setupTimeChangeListener(); } const video = $('video'); @@ -42,7 +42,7 @@ module.exports = () => { function sendSongInfo() { const data = apiEvent.detail.getPlayerResponse(); - data.videoDetails.album = $('ytmusic-player-page')?.__data?.playerPageWatchMetadata?.albumName?.runs[0].text + data.videoDetails.album = $('ytmusic-player-page')?.__data?.playerPageWatchMetadata?.albumName?.runs[0].text data.videoDetails.elapsedSeconds = Math.floor(video.currentTime); data.videoDetails.isPaused = false; ipcRenderer.send("video-src-changed", JSON.stringify(data)); diff --git a/providers/song-info.js b/providers/song-info.js index f5f36930..330e0d7c 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -58,7 +58,7 @@ const handleData = async (responseText, win) => { songInfo.elapsedSeconds = videoDetails.elapsedSeconds; songInfo.isPaused = videoDetails.isPaused; songInfo.videoId = videoDetails.videoId; - songInfo.album = data?.videoDetails?.album + songInfo.album = data?.videoDetails?.album; // Will be undefined if video exist const oldUrl = songInfo.imageSrc; songInfo.imageSrc = videoDetails.thumbnail?.thumbnails?.pop()?.url.split("?")[0];