Spaces:
Paused
Paused
File size: 3,778 Bytes
d145b59 16bd39e d145b59 16bd39e 3ed6900 16bd39e d145b59 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
/* 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
}
|