Add YT Music preload scraper that emits wtm:state IPC
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
const { ipcRenderer } = require('electron');
|
||||
|
||||
const POLL_INTERVAL_MS = 3000;
|
||||
let lastSent = null;
|
||||
|
||||
function scrapeNowPlaying() {
|
||||
const titleEl =
|
||||
document.querySelector('ytmusic-player-bar .title') ||
|
||||
document.querySelector('.ytmusic-player-bar .title');
|
||||
const title = titleEl ? titleEl.textContent.trim() : null;
|
||||
|
||||
const bylineEl =
|
||||
document.querySelector('ytmusic-player-bar .byline') ||
|
||||
document.querySelector('.ytmusic-player-bar .byline');
|
||||
const artist = bylineEl ? bylineEl.textContent.trim() : null;
|
||||
|
||||
const artImg =
|
||||
document.querySelector('ytmusic-player-bar .middle-controls .thumbnail-image-wrapper img') ||
|
||||
document.querySelector('ytmusic-player-bar .image img') ||
|
||||
document.querySelector('ytmusic-player-bar img.image');
|
||||
const albumArt = artImg ? artImg.src : null;
|
||||
|
||||
// The play/pause button's title indicates state: when music is playing the
|
||||
// button's action is "Pause", and vice versa.
|
||||
const playPauseBtn = document.querySelector('#play-pause-button');
|
||||
let isPlaying = false;
|
||||
if (playPauseBtn) {
|
||||
const btnTitle = (
|
||||
playPauseBtn.getAttribute('title') ||
|
||||
playPauseBtn.getAttribute('aria-label') ||
|
||||
''
|
||||
).toLowerCase();
|
||||
isPlaying = btnTitle.includes('pause');
|
||||
}
|
||||
|
||||
if (!title) return null;
|
||||
return { title, artist, albumArt, isPlaying };
|
||||
}
|
||||
|
||||
function changed(a, b) {
|
||||
if (a === null && b === null) return false;
|
||||
if (a === null || b === null) return true;
|
||||
return (
|
||||
a.title !== b.title ||
|
||||
a.artist !== b.artist ||
|
||||
a.albumArt !== b.albumArt ||
|
||||
a.isPlaying !== b.isPlaying
|
||||
);
|
||||
}
|
||||
|
||||
function poll() {
|
||||
const data = scrapeNowPlaying();
|
||||
if (!changed(data, lastSent)) return;
|
||||
lastSent = data;
|
||||
ipcRenderer.send('wtm:state', data || { isPlaying: false });
|
||||
}
|
||||
|
||||
setInterval(poll, POLL_INTERVAL_MS);
|
||||
poll();
|
||||
|
||||
console.log('[wtm] yt-scraper preload loaded');
|
||||
Reference in New Issue
Block a user