Add modules by emp0ry
This commit is contained in:
@@ -24,6 +24,24 @@ function pickBestHls(ep) {
|
||||
return ep?.hls_1080 || ep?.hls_720 || ep?.hls_480 || null;
|
||||
}
|
||||
|
||||
function _packEpisode(payload) {
|
||||
return "aniliberty:" + encodeURIComponent(JSON.stringify(payload || {}));
|
||||
}
|
||||
|
||||
function _unpackEpisode(href) {
|
||||
const s = String(href || "");
|
||||
if (!s.startsWith("aniliberty:")) return null;
|
||||
return _safeJsonParse(decodeURIComponent(s.slice("aniliberty:".length)), null);
|
||||
}
|
||||
|
||||
function _safeJsonParse(s, fallback) {
|
||||
try {
|
||||
return JSON.parse(s);
|
||||
} catch (_) {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------
|
||||
// Detect working API domain
|
||||
// ------------------------------------------------------------
|
||||
@@ -117,8 +135,11 @@ async function extractEpisodes(url) {
|
||||
const eps = Array.isArray(data?.episodes) ? data.episodes : [];
|
||||
|
||||
const out = eps.map((ep, idx) => {
|
||||
const href = pickBestHls(ep);
|
||||
if (!href) return null;
|
||||
const url1080 = ep?.hls_1080 || null;
|
||||
const url720 = ep?.hls_720 || null;
|
||||
const url480 = ep?.hls_480 || null;
|
||||
const best = url1080 || url720 || url480;
|
||||
if (!best) return null;
|
||||
|
||||
const num = Number.isFinite(ep?.ordinal)
|
||||
? ep.ordinal
|
||||
@@ -137,7 +158,12 @@ async function extractEpisodes(url) {
|
||||
: undefined;
|
||||
|
||||
const entry = {
|
||||
href,
|
||||
href: _packEpisode({
|
||||
url1080,
|
||||
url720,
|
||||
url480,
|
||||
fallback: best
|
||||
}),
|
||||
number: num,
|
||||
title,
|
||||
image
|
||||
@@ -162,7 +188,68 @@ async function extractEpisodes(url) {
|
||||
// ------------------------------------------------------------
|
||||
async function extractStreamUrl(url) {
|
||||
try {
|
||||
return url; // direct HLS
|
||||
const payload = _unpackEpisode(url);
|
||||
if (!payload) {
|
||||
return url; // backward compatibility for old episode href format
|
||||
}
|
||||
|
||||
const url1080 = (payload.url1080 || "").toString().trim() || null;
|
||||
const url720 = (payload.url720 || "").toString().trim() || null;
|
||||
const url480 = (payload.url480 || "").toString().trim() || null;
|
||||
const fallback = (payload.fallback || "").toString().trim() || null;
|
||||
|
||||
const streams = [];
|
||||
|
||||
if (url1080) {
|
||||
streams.push({
|
||||
title: "1080p",
|
||||
streamUrl: url1080,
|
||||
url1080,
|
||||
url720,
|
||||
url480,
|
||||
headers: {
|
||||
"User-Agent": "Mozilla/5.0",
|
||||
"Referer": DEFAULT_IMAGE_HOST + "/"
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (url720) {
|
||||
streams.push({
|
||||
title: "720p",
|
||||
streamUrl: url720,
|
||||
url1080,
|
||||
url720,
|
||||
url480,
|
||||
headers: {
|
||||
"User-Agent": "Mozilla/5.0",
|
||||
"Referer": DEFAULT_IMAGE_HOST + "/"
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (url480) {
|
||||
streams.push({
|
||||
title: "480p",
|
||||
streamUrl: url480,
|
||||
url1080,
|
||||
url720,
|
||||
url480,
|
||||
headers: {
|
||||
"User-Agent": "Mozilla/5.0",
|
||||
"Referer": DEFAULT_IMAGE_HOST + "/"
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!streams.length) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return JSON.stringify({
|
||||
streams,
|
||||
subtitle: "https://none.com"
|
||||
});
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user