This commit is contained in:
+80
-37
@@ -1,17 +1,17 @@
|
|||||||
async function searchResults(keyword) {
|
async function searchResults(keyword) {
|
||||||
const results = [];
|
const results = [];
|
||||||
const headers = {
|
const headers = {
|
||||||
'Referer': 'https://animetsu.to/',
|
'Referer': 'https://animetsu.live/',
|
||||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
||||||
};
|
};
|
||||||
|
|
||||||
const encodedKeyword = encodeURIComponent(keyword);
|
const encodedKeyword = encodeURIComponent(keyword);
|
||||||
const response = await fetchv2(`https://backend.animetsu.to/api/anime/search?query=${encodedKeyword}&page=1&perPage=1000`, headers);
|
const response = await fetchv2(`https://animetsu.live/v2/api/anime/search/?query=${encodedKeyword}`, headers);
|
||||||
const json = await response.json();
|
const json = await response.json();
|
||||||
|
|
||||||
json.results.forEach(anime => {
|
json.results.forEach(anime => {
|
||||||
const title = anime.title.english || anime.title.romaji || anime.title.native || "Unknown Title";
|
const title = anime.title.english || anime.title.romaji || anime.title.native || "Unknown Title";
|
||||||
const image = anime.coverImage.large;
|
const image = anime.cover_image.large;
|
||||||
const href = `${anime.id}`;
|
const href = `${anime.id}`;
|
||||||
|
|
||||||
if (title && href && image) {
|
if (title && href && image) {
|
||||||
@@ -35,19 +35,19 @@ async function searchResults(keyword) {
|
|||||||
async function extractDetails(id) {
|
async function extractDetails(id) {
|
||||||
const results = [];
|
const results = [];
|
||||||
const headers = {
|
const headers = {
|
||||||
'Referer': 'https://animetsu.to/',
|
'Referer': 'https://animetsu.live/',
|
||||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
||||||
};
|
};
|
||||||
|
|
||||||
const response = await fetchv2(`https://backend.animetsu.to/api/anime/info/${id}`, headers);
|
const response = await fetchv2(`https://animetsu.live/v2/api/anime/info/${id}`, headers);
|
||||||
const json = await response.json();
|
const json = await response.json();
|
||||||
|
|
||||||
const description = cleanHtmlSymbols(json.description) || "No description available";
|
const description = cleanHtmlSymbols(json.description) || "No description available";
|
||||||
|
|
||||||
results.push({
|
results.push({
|
||||||
description: description.replace(/<br>/g, ''),
|
description: description.replace(/<br>/g, ''),
|
||||||
aliases: 'N/A',
|
aliases: json.synonyms ? json.synonyms.join(', ') : 'N/A',
|
||||||
airdate: 'N/A'
|
airdate: json.start_date || 'N/A'
|
||||||
});
|
});
|
||||||
|
|
||||||
return JSON.stringify(results);
|
return JSON.stringify(results);
|
||||||
@@ -56,17 +56,17 @@ async function extractDetails(id) {
|
|||||||
async function extractEpisodes(id) {
|
async function extractEpisodes(id) {
|
||||||
const results = [];
|
const results = [];
|
||||||
const headers = {
|
const headers = {
|
||||||
'Referer': 'https://animetsu.to/',
|
'Referer': 'https://animetsu.live/',
|
||||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
||||||
};
|
};
|
||||||
|
|
||||||
const response = await fetchv2(`https://backend.animetsu.to/api/anime/eps/${id}`, headers);
|
const response = await fetchv2(`https://animetsu.live/v2/api/anime/eps/${id}`, headers);
|
||||||
const json = await response.json();
|
const json = await response.json();
|
||||||
|
|
||||||
for (const ep of json) {
|
for (const ep of json) {
|
||||||
results.push({
|
results.push({
|
||||||
number: ep.number,
|
number: ep.ep_num,
|
||||||
href: `&id=${id}&num=${ep.number}`
|
href: `&id=${id}&num=${ep.ep_num}`
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,45 +75,88 @@ async function extractEpisodes(id) {
|
|||||||
|
|
||||||
async function extractStreamUrl(slug) {
|
async function extractStreamUrl(slug) {
|
||||||
const headers = {
|
const headers = {
|
||||||
'Referer': 'https://animetsu.to/',
|
'Referer': 'https://animetsu.live/',
|
||||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
|
||||||
};
|
};
|
||||||
|
|
||||||
const fixedSlug = slug.replace('&', '?');
|
const id = (slug.match(/[?&]id=([^&]+)/) || [])[1];
|
||||||
|
const num = (slug.match(/[?&]num=([^&]+)/) || [])[1];
|
||||||
|
|
||||||
const streams = [];
|
const streams = [];
|
||||||
|
|
||||||
const serverListRes = await fetchv2(`https://backend.animetsu.to/api/anime/servers${fixedSlug}`, headers);
|
try {
|
||||||
const serverList = await serverListRes.json();
|
const serverListRes = await fetchv2(`https://animetsu.live/v2/api/anime/servers/${id}/${num}`, headers);
|
||||||
console.log("Fetched server list: " + JSON.stringify(serverList));
|
const serverList = await serverListRes.json();
|
||||||
const unfixedSlug = fixedSlug.replace('?', '&');
|
|
||||||
|
|
||||||
for (const server of serverList) {
|
const promises = [];
|
||||||
if (server.name?.toLowerCase().includes('zoro') || server.id?.toLowerCase().includes('zoro')) {
|
for (const server of serverList) {
|
||||||
console.log(`Skipping Zoro server: ${server.name || server.id}`);
|
for (const subType of ['sub', 'dub']) {
|
||||||
continue;
|
promises.push((async () => {
|
||||||
}
|
try {
|
||||||
|
const url = `https://animetsu.live/v2/api/anime/oppai/${id}/${num}?server=${server.id}&source_type=${subType}`;
|
||||||
|
const res = await fetchv2(url, headers);
|
||||||
|
const data = await res.json();
|
||||||
|
|
||||||
for (const subType of ['sub', ...(server.hasDub ? ['dub'] : [])]) {
|
if (data?.sources?.length) {
|
||||||
const url = `https://backend.animetsu.to/api/anime/tiddies?server=${server.id}${unfixedSlug}&subType=${subType}`;
|
data.sources.forEach(source => {
|
||||||
console.log("Fetching stream URL:" + url);
|
streams.push({
|
||||||
const res = await fetchv2(url, headers);
|
title: `${server.id} - ${source.quality} - ${subType.toUpperCase()}`,
|
||||||
const data = await res.json();
|
streamUrl: `https://mega-cloud.top/proxy${source.url}`,
|
||||||
|
headers: headers
|
||||||
if (data?.sources?.length) {
|
});
|
||||||
for (const { quality, url: streamUrl } of data.sources) {
|
});
|
||||||
const language = subType === 'sub' ? 'HARDSUB' : subType.toUpperCase();
|
}
|
||||||
streams.push(`${server.id} - ${quality} - ${language}`, streamUrl);
|
} catch (e) {
|
||||||
}
|
console.error(`Error fetching streams for server ${server.id} (${subType}):`, e);
|
||||||
|
}
|
||||||
|
})());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await Promise.all(promises);
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Error fetching server list:", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
const final = {
|
const serverOrder = { 'pahe': 1, 'meg': 2, 'kite': 3 };
|
||||||
streams,
|
const qualityOrder = (q) => {
|
||||||
subtitles: ""
|
if (q.includes('1080')) return 1;
|
||||||
|
if (q.includes('720')) return 2;
|
||||||
|
if (q.includes('480')) return 3;
|
||||||
|
if (q.includes('360')) return 4;
|
||||||
|
if (q.includes('master')) return 5;
|
||||||
|
return 6;
|
||||||
|
};
|
||||||
|
|
||||||
|
streams.sort((a, b) => {
|
||||||
|
const partsA = a.title.split(' - ');
|
||||||
|
const partsB = b.title.split(' - ');
|
||||||
|
|
||||||
|
const sA = partsA[0].toLowerCase();
|
||||||
|
const sB = partsB[0].toLowerCase();
|
||||||
|
const qA = partsA[1].toLowerCase();
|
||||||
|
const qB = partsB[1].toLowerCase();
|
||||||
|
|
||||||
|
const qOrderA = qualityOrder(qA);
|
||||||
|
const qOrderB = qualityOrder(qB);
|
||||||
|
|
||||||
|
if (qOrderA !== qOrderB) return qOrderA - qOrderB;
|
||||||
|
|
||||||
|
const sOrderA = serverOrder[sA] || 99;
|
||||||
|
const sOrderB = serverOrder[sB] || 99;
|
||||||
|
return sOrderA - sOrderB;
|
||||||
|
});
|
||||||
|
|
||||||
|
const finalStreams = streams.map((s, index) => ({
|
||||||
|
...s,
|
||||||
|
title: `[Server ${index + 1}] ${s.title}`
|
||||||
|
}));
|
||||||
|
|
||||||
|
const final = {
|
||||||
|
streams: finalStreams,
|
||||||
|
subtitle: ""
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log("RETURN: " + JSON.stringify(final));
|
|
||||||
return JSON.stringify(final);
|
return JSON.stringify(final);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user