AniX/app/components/ReleasePlayer/PlayerParsing.ts
Radiquum 869c934af2
BREAKING: refactor: support api changes from player-parsers
BREAKING: environment variables NEXT_PUBLIC_*_PARSER_URL has been renamed to NEXT_PUBLIC_PLAYER_PARSER_URL

refactor: disable player experiment toggle if env var has not been found
fix/player-parsers(sibnet): add proto to media url response
2025-07-07 15:14:37 +05:00

147 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { tryCatchPlayer, tryCatchAPI } from "#/api/utils";
import { env } from 'next-runtime-env';
export async function _fetchAPI(
url: string,
onErrorMsg: string,
setPlayerError: (state) => void,
onErrorCodes?: Record<number, string>
) {
const { data, error } = await tryCatchAPI(fetch(url));
if (error) {
let errorDetail = "Мы правда не знаем что произошло...";
if (error.name) {
if (error.name == "TypeError") {
errorDetail = "Не удалось подключиться к серверу";
} else {
errorDetail = `Неизвестная ошибка ${error.name}: ${error.message}`;
}
}
if (error.code) {
if (Object.keys(onErrorCodes).includes(error.code.toString())) {
errorDetail = onErrorCodes[error.code.toString()];
} else {
errorDetail = `API вернуло ошибку: ${error.code}`;
}
}
setPlayerError({
message: onErrorMsg,
detail: errorDetail,
});
return null;
}
return data;
}
export async function _fetchPlayer(
url: string,
setPlayerError: (state) => void
) {
const { data, error } = (await tryCatchPlayer(fetch(url))) as any;
if (error) {
let errorDetail = "Мы правда не знаем что произошло...";
if (error.name) {
if (error.name == "TypeError") {
errorDetail = "Не удалось подключиться к серверу";
} else {
errorDetail = `Неизвестная ошибка ${error.name}: ${error.message}`;
}
} else if (error.message) {
errorDetail = error.message;
}
setPlayerError({
message: "Не удалось получить ссылку на видео",
detail: errorDetail,
});
return null;
}
return data;
}
export const _fetchKodikManifest = async (
url: string,
setPlayerError: (state) => void
) => {
const NEXT_PUBLIC_PLAYER_PARSER_URL = env("NEXT_PUBLIC_PLAYER_PARSER_URL")
if (!NEXT_PUBLIC_PLAYER_PARSER_URL) {
setPlayerError({
message: "Плеер не настроен",
detail: "переменная 'NEXT_PUBLIC_PLAYER_PARSER_URL' не обнаружена",
});
return { manifest: null, poster: null };
}
const data = await _fetchPlayer(
`${NEXT_PUBLIC_PLAYER_PARSER_URL}/?url=${url}&player=kodik`,
setPlayerError
);
if (data) {
let manifest: string = data.manifest
if (!manifest.startsWith("http")) {
let file = new File([manifest], "manifest.m3u8", {
type: "application/x-mpegURL",
});
manifest = URL.createObjectURL(file);
}
return { manifest, poster: data.poster };
}
return { manifest: null, poster: null };
};
export const _fetchAnilibriaManifest = async (
url: string,
setPlayerError: (state) => void
) => {
const NEXT_PUBLIC_PLAYER_PARSER_URL = env("NEXT_PUBLIC_PLAYER_PARSER_URL")
if (!NEXT_PUBLIC_PLAYER_PARSER_URL) {
setPlayerError({
message: "Плеер не настроен",
detail: "переменная 'NEXT_PUBLIC_PLAYER_PARSER_URL' не обнаружена",
});
return { manifest: null, poster: null };
}
const data = await _fetchPlayer(
`${NEXT_PUBLIC_PLAYER_PARSER_URL}/?url=${encodeURIComponent(url)}&player=libria`,
setPlayerError
);
if (data) {
let file = new File([data.manifest], "manifest.m3u8", {
type: "application/x-mpegURL",
});
let manifest = URL.createObjectURL(file);
return { manifest, poster: data.poster };
}
return { manifest: null, poster: null };
};
export const _fetchSibnetManifest = async (
url: string,
setPlayerError: (state) => void
) => {
const NEXT_PUBLIC_PLAYER_PARSER_URL = env("NEXT_PUBLIC_PLAYER_PARSER_URL")
if (!NEXT_PUBLIC_PLAYER_PARSER_URL) {
setPlayerError({
message: "Плеер не настроен",
detail: "переменная 'NEXT_PUBLIC_PLAYER_PARSER_URL' не обнаружена",
});
return { manifest: null, poster: null };
}
const data = await _fetchPlayer(
`${NEXT_PUBLIC_PLAYER_PARSER_URL}/?url=${url}&player=sibnet`,
setPlayerError
);
if (data) {
return { manifest: data.manifest, poster: data.poster };
}
return { manifest: null, poster: null };
};