mirror of
https://github.com/Radiquum/AniX.git
synced 2025-04-28 00:49:40 +05:00
feat: add kodik source parsing for custom player
This commit is contained in:
parent
0c6c990c67
commit
97c8935a0f
9 changed files with 3915 additions and 67 deletions
|
@ -1,8 +1,119 @@
|
|||
"use client";
|
||||
|
||||
import { Card } from "flowbite-react";
|
||||
import Player from "next-video/player";
|
||||
import { useEffect, useState } from "react";
|
||||
import { ENDPOINTS } from "#/api/config";
|
||||
|
||||
export const ReleasePlayerCustom = (props: { id: number }) => {
|
||||
const [voiceover, setVoiceover] = useState({
|
||||
selected: null,
|
||||
available: null,
|
||||
});
|
||||
const [source, setSource] = useState({
|
||||
selected: null,
|
||||
available: null,
|
||||
});
|
||||
const [episode, setEpisode] = useState({
|
||||
selected: null,
|
||||
available: null,
|
||||
});
|
||||
const [playerSrc, SetPlayerSrc] = useState(null);
|
||||
|
||||
const _fetchVoiceover = async (release_id: number) => {
|
||||
const response = await fetch(`${ENDPOINTS.release.episode}/${release_id}`);
|
||||
const data = await response.json();
|
||||
return data;
|
||||
};
|
||||
|
||||
const _fetchSource = async (release_id: number, voiceover_id: number) => {
|
||||
const response = await fetch(
|
||||
`${ENDPOINTS.release.episode}/${release_id}/${voiceover_id}`
|
||||
);
|
||||
const data = await response.json();
|
||||
return data;
|
||||
};
|
||||
|
||||
const _fetchEpisode = async (
|
||||
release_id: number,
|
||||
voiceover_id: number,
|
||||
source_id: number
|
||||
) => {
|
||||
const response = await fetch(
|
||||
`${ENDPOINTS.release.episode}/${release_id}/${voiceover_id}/${source_id}`
|
||||
);
|
||||
const data = await response.json();
|
||||
return data;
|
||||
};
|
||||
|
||||
const _fetchKodikManifest = async (url: string) => {
|
||||
const response = await fetch(
|
||||
`/api/proxy/${encodeURIComponent(url)}?html=true`
|
||||
);
|
||||
const data = await response.text();
|
||||
|
||||
const urlParamsRe = /var urlParams = .*;$/m;
|
||||
const urlParamsMatch = urlParamsRe.exec(data);
|
||||
|
||||
if (urlParamsMatch.length == 0) {
|
||||
alert("Failed to get urlParams");
|
||||
return;
|
||||
};
|
||||
|
||||
const urlParamsStr = urlParamsMatch[0].replace("var urlParams = '", "").replace("';", "");
|
||||
const urlParams = JSON.parse(urlParamsStr);
|
||||
|
||||
const urlStr = url.replace("https://kodik.info/", "")
|
||||
const type = urlStr.split("/")[0]
|
||||
const id = urlStr.split("/")[1]
|
||||
const hash = urlStr.split("/")[2]
|
||||
|
||||
const responseMan = await fetch(
|
||||
`/api/proxy/${encodeURIComponent("https://kodik.info/ftor")}?isNotAnixart=true`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
type: type,
|
||||
id: id,
|
||||
hash: hash,
|
||||
d: urlParams.d,
|
||||
d_sign: urlParams.d_sign,
|
||||
pd: urlParams.pd,
|
||||
pd_sign: urlParams.pd_sign,
|
||||
ref: urlParams.ref,
|
||||
ref_sign: urlParams.ref_sign,
|
||||
bad_user: false,
|
||||
cdn_is_working: true,
|
||||
info: {}
|
||||
}),
|
||||
}
|
||||
);
|
||||
const dataMan = await responseMan.json();
|
||||
let manifest = `https:${dataMan.links["360"][0].src.replace("360.mp4:hls:", "")}`;
|
||||
return manifest;
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const __getInfo = async () => {
|
||||
const vo = await _fetchVoiceover(props.id);
|
||||
const src = await _fetchSource(props.id, vo.types[0].id);
|
||||
const episodes = await _fetchEpisode(
|
||||
props.id,
|
||||
vo.types[0].id,
|
||||
src.sources[0].id
|
||||
);
|
||||
const manifest = await _fetchKodikManifest(episodes.episodes[0].url);
|
||||
SetPlayerSrc(manifest);
|
||||
};
|
||||
__getInfo();
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Card>
|
||||
{/* @ts-ignore */}
|
||||
{!playerSrc ? <p>Loading...</p> : <Player src={playerSrc} />}
|
||||
<p>ReleasePlayerCustom</p>
|
||||
</Card>
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue