Skip to content

Commit d0532d6

Browse files
committed
Process lyrics HTML in Genius util
1 parent 2f218ef commit d0532d6

File tree

4 files changed

+164
-23
lines changed

4 files changed

+164
-23
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@
111111
"electron-updater": "^4.6.3",
112112
"filenamify": "^4.3.0",
113113
"hark": "^1.2.3",
114+
"html-to-text": "^8.2.0",
114115
"md5": "^2.3.0",
115116
"mpris-service": "^2.1.2",
116117
"node-fetch": "^2.6.7",

plugins/lyrics-genius/back.js

+26-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const { join } = require("path");
22

33
const { ipcMain } = require("electron");
44
const is = require("electron-is");
5+
const { convert } = require("html-to-text");
56
const fetch = require("node-fetch");
67

78
const { cleanupName } = require("../../providers/song-info");
@@ -12,15 +13,14 @@ module.exports = async (win) => {
1213

1314
ipcMain.on("search-genius-lyrics", async (event, extractedSongInfo) => {
1415
const metadata = JSON.parse(extractedSongInfo);
15-
const queryString = `${cleanupName(metadata.artist)} ${cleanupName(
16-
metadata.title
17-
)}`;
18-
19-
event.returnValue = await fetchFromGenius(queryString);
16+
event.returnValue = await fetchFromGenius(metadata);
2017
});
2118
};
2219

23-
const fetchFromGenius = async (queryString) => {
20+
const fetchFromGenius = async (metadata) => {
21+
const queryString = `${cleanupName(metadata.artist)} ${cleanupName(
22+
metadata.title
23+
)}`;
2424
let response = await fetch(
2525
`https://genius.com/api/search/multi?per_page=5&q=${encodeURI(queryString)}`
2626
);
@@ -46,5 +46,24 @@ const fetchFromGenius = async (queryString) => {
4646
return null;
4747
}
4848

49-
return await response.text();
49+
const html = await response.text();
50+
const lyrics = convert(html, {
51+
baseElements: {
52+
selectors: ['[class^="Lyrics__Container"]', ".lyrics"],
53+
},
54+
selectors: [
55+
{
56+
selector: "a",
57+
format: "linkFormatter",
58+
},
59+
],
60+
formatters: {
61+
// Remove links by keeping only the content
62+
linkFormatter: (elem, walk, builder) => {
63+
walk(elem.children, builder);
64+
},
65+
},
66+
});
67+
68+
return lyrics;
5069
};

plugins/lyrics-genius/front.js

+8-15
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ module.exports = () => {
1717

1818
let hasLyrics = true;
1919

20-
const html = ipcRenderer.sendSync(
20+
const lyrics = ipcRenderer.sendSync(
2121
"search-genius-lyrics",
2222
extractedSongInfo
2323
);
24-
if (!html) {
24+
if (!lyrics) {
2525
// Delete previous lyrics if tab is open and couldn't get new lyrics
2626
checkLyricsContainer(() => {
2727
hasLyrics = false;
@@ -34,16 +34,6 @@ module.exports = () => {
3434
console.log("Fetched lyrics from Genius");
3535
}
3636

37-
const wrapper = document.createElement("div");
38-
wrapper.innerHTML = html;
39-
40-
const lyrics = [...wrapper.querySelectorAll('[class^="Lyrics__Container"]')].map(d => d.innerHTML).join('<br>')
41-
|| wrapper.querySelector(".lyrics")?.innerHTML;
42-
43-
if (!lyrics) {
44-
return;
45-
}
46-
4737
enableLyricsTab();
4838

4939
setTabsOnclick(enableLyricsTab);
@@ -73,9 +63,12 @@ module.exports = () => {
7363
}
7464

7565
function setLyrics(lyricsContainer) {
76-
lyricsContainer.innerHTML =
77-
`<div id="contents" class="style-scope ytmusic-section-list-renderer description ytmusic-description-shelf-renderer genius-lyrics">
78-
${hasLyrics ? lyrics : 'Could not retrieve lyrics from genius'}
66+
lyricsContainer.innerHTML = `<div id="contents" class="style-scope ytmusic-section-list-renderer description ytmusic-description-shelf-renderer genius-lyrics">
67+
${
68+
hasLyrics
69+
? lyrics.replace(/(?:\r\n|\r|\n)/g, "<br/>")
70+
: "Could not retrieve lyrics from genius"
71+
}
7972
8073
</div>
8174
<yt-formatted-string class="footer style-scope ytmusic-description-shelf-renderer" style="align-self: baseline"></yt-formatted-string>`;

yarn.lock

+129-1
Original file line numberDiff line numberDiff line change
@@ -1344,6 +1344,14 @@
13441344
resolved "https://registry.yarnpkg.com/@remusao/trie/-/trie-1.4.1.tgz#755d09f8a007476334e611f42719b2d581f00720"
13451345
integrity sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q==
13461346

1347+
"@selderee/plugin-htmlparser2@^0.6.0":
1348+
version "0.6.0"
1349+
resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz#27e994afd1c2cb647ceb5406a185a5574188069d"
1350+
integrity sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==
1351+
dependencies:
1352+
domhandler "^4.2.0"
1353+
selderee "^0.6.0"
1354+
13471355
"@sindresorhus/is@^0.14.0":
13481356
version "0.14.0"
13491357
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
@@ -2589,6 +2597,11 @@ [email protected]:
25892597
dependencies:
25902598
graceful-readlink ">= 1.0.0"
25912599

2600+
commander@^2.19.0:
2601+
version "2.20.3"
2602+
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
2603+
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
2604+
25922605
commander@^5.0.0:
25932606
version "5.1.0"
25942607
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
@@ -2940,6 +2953,11 @@ dir-glob@^3.0.1:
29402953
dependencies:
29412954
path-type "^4.0.0"
29422955

2956+
2957+
version "1.0.0"
2958+
resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
2959+
integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=
2960+
29432961
discord-rpc@^4.0.1:
29442962
version "4.0.1"
29452963
resolved "https://registry.yarnpkg.com/discord-rpc/-/discord-rpc-4.0.1.tgz#a89aa04a048aa83ad4f347d53fa0162501eae0d8"
@@ -2993,18 +3011,48 @@ doctrine@^3.0.0:
29933011
dependencies:
29943012
esutils "^2.0.2"
29953013

3014+
dom-serializer@^1.0.1:
3015+
version "1.3.2"
3016+
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
3017+
integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
3018+
dependencies:
3019+
domelementtype "^2.0.1"
3020+
domhandler "^4.2.0"
3021+
entities "^2.0.0"
3022+
29963023
dom-walk@^0.1.0:
29973024
version "0.1.2"
29983025
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
29993026
integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
30003027

3028+
domelementtype@^2.0.1, domelementtype@^2.2.0:
3029+
version "2.3.0"
3030+
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
3031+
integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
3032+
30013033
domexception@^2.0.1:
30023034
version "2.0.1"
30033035
resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
30043036
integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
30053037
dependencies:
30063038
webidl-conversions "^5.0.0"
30073039

3040+
domhandler@^4.0.0, domhandler@^4.2.0:
3041+
version "4.3.1"
3042+
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
3043+
integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
3044+
dependencies:
3045+
domelementtype "^2.2.0"
3046+
3047+
domutils@^2.5.2:
3048+
version "2.8.0"
3049+
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
3050+
integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
3051+
dependencies:
3052+
dom-serializer "^1.0.1"
3053+
domelementtype "^2.2.0"
3054+
domhandler "^4.2.0"
3055+
30083056
dot-prop@^5.2.0:
30093057
version "5.3.0"
30103058
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
@@ -3270,6 +3318,11 @@ ensure-error@^2.0.0:
32703318
resolved "https://registry.yarnpkg.com/ensure-error/-/ensure-error-2.1.0.tgz#f11fbe383c0cf4a54850ac77acceb7bc06e0f99d"
32713319
integrity sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A==
32723320

3321+
entities@^2.0.0:
3322+
version "2.2.0"
3323+
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
3324+
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
3325+
32733326
env-editor@^0.4.1:
32743327
version "0.4.2"
32753328
resolved "https://registry.yarnpkg.com/env-editor/-/env-editor-0.4.2.tgz#4e76568d0bd8f5c2b6d314a9412c8fe9aa3ae861"
@@ -4396,6 +4449,11 @@ hasha@^2.2.0:
43964449
is-stream "^1.0.1"
43974450
pinkie-promise "^2.0.0"
43984451

4452+
he@^1.2.0:
4453+
version "1.2.0"
4454+
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
4455+
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
4456+
43994457
hexy@^0.2.10:
44004458
version "0.2.11"
44014459
resolved "https://registry.yarnpkg.com/hexy/-/hexy-0.2.11.tgz#9939c25cb6f86a91302f22b8a8a72573518e25b4"
@@ -4425,6 +4483,28 @@ html-escaper@^2.0.0:
44254483
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
44264484
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
44274485

4486+
html-to-text@^8.2.0:
4487+
version "8.2.0"
4488+
resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-8.2.0.tgz#8b35e280ba7fc27710b7aa76d4500aab30731924"
4489+
integrity sha512-CLXExYn1b++Lgri+ZyVvbUEFwzkLZppjjZOwB7X1qv2jIi8MrMEvxWX5KQ7zATAzTvcqgmtO00M2kCRMtEdOKQ==
4490+
dependencies:
4491+
"@selderee/plugin-htmlparser2" "^0.6.0"
4492+
deepmerge "^4.2.2"
4493+
he "^1.2.0"
4494+
htmlparser2 "^6.1.0"
4495+
minimist "^1.2.6"
4496+
selderee "^0.6.0"
4497+
4498+
htmlparser2@^6.1.0:
4499+
version "6.1.0"
4500+
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
4501+
integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
4502+
dependencies:
4503+
domelementtype "^2.0.1"
4504+
domhandler "^4.0.0"
4505+
domutils "^2.5.2"
4506+
entities "^2.0.0"
4507+
44284508
http-cache-semantics@^4.0.0:
44294509
version "4.1.0"
44304510
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
@@ -6058,7 +6138,7 @@ [email protected]:
60586138
is-plain-obj "^1.1.0"
60596139
kind-of "^6.0.3"
60606140

6061-
[email protected], [email protected], minimist@^1.2.0, minimist@^1.2.5:
6141+
[email protected], [email protected], minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
60626142
version "1.2.5"
60636143
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
60646144
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -6070,6 +6150,11 @@ mkdirp@^0.5.1, mkdirp@^0.5.4:
60706150
dependencies:
60716151
minimist "^1.2.5"
60726152

6153+
moo@^0.5.0, moo@^0.5.1:
6154+
version "0.5.1"
6155+
resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4"
6156+
integrity sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==
6157+
60736158
mpris-service@^2.1.2:
60746159
version "2.1.2"
60756160
resolved "https://registry.yarnpkg.com/mpris-service/-/mpris-service-2.1.2.tgz#ed6db2574f48e1fc356413fd3fc8e857d93d2e7b"
@@ -6109,6 +6194,16 @@ natural-compare@^1.4.0:
61096194
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
61106195
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
61116196

6197+
nearley@^2.20.1:
6198+
version "2.20.1"
6199+
resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474"
6200+
integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==
6201+
dependencies:
6202+
commander "^2.19.0"
6203+
moo "^0.5.0"
6204+
railroad-diagrams "^1.0.0"
6205+
randexp "0.4.6"
6206+
61126207
neo-async@^2.6.0:
61136208
version "2.6.2"
61146209
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
@@ -6498,6 +6593,14 @@ [email protected]:
64986593
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
64996594
integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
65006595

6596+
parseley@^0.7.0:
6597+
version "0.7.0"
6598+
resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.7.0.tgz#9949e3a0ed05c5072adb04f013c2810cf49171a8"
6599+
integrity sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==
6600+
dependencies:
6601+
moo "^0.5.1"
6602+
nearley "^2.20.1"
6603+
65016604
path-exists@^2.0.0:
65026605
version "2.1.0"
65036606
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
@@ -6868,6 +6971,19 @@ quick-lru@^5.1.1:
68686971
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
68696972
integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
68706973

6974+
railroad-diagrams@^1.0.0:
6975+
version "1.0.0"
6976+
resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
6977+
integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=
6978+
6979+
6980+
version "0.4.6"
6981+
resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
6982+
integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==
6983+
dependencies:
6984+
discontinuous-range "1.0.0"
6985+
ret "~0.1.10"
6986+
68716987
rc@^1.2.8:
68726988
version "1.2.8"
68736989
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
@@ -7119,6 +7235,11 @@ responselike@^1.0.2:
71197235
dependencies:
71207236
lowercase-keys "^1.0.0"
71217237

7238+
ret@~0.1.10:
7239+
version "0.1.15"
7240+
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
7241+
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
7242+
71227243
retry@^0.12.0:
71237244
version "0.12.0"
71247245
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
@@ -7201,6 +7322,13 @@ saxes@^5.0.1:
72017322
dependencies:
72027323
xmlchars "^2.2.0"
72037324

7325+
selderee@^0.6.0:
7326+
version "0.6.0"
7327+
resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.6.0.tgz#f3bee66cfebcb6f33df98e4a1df77388b42a96f7"
7328+
integrity sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==
7329+
dependencies:
7330+
parseley "^0.7.0"
7331+
72047332
semver-compare@^1.0.0:
72057333
version "1.0.0"
72067334
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"

0 commit comments

Comments
 (0)