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;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"name": "emp0ry",
|
||||
"icon": "https://avatars.githubusercontent.com/u/64217088"
|
||||
},
|
||||
"version": "1.0.3",
|
||||
"version": "1.0.4",
|
||||
"language": "Russian",
|
||||
"streamType": "HLS",
|
||||
"quality": "1080p",
|
||||
@@ -20,8 +20,5 @@
|
||||
"supportsMojuru": true,
|
||||
"supportsDartotsu": true,
|
||||
"supportsSora": true,
|
||||
"supportsLuna": true,
|
||||
"supportsAnymex": true,
|
||||
"supportsTsumi": true,
|
||||
"supportsHiyoku": true
|
||||
"supportsLuna": true
|
||||
}
|
||||
Reference in New Issue
Block a user