1
0

api: improve embed

This commit is contained in:
Snipcola 2024-07-21 06:39:35 +01:00
parent 7487bf0bb7
commit cb2d118d14
Signed by: snipcola
GPG Key ID: 4D52FDA87796B669
3 changed files with 140 additions and 95 deletions
api/src/lib
site/src/scripts/components

@ -11,38 +11,32 @@ export async function getEmbedInfo(type, info) {
const response = await get(`${config.url}/${path}`, config.base);
if (!response || response.status !== 200) return null;
let _sources = [];
let _subtitles = [];
let dashUrl = "";
let hlsUrl = "";
let audio = { names: [], order: [] };
let subtitles = [];
let qualities = { 1920: 1080 };
if (type === "movie") {
// Sources
const url = /hls:\s"(.+?)"/.exec(response.data)[1];
let quality = 1080;
// URL
dashUrl = /dash:\s"(.+?)"/.exec(response.data)[1];
hlsUrl = /hls:\s"(.+?)"/.exec(response.data)[1];
// Audio
try {
quality = Math.max(
...Object.values(
JSON.parse(/qualityByWidth:\s+({.*\})/.exec(response.data)[1]),
),
);
audio = JSON.parse(/audio:\s+({.*\})/.exec(response.data)[1]);
} catch {}
if (!url || !quality) {
return null;
}
_sources.push({ url, quality });
// Subtitles
try {
const subtitles = JSON.parse(
/cc:\s+(\[{.*\}\])/.exec(response.data)[1],
);
subtitles = JSON.parse(/cc:\s+(\[{.*\}\])/.exec(response.data)[1]);
} catch {}
for (const subtitle of subtitles) {
if (subtitle.url && subtitle.name)
_subtitles.push({ url: subtitle.url, lang: subtitle.name });
}
// Qualities
try {
qualities = JSON.parse(
/qualityByWidth:\s+({.*\})/.exec(response.data)[1],
);
} catch {}
} else {
// Season
@ -54,43 +48,67 @@ export async function getEmbedInfo(type, info) {
(e) => e.episode.toString() === info.episode.toString(),
);
// Sources
const url = episode.hls;
let quality = 1080;
// URL
dashUrl = episode.dash;
hlsUrl = episode.hls;
try {
quality = Math.max(...Object.values(episode.qbw));
} catch {}
if (!url || !quality) {
return null;
}
_sources.push({ url, quality });
// Audio
audio = episode.audio;
// Subtitles
subtitles = episode.cc;
// Qualities
try {
for (const subtitle of episode.cc) {
if (subtitle.url && subtitle.name)
_subtitles.push({ url: subtitle.url, lang: subtitle.name });
}
qualities = JSON.parse(
/qualityByWidth:\s+({.*\})/.exec(response.data)[1],
);
} catch {}
}
const sources = _sources
.filter(
(s) =>
typeof s?.url === "string" && s?.url?.endsWith(".m3u8") && s?.quality,
)
.map(({ url, quality }) => ({ url, quality }));
const subtitles = _subtitles
.filter(
(s) =>
typeof s?.url === "string" && s?.url?.endsWith(".vtt") && s?.lang,
)
.map(({ url, lang }) => ({ url, language: lang }));
// Checks
if (
!dashUrl ||
typeof dashUrl !== "string" ||
!dashUrl.endsWith(".mpd") ||
!hlsUrl ||
typeof hlsUrl !== "string" ||
!hlsUrl.endsWith(".m3u8")
) {
return null;
}
return sources.length > 0 ? { sources, subtitles } : null;
if (
!audio ||
typeof audio !== "object" ||
!audio.names ||
!Array.isArray(audio.names) ||
!audio.order ||
!Array.isArray(audio.order)
) {
audio = { names: [], order: [] };
}
subtitles = subtitles.filter(function (subtitle) {
return (
subtitle.url &&
typeof subtitle.url === "string" &&
subtitle.url.endsWith(".vtt") &&
subtitle.name &&
typeof subtitle.name === "string"
);
});
if (
!qualities ||
typeof qualities !== "object" ||
Object.values(qualities).length === 0
) {
qualities = { 1920: 1080 };
}
// Return
return { dashUrl, hlsUrl, audio, subtitles, qualities };
} catch {
return null;
}

File diff suppressed because one or more lines are too long

@ -1,4 +1,3 @@
import { config } from "../config.js";
import { initializeArea } from "./area.js";
import {
getContinueWatching,