Skip to content

Commit

Permalink
Add Genius lyrics plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
th-ch committed Aug 22, 2021
1 parent c66ff2b commit acbe0ac
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 0 deletions.
52 changes: 52 additions & 0 deletions plugins/lyrics-genius/back.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
const { join } = require("path");

const { ipcMain } = require("electron");
const is = require("electron-is");
const fetch = require("node-fetch");

const { cleanupName } = require("../../providers/song-info");
const { injectCSS } = require("../utils");

module.exports = async (win) => {
injectCSS(win.webContents, join(__dirname, "style.css"));

ipcMain.on("search-genius-lyrics", async (event, extractedSongInfo) => {
const metadata = JSON.parse(extractedSongInfo);
const queryString = `${cleanupName(metadata.artist)} ${cleanupName(
metadata.title
)}`;

let response = await fetch(
`https://genius.com/api/search/multi?per_page=5&q=${encodeURI(
queryString
)}`
);
if (!response.ok) {
event.returnValue = null;
return;
}

const info = await response.json();
let url = "";
try {
url = info.response.sections.filter(
(section) => section.type === "song"
)[0].hits[0].result.url;
} catch {
event.returnValue = null;
return;
}

if (is.dev()) {
console.log("Fetching lyrics from Genius:", url);
}

response = await fetch(url);
if (!response.ok) {
event.returnValue = null;
return;
}

event.returnValue = await response.text();
});
};
65 changes: 65 additions & 0 deletions plugins/lyrics-genius/front.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
const { ipcRenderer } = require("electron");

module.exports = () => {
ipcRenderer.on("update-song-info", (_, extractedSongInfo) => {
const lyricsTab = document.querySelector('tp-yt-paper-tab[tabindex="-1"]');

// Check if disabled
if (!lyricsTab || !lyricsTab.hasAttribute("disabled")) {
return;
}

const html = ipcRenderer.sendSync(
"search-genius-lyrics",
extractedSongInfo
);
if (!html) {
return;
}

const wrapper = document.createElement("div");
wrapper.innerHTML = html;
const lyricsSelector1 = wrapper.querySelector(".lyrics");
const lyricsSelector2 = wrapper.querySelector(
'[class^="Lyrics__Container"]'
);
const lyrics = lyricsSelector1
? lyricsSelector1.innerHTML
: lyricsSelector2
? lyricsSelector2.innerHTML
: null;
if (!lyrics) {
return;
}

lyricsTab.removeAttribute("disabled");
lyricsTab.removeAttribute("aria-disabled");
document.querySelector("tp-yt-paper-tab").onclick = () => {
lyricsTab.removeAttribute("disabled");
lyricsTab.removeAttribute("aria-disabled");
};

lyricsTab.onclick = () => {
const tabContainer = document.querySelector("ytmusic-tab-renderer");
console.log("tabContainer", tabContainer);
const observer = new MutationObserver((_, observer) => {
const lyricsContainer = document.querySelector(
'[page-type="MUSIC_PAGE_TYPE_TRACK_LYRICS"] > ytmusic-message-renderer'
);
if (lyricsContainer) {
lyricsContainer.innerHTML = `<div id="contents" class="style-scope ytmusic-section-list-renderer genius-lyrics">
${lyrics}
<yt-formatted-string class="footer style-scope ytmusic-description-shelf-renderer">Source&nbsp;: Genius</yt-formatted-string>
</div>`;
observer.disconnect();
}
});
observer.observe(tabContainer, {
attributes: true,
childList: true,
subtree: true,
});
};
});
};
7 changes: 7 additions & 0 deletions plugins/lyrics-genius/style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/* Disable links in Genius lyrics */
.genius-lyrics a {
color: var(--ytmusic-text-primary);
display: inline-block;
pointer-events: none;
text-decoration: none;
}

0 comments on commit acbe0ac

Please sign in to comment.