62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
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');
|