hutatools / lib /soundcloud.js
fullpwerr's picture
p
3ed6900
/* eslint-disable jsdoc/require-jsdoc */
const FormData = require("form-data");
const axios = require("axios");
const cheerio = require("cheerio");
async function getRedirectedURL(url) {
try {
const response = await axios.get(url, {
maxRedirects: 0,
validateStatus: (status) => status >= 300 && status < 400,
});
return response.headers.location || null;
} catch (error) {
console.error("Error mendapatkan URL redirect:", error.message);
return null;
}
}
async function search(query) {
try {
const url = `https://m.soundcloud.com/search?q=${encodeURIComponent(query)}`;
const response = await axios.get(url);
const $ = await cheerio.load(response.data);
const results = [];
$(".List_VerticalList__2uQYU li").each((index, element) => {
const title = $(element).find(".Information_CellTitle__2KitR").text();
const artist = $(element).find(".Information_CellSubtitle__1mXGx").text();
const thumbnail = $(element)
.find(".Artwork_ArtworkImage__1Ws9-")
.attr("src");
const link = $(element)
.find(".Cell_CellLink__3yLVS")
.attr("href");
results.push({
title,
artist,
thumbnail,
link: `https://soundcloud.com${link}`,
});
});
return results;
} catch (error) {
console.error(error);
return [];
}
}
async function download(url) {
const form = new FormData();
form.append("formurl", url);
const {
data
} = await axios.post("https://www.forhub.io/download.php", form, {
headers: form.getHeaders(),
});
const $ = cheerio.load(data);
const fullTitleText = $("td.small-10.columns").text().trim();
// eslint-disable-next-line no-unused-vars
const [title] = fullTitleText.split("320 KB/S").map((text) => text.trim());
const music = $("td a").attr("href");
// eslint-disable-next-line no-unused-vars
const cover = $("td img").attr("src");
return music
}
async function metadata(url) {
const parsedd = new URL(url)
const scUri = [
"m.soundcloud.com"
]
let Modif;
if (scUri.includes(parsedd.hostname)) {
Modif = url.replace(/(?:m\.)?soundcloud\.com/, "soundcloud.com");
} else {
Modif = await getRedirectedURL(url);
}
const { data } = await axios.get(Modif);
const $ = cheerio.load(data);
let hydrationData;
$("script").each(function() {
const scr = $(this).html();
if (scr.includes("window.__sc_hydration")) {
try {
// Ambil JSON dari bagian setelah "window.__sc_hydration = "
const jsonStr = scr.split("window.__sc_hydration = ")[1].trim().slice(0, -1); // Hapus titik koma terakhir
hydrationData = JSON.parse(jsonStr);
} catch (err) {
console.error("Gagal parse JSON:", err);
}
}
});
if (!hydrationData) {
throw new Error("Metadata tidak ditemukan.");
}
const trackData = hydrationData.find(entry => entry.hydratable === "sound")?.data;
if (!trackData) {
throw new Error("Data track tidak ditemukan.");
}
return trackData;
}
async function soundcloud(query, type) {
try {
if(type === "search") {
const search_result = await search(query)
return search_result
} else {
const result_download = await download(query)
const result_metadata = await metadata(query)
const resd = {
status: 200,
title: result_metadata.title,
thumbnail: result_metadata.artwork_url,
music: [
{
resolusi: "default",
url: result_download
}
]
}
console.log(resd)
return resd
}
} catch (e) {
return { status: 500, message: e.message}
}
}
module.exports = {
search,
download,
soundcloud,
metadata
}