slyrics
Version:
Scrape Lyrics without API Key
78 lines • 3.61 kB
JavaScript
;
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