AniX/player-parsers/libria.ts
2025-07-07 14:26:04 +05:00

72 lines
No EOL
1.9 KiB
TypeScript

import { asJSON } from "./shared";
const API_URL = "https://api.anilibria.tv/v3/title"
export async function getAnilibriaURL(res, url: string) {
if (!url.includes("libria")) {
asJSON(res, { message: "Wrong url provided for player libria" }, 400);
return
}
const decodedUrl = new URL(url)
const releaseId = decodedUrl.searchParams.get("id") || null
const releaseEp = decodedUrl.searchParams.get("ep") || null
let apiRes = await fetch(`${API_URL}?id=${releaseId}`);
if (!apiRes.ok) {
asJSON(res, { message: "LIBRIA: failed to get api response" }, 500);
return
}
let data = stripResponse(await apiRes.json(), releaseEp);
if (releaseEp) {
data["manifest"] = createManifest(data, releaseEp)
data["poster"] = getPoster(data, releaseEp)
}
asJSON(res, data, 200);
return
}
function stripResponse(data, releaseEp) {
const resp = {}
resp["posters"] = data.posters
resp["player"] = {}
resp["player"]["host"] = data.player.host
resp["player"]["list"] = data.player.list
if (releaseEp) {
resp["player"]["list"] = {}
resp["player"]["list"][releaseEp] = data.player.list[releaseEp]
}
return resp
}
function createManifest(data, releaseEp) {
const resolutions = {
sd: "854x480",
hd: "1280x720",
fhd: "1920x1080",
};
const stringBuilder: string[] = [];
stringBuilder.push("#EXTM3U");
for (const [key, value] of Object.entries(data.player.list[releaseEp].hls).reverse()) {
if (!value) continue
stringBuilder.push(`#EXT-X-STREAM-INF:RESOLUTION=${resolutions[key]}`);
stringBuilder.push(`https://${data.player.host}${value}`);
}
return stringBuilder.join("\n");
}
function getPoster(data, releaseEp) {
if (data.player.list[releaseEp].preview) return `https://anixart.libria.fun${data.player.list[releaseEp].preview}`
if (data.posters.medium.raw_base64_file) return data.posters.medium.url
return `https://anilibria.top${data.posters.medium.url}`
}