mirror of
https://github.com/Shineii86/AniKotoAPI.git
synced 2026-10-22 02:45:10 +00:00
fix: Episodes Ajax test, strip quotes from server_ids, dynamic stream resolve setup
This commit is contained in:
@@ -74,7 +74,7 @@ const extractEpisodeList = async (slugOrId) => {
|
|||||||
const href = $ep(el).attr("href") || "";
|
const href = $ep(el).attr("href") || "";
|
||||||
const epTitle = $ep(el).find(".ep-title, .ep-name").text().trim() || "";
|
const epTitle = $ep(el).find(".ep-title, .ep-name").text().trim() || "";
|
||||||
const isActive = $ep(el).hasClass("active") || false;
|
const isActive = $ep(el).hasClass("active") || false;
|
||||||
const serverIds = $ep(el).attr("data-ids") || "";
|
const serverIds = ($ep(el).attr("data-ids") || "").replace(/^\\?["']|\\?["']$/g, "");
|
||||||
const timestamp = $ep(el).attr("data-timestamp") || "";
|
const timestamp = $ep(el).attr("data-timestamp") || "";
|
||||||
const malId = $ep(el).attr("data-mal") || "";
|
const malId = $ep(el).attr("data-mal") || "";
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ const extractEpisodeListAjax = async (animeId, style = "", vrf = "") => {
|
|||||||
timestamp: a.attr("data-timestamp") || "",
|
timestamp: a.attr("data-timestamp") || "",
|
||||||
has_sub: a.attr("data-sub") === "1",
|
has_sub: a.attr("data-sub") === "1",
|
||||||
has_dub: a.attr("data-dub") === "1",
|
has_dub: a.attr("data-dub") === "1",
|
||||||
server_ids: a.attr("data-ids") || "",
|
server_ids: (a.attr("data-ids") || "").replace(/^\\?["']|\\?["']$/g, ""),
|
||||||
active: a.hasClass("active") || false
|
active: a.hasClass("active") || false
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ const tests = [
|
|||||||
{ name: "Servers", url: "/servers?ids=1", check: (d) => d.results },
|
{ name: "Servers", url: "/servers?ids=1", check: (d) => d.results },
|
||||||
// Streaming
|
// Streaming
|
||||||
{ name: "Stream", url: "/watch?slug=one-piece-odmau&ep=1", check: (d) => d.results?.servers || d.results?.episodeNumber },
|
{ name: "Stream", url: "/watch?slug=one-piece-odmau&ep=1", check: (d) => d.results?.servers || d.results?.episodeNumber },
|
||||||
{ name: "Stream Resolve", url: "/stream/resolve?id=MTF1dkFtaW9BRTZPbzJJRElFZUZrNHVJWFRVWWRWdU5JYnhuaU95bVRYSzk1Z0lVVjJha2FnSE95U3F4M1RsaXNCSnlnd05rTTlBUldTZGZxZjQzajVxcXVDRVY5bjBocnRCV2tkNnNzaXFnc3c5M1JJWjRnNmt5bDNPdm1TczlvVXdwWGplKzFmQmZJMlp0OTBNTXd3PT0&slug=one-piece-odmau", check: (d) => d.results?.url, optional: true },
|
|
||||||
|
|
||||||
// Discovery endpoints
|
// Discovery endpoints
|
||||||
{ name: "Suggestions", url: "/suggestions?keyword=naruto", check: (d) => d.results },
|
{ name: "Suggestions", url: "/suggestions?keyword=naruto", check: (d) => d.results },
|
||||||
@@ -52,7 +52,6 @@ const tests = [
|
|||||||
|
|
||||||
// Search variants
|
// Search variants
|
||||||
{ name: "Search Suggest", url: "/search/suggest?keyword=naruto", check: (d) => d.results },
|
{ name: "Search Suggest", url: "/search/suggest?keyword=naruto", check: (d) => d.results },
|
||||||
{ name: "Episodes Ajax", url: "/episodes-ajax/one-piece-odmau", check: (d) => d.results, optional: true },
|
|
||||||
{ name: "Trending Sidebar", url: "/trending-sidebar", check: (d) => d.results },
|
{ name: "Trending Sidebar", url: "/trending-sidebar", check: (d) => d.results },
|
||||||
|
|
||||||
// Anime detail
|
// Anime detail
|
||||||
@@ -142,11 +141,44 @@ async function runTest(test) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function fetchJson(url) {
|
||||||
|
const res = await fetch(`${BASE}${url}`);
|
||||||
|
return res.ok ? res.json() : null;
|
||||||
|
}
|
||||||
|
|
||||||
async function runAll() {
|
async function runAll() {
|
||||||
console.log(`\n🧪 Running ${tests.length} tests...\n`);
|
console.log(`\n🧪 Running ${tests.length} tests...\n`);
|
||||||
console.log(`📡 API: ${BASE}\n`);
|
console.log(`📡 API: ${BASE}\n`);
|
||||||
|
|
||||||
// Run tests sequentially to avoid rate limiting
|
// ---- FEATURE: Resolve dynamic test dependencies ----
|
||||||
|
// NOTE: Fetch info to get numeric animeId for episodes-ajax
|
||||||
|
let animeId = "1642";
|
||||||
|
let linkId = "";
|
||||||
|
try {
|
||||||
|
const info = await fetchJson("/info?id=one-piece-odmau");
|
||||||
|
if (info?.success && info.results?.animeId) {
|
||||||
|
animeId = info.results.animeId;
|
||||||
|
}
|
||||||
|
// NOTE: Get a valid link_id via episodes → servers flow
|
||||||
|
const epData = await fetchJson("/episodes/one-piece-odmau");
|
||||||
|
if (epData?.success && epData.results?.episodes?.length > 0) {
|
||||||
|
const sid = epData.results.episodes[0].server_ids;
|
||||||
|
if (sid) {
|
||||||
|
const srvData = await fetchJson(`/servers?ids=${encodeURIComponent(sid)}`);
|
||||||
|
if (srvData?.success && srvData.results?.length > 0) {
|
||||||
|
linkId = srvData.results[0].link_id || "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (_) { /* use defaults */ }
|
||||||
|
|
||||||
|
// ---- FEATURE: Inject dynamic tests with live data ----
|
||||||
|
tests.push({ name: "Episodes Ajax", url: `/episodes-ajax/${animeId}`, check: (d) => d.results?.episodes || d.results?.totalEpisodes });
|
||||||
|
if (linkId) {
|
||||||
|
tests.push({ name: "Stream Resolve", url: `/stream/resolve?id=${encodeURIComponent(linkId)}&slug=one-piece-odmau`, check: (d) => d.results?.url });
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- FEATURE: Run all tests sequentially ----
|
||||||
for (const test of tests) {
|
for (const test of tests) {
|
||||||
await runTest(test);
|
await runTest(test);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user