UNPKG

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
/* 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 };