UNPKG

slyrics

Version:

Scrape Lyrics without API Key

78 lines 3.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MelonProvider = void 0; const jsdom_1 = require("jsdom"); const structures_1 = require("../structures"); const HTTPRequester_1 = require("../structures/HTTPRequester"); class MelonProvider extends structures_1.BaseProvider { constructor() { super("melon"); this.baseUrls = { search: "https://www.melon.com/search/song/index.htm?q={0}", songInfo: "https://www.melon.com/song/detail.htm?songId={0}", }; } async search(query) { const startTimeMs = Date.now(); const searchUrl = this.formatURL(this.baseUrls.search, query); const htmlResp = await HTTPRequester_1.HTTPRequester.getText(searchUrl); const entries = []; const { document } = new jsdom_1.JSDOM(htmlResp).window; const searchResultTbody = document.querySelector("#frm_defaultList > div > table > tbody"); if (!searchResultTbody?.children) return { provider: this, entries, searchTimeMs: Date.now() - startTimeMs, }; for (const element of searchResultTbody?.children) { const titleElement = element .getElementsByClassName("t_left")[0] .getElementsByClassName("pd_none")[0] .getElementsByClassName("ellipsis")[0] .getElementsByClassName("fc_gray")[0]; const melonId = parseInt(titleElement ?.getAttribute("href") ?.match(/(?!\))(?!,)\d*?\);/g)?.[0]).toString(); // if MelonId or titleElement is null, skip if (!titleElement || !melonId) continue; else { const artistElement = element .getElementsByClassName("wrapArtistName")[0] .getElementsByClassName("ellipsis")[0] .getElementsByClassName("fc_mgray")[0]; const title = titleElement?.textContent ?? ""; const artist = artistElement?.textContent ?? ""; entries.push(new structures_1.LyricsSearchResultItem(title, artist, this.getLyricsTemplate(title, artist, melonId))); } } return { provider: this, entries, searchTimeMs: Date.now() - startTimeMs, }; } getLyricsTemplate(title, artist, melonId) { return async () => { const songInfoURL = this.formatURL(this.baseUrls.songInfo, melonId); const htmlResp = await HTTPRequester_1.HTTPRequester.getText(songInfoURL); const { document } = new jsdom_1.JSDOM(htmlResp).window; const lyrics = document .querySelector("#d_video_summary") ?.innerHTML.split("\n") // remove html comment (top line) .slice(1, -1) .join("\n") // join array to string .replaceAll("<br>", "\n") // replace <br> to new line .trimStart() .trimEnd(); // remove whitespace const albumCover = document .querySelector("#downloadfrm > div > div > div.thumb > a > img") ?.getAttribute("src") ?.replace(/\/melon\/resize\/\d+\/quality\/\d+\/optimize/g, ""); // remove resize option return new structures_1.Lyrics(this, title, artist, lyrics ? lyrics : null, songInfoURL, albumCover ? albumCover : ""); }; } } exports.MelonProvider = MelonProvider; //# sourceMappingURL=MelonProvider.js.map