notmebotz-tools
Version:
Sebuah Tools yang berfungsi untuk mendownload Video atau Foto dari media sosial, serta sebagai tools yang berguna untuk aplikasi kamu seperti untuk BOT
174 lines (143 loc) • 6.63 kB
JavaScript
/*
Jangan Hapus Wm Bang
*Otakudesu Search,Detail, Latest, Download Plugins*
Hmmph
*[Sumber]*
https://whatsapp.com/channel/0029Vb3u2awADTOCXVsvia28
*[Sumber Scrape]*
https://whatsapp.com/channel/0029VaNR2B6BadmioY6mar3N/3621
*/
const axios = require('axios');
const cheerio = require('cheerio');
const baseUrl = 'https://otakudesu.cloud';
async function otakudesuu(type, query) {
try {
switch (type) {
case 'search':
const searchUrl = `${baseUrl}/?s=${encodeURIComponent(query)}&post_type=anime`;
const searchResponse = await axios.get(searchUrl, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
});
const $search = cheerio.load(searchResponse.data);
const searchResults = [];
$search('.chivsrc > li').each((index, element) => {
const title = $search(element).find('h2 a').text().trim();
const link = $search(element).find('h2 a').attr('href');
const image = $search(element).find('img').attr('src');
const genres = [];
$search(element).find('.set').eq(0).find('a').each((i, el) => {
genres.push($search(el).text().trim());
});
const status = $search(element).find('.set').eq(1).text().replace(/^Status\s*:\s*/, '').trim();
const rating = $search(element).find('.set').eq(2).text().replace(/^Rating\s*:\s*/, '').trim();
if (title && link) {
searchResults.push({ title, link, image, genres, status, rating });
}
});
return { author: "Herza", status: 200, data: searchResults };
case 'details':
const detailsResponse = await axios.get(query);
const $details = cheerio.load(detailsResponse.data);
const title = $details('title').text().split('|')[0].trim();
const description = $details('meta[name="description"]').attr('content');
const thumbnail = $details('meta[property="og:image"]').attr('content') || $details('img.attachment-post-thumbnail').attr('src');
const publishedTime = $details('meta[property="article:published_time"]').attr('content');
const modifiedTime = $details('meta[property="article:modified_time"]').attr('content');
// Perbaikan dengan regex agar label tidak duplikat
const titleJapanese = $details('p:contains("Japanese")').text().replace(/^Japanese\s*:\s*/, '').trim();
const skor = $details('p:contains("Skor")').text().replace(/^Skor\s*:\s*/, '').trim();
const produser = $details('p:contains("Produser")').text().replace(/^Produser\s*:\s*/, '').trim();
const tipe = $details('p:contains("Tipe")').text().replace(/^Tipe\s*:\s*/, '').trim();
const status = $details('p:contains("Status")').text().replace(/^Status\s*:\s*/, '').trim();
const totalEpisode = $details('p:contains("Total Episode")').text().replace(/^Total Episode\s*:\s*/, '').trim();
const durasi = $details('p:contains("Durasi")').text().replace(/^Durasi\s*:\s*/, '').trim();
const rilis = $details('p:contains("Tanggal Rilis")').text().replace(/^Tanggal Rilis\s*:\s*/, '').trim();
const studio = $details('p:contains("Studio")').text().replace(/^Studio\s*:\s*/, '').trim();
const genreArray = [];
$details('p:contains("Genre") a').each((index, element) => {
genreArray.push($details(element).text().trim());
});
const genre = genreArray.join(', ');
let sinopsis = '';
$details('.sinopc p').each((index, element) => {
sinopsis += $details(element).text().trim() + ' ';
});
const episodeLinks = [];
$details('.episodelist ul li span a').each((index, element) => {
episodeLinks.push($details(element).attr('href'));
});
return {
author: "Herza",
status: 200,
data: {
title,
titleJapanese,
description,
skor,
produser,
tipe,
status,
studio,
rilis,
episode: totalEpisode,
durasi,
genre,
thumbnail,
publishedTime,
modifiedTime,
episodeLinks,
sinopsis: sinopsis.trim()
}
};
case 'latest':
const latestResponse = await axios.get(`${baseUrl}/ongoing-anime/`);
const $latest = cheerio.load(latestResponse.data);
const latestUpdates = [];
$latest(".venz ul li").each((i, elem) => {
const title = $latest(elem).find("h2.jdlflm").text().trim();
const episode = $latest(elem).find(".epz").text().replace("Episode ", "").trim();
const day = $latest(elem).find(".epztipe").text().trim();
const date = $latest(elem).find(".newnime").text().trim();
const image = $latest(elem).find(".thumbz img").attr("src");
const link = $latest(elem).find(".thumb a").attr("href");
latestUpdates.push({ title, episode, day, date, image, link });
});
return { author: "Herza", status: 200, data: latestUpdates };
case 'download':
const downloadResponse = await axios.get(query);
const $download = cheerio.load(downloadResponse.data);
const downloads = [];
$download('li').each((_, element) => {
const resolution = $download(element).find('strong').text().trim();
const size = $download(element).find('i').text().trim();
const downloadLinks = [];
$download(element).find('a').each((_, link) => {
const server = $download(link).text().trim();
const url = $download(link).attr('href');
if (server && url) {
downloadLinks.push({ server, url });
}
});
if (resolution && downloadLinks.length > 0) {
downloads.push({
resolution,
size: size || "N/A",
downloadLinks
});
}
});
return { author: "Herza", status: 200, data: downloads };
default:
return { author: "Herza", status: 400, data: { error: 'Tipe tidak valid. Gunakan: search, details, latest, atau download' } };
}
} catch (error) {
console.error("Error:", error);
return { author: "Herza", status: 500, data: { error: "Internal Server Error" } };
}
}
// CommonJS export
module.exports = { otakudesuu };
// ESM export
// export { otakudesuu };