mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 18:41:47 +00:00
fix(lyrics-genius): fix th-ch/youtube-music#1253
This commit is contained in:
@ -4,8 +4,31 @@ import is from 'electron-is';
|
|||||||
import type { SongInfo } from '../../providers/song-info';
|
import type { SongInfo } from '../../providers/song-info';
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
ipcRenderer.on('update-song-info', (_, extractedSongInfo: SongInfo) => setTimeout(async () => {
|
const setLyrics = (lyricsContainer: Element, lyrics: string | null) => {
|
||||||
const tabList = document.querySelectorAll('tp-yt-paper-tab');
|
lyricsContainer.innerHTML = `
|
||||||
|
<div id="contents" class="style-scope ytmusic-section-list-renderer description ytmusic-description-shelf-renderer genius-lyrics">
|
||||||
|
${lyrics?.replaceAll(/\r\n|\r|\n/g, '<br/>') ?? 'Could not retrieve lyrics from genius'}
|
||||||
|
</div>
|
||||||
|
<yt-formatted-string class="footer style-scope ytmusic-description-shelf-renderer" style="align-self: baseline">
|
||||||
|
</yt-formatted-string>
|
||||||
|
`;
|
||||||
|
|
||||||
|
if (lyrics) {
|
||||||
|
const footer = lyricsContainer.querySelector('.footer');
|
||||||
|
|
||||||
|
if (footer) {
|
||||||
|
footer.textContent = 'Source: Genius';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let unregister: (() => void) | null = null;
|
||||||
|
|
||||||
|
ipcRenderer.on('update-song-info', (_, extractedSongInfo: SongInfo) => {
|
||||||
|
unregister?.();
|
||||||
|
|
||||||
|
setTimeout(async () => {
|
||||||
|
const tabList = document.querySelectorAll<HTMLElement>('tp-yt-paper-tab');
|
||||||
const tabs = {
|
const tabs = {
|
||||||
upNext: tabList[0],
|
upNext: tabList[0],
|
||||||
lyrics: tabList[1],
|
lyrics: tabList[1],
|
||||||
@ -13,22 +36,17 @@ export default () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Check if disabled
|
// Check if disabled
|
||||||
if (!tabs.lyrics?.hasAttribute('disabled')) {
|
if (!tabs.lyrics?.hasAttribute('disabled')) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let hasLyrics = true;
|
|
||||||
|
|
||||||
const lyrics = await ipcRenderer.invoke(
|
const lyrics = await ipcRenderer.invoke(
|
||||||
'search-genius-lyrics',
|
'search-genius-lyrics',
|
||||||
extractedSongInfo,
|
extractedSongInfo,
|
||||||
) as string;
|
) as string | null;
|
||||||
|
|
||||||
if (!lyrics) {
|
if (!lyrics) {
|
||||||
// Delete previous lyrics if tab is open and couldn't get new lyrics
|
// Delete previous lyrics if tab is open and couldn't get new lyrics
|
||||||
checkLyricsContainer(() => {
|
tabs.upNext.click();
|
||||||
hasLyrics = false;
|
|
||||||
setTabsOnclick(undefined);
|
|
||||||
});
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,71 +54,55 @@ export default () => {
|
|||||||
console.log('Fetched lyrics from Genius');
|
console.log('Fetched lyrics from Genius');
|
||||||
}
|
}
|
||||||
|
|
||||||
enableLyricsTab();
|
const tryToInjectLyric = (callback?: () => void) => {
|
||||||
|
const lyricsContainer = document.querySelector(
|
||||||
|
'[page-type="MUSIC_PAGE_TYPE_TRACK_LYRICS"] > ytmusic-message-renderer',
|
||||||
|
);
|
||||||
|
|
||||||
setTabsOnclick(enableLyricsTab);
|
if (lyricsContainer) {
|
||||||
|
callback?.();
|
||||||
checkLyricsContainer();
|
|
||||||
|
|
||||||
|
setLyrics(lyricsContainer, lyrics);
|
||||||
|
applyLyricsTabState();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const applyLyricsTabState = () => {
|
||||||
|
if (lyrics) {
|
||||||
|
tabs.lyrics.removeAttribute('disabled');
|
||||||
|
tabs.lyrics.removeAttribute('aria-disabled');
|
||||||
|
} else {
|
||||||
|
tabs.lyrics.setAttribute('disabled', '');
|
||||||
|
tabs.lyrics.setAttribute('aria-disabled', '');
|
||||||
|
}
|
||||||
|
};
|
||||||
const lyricsTabHandler = () => {
|
const lyricsTabHandler = () => {
|
||||||
const tabContainer = document.querySelector('ytmusic-tab-renderer');
|
const tabContainer = document.querySelector('ytmusic-tab-renderer');
|
||||||
if (tabContainer) {
|
if (!tabContainer) return;
|
||||||
|
|
||||||
const observer = new MutationObserver((_, observer) => {
|
const observer = new MutationObserver((_, observer) => {
|
||||||
checkLyricsContainer(() => observer.disconnect());
|
tryToInjectLyric(() => observer.disconnect());
|
||||||
});
|
});
|
||||||
|
|
||||||
observer.observe(tabContainer, {
|
observer.observe(tabContainer, {
|
||||||
attributes: true,
|
attributes: true,
|
||||||
childList: true,
|
childList: true,
|
||||||
subtree: true,
|
subtree: true,
|
||||||
});
|
});
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
applyLyricsTabState();
|
||||||
|
|
||||||
|
tabs.discover.addEventListener('click', applyLyricsTabState);
|
||||||
tabs.lyrics.addEventListener('click', lyricsTabHandler);
|
tabs.lyrics.addEventListener('click', lyricsTabHandler);
|
||||||
|
tabs.upNext.addEventListener('click', applyLyricsTabState);
|
||||||
|
|
||||||
function checkLyricsContainer(callback = () => {
|
tryToInjectLyric();
|
||||||
}) {
|
|
||||||
const lyricsContainer = document.querySelector(
|
|
||||||
'[page-type="MUSIC_PAGE_TYPE_TRACK_LYRICS"] > ytmusic-message-renderer',
|
|
||||||
);
|
|
||||||
if (lyricsContainer) {
|
|
||||||
callback();
|
|
||||||
setLyrics(lyricsContainer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function setLyrics(lyricsContainer: Element) {
|
unregister = () => {
|
||||||
lyricsContainer.innerHTML = `<div id="contents" class="style-scope ytmusic-section-list-renderer description ytmusic-description-shelf-renderer genius-lyrics">
|
tabs.discover.removeEventListener('click', applyLyricsTabState);
|
||||||
${
|
tabs.lyrics.removeEventListener('click', lyricsTabHandler);
|
||||||
hasLyrics
|
tabs.upNext.removeEventListener('click', applyLyricsTabState);
|
||||||
? lyrics.replaceAll(/\r\n|\r|\n/g, '<br/>')
|
};
|
||||||
: 'Could not retrieve lyrics from genius'
|
}, 500);
|
||||||
}
|
});
|
||||||
|
|
||||||
</div>
|
|
||||||
<yt-formatted-string class="footer style-scope ytmusic-description-shelf-renderer" style="align-self: baseline"></yt-formatted-string>`;
|
|
||||||
if (hasLyrics) {
|
|
||||||
const footer = lyricsContainer.querySelector('.footer');
|
|
||||||
if (footer) {
|
|
||||||
footer.textContent = 'Source: Genius';
|
|
||||||
enableLyricsTab();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const defaultHandler = () => {};
|
|
||||||
|
|
||||||
function setTabsOnclick(callback: EventListenerOrEventListenerObject | undefined) {
|
|
||||||
for (const tab of [tabs.upNext, tabs.discover]) {
|
|
||||||
if (tab) {
|
|
||||||
tab.addEventListener('click', callback ?? defaultHandler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function enableLyricsTab() {
|
|
||||||
tabs.lyrics.removeAttribute('disabled');
|
|
||||||
tabs.lyrics.removeAttribute('aria-disabled');
|
|
||||||
}
|
|
||||||
}, 500));
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user