diff --git a/api-prox/hooks/episode.ts.disabled b/api-prox/hooks/episode.disabled.ts similarity index 97% rename from api-prox/hooks/episode.ts.disabled rename to api-prox/hooks/episode.disabled.ts index 0386119..7b43288 100644 --- a/api-prox/hooks/episode.ts.disabled +++ b/api-prox/hooks/episode.disabled.ts @@ -7,9 +7,15 @@ import { logger } from "../shared"; import fs from "fs/promises"; -const HOSTNAME = "http://127.0.0.1:7001"; +let HOSTNAME: null | string = null; +if (process.env.HOST_URL) { + HOSTNAME = process.env.HOST_URL; +} + export function match(path: string): boolean { + // если не установлен хост, не запускаем хук + if (!HOSTNAME) return false // используем только страницы с путём /episode/* const pathRe = /^\/episode\/\d+/; if (pathRe.test(path)) return true; diff --git a/api-prox/hooks/toggles.ts b/api-prox/hooks/toggles.ts index 64e2302..101f8ed 100644 --- a/api-prox/hooks/toggles.ts +++ b/api-prox/hooks/toggles.ts @@ -57,8 +57,8 @@ export async function get(data: Toggles, url: URL) { data.impMessageEnabled = true; data.impMessageText = "разработчик AniX / Api-Prox-Svc"; data.impMessageLink = "https://bento.me/radiquum"; - data.impMessageBackgroundColor = "ffb3d0" - data.impMessageTextColor = "ffffff" + data.impMessageBackgroundColor = "ffb3d0"; + data.impMessageTextColor = "ffffff"; data.apiAltAvailable = false; data.apiAltUrl = ""; @@ -68,6 +68,9 @@ export async function get(data: Toggles, url: URL) { data.kodikIframeAd = false; data.kodikAdIframeUrl = ""; - // data.iframeEmbedUrl = "https://rani.loophole.site/iframe?url=" // необходимо менять на юрл сервиса (пока вручную) если используется хук с кастомными эпизодами (episode.ts) + if (process.env.HOST_URL) { + data.iframeEmbedUrl = `${process.env.HOST_URL}/player?url=`; + } + return data; } diff --git a/api-prox/iframe.ts b/api-prox/iframe.ts new file mode 100644 index 0000000..b8d9d9e --- /dev/null +++ b/api-prox/iframe.ts @@ -0,0 +1,14 @@ +export const Iframe = (url: string) => { + return ` + + + + Веб-плеер + + + + + + + ` +} diff --git a/api-prox/index.ts b/api-prox/index.ts index 83cf8bc..0bec03a 100644 --- a/api-prox/index.ts +++ b/api-prox/index.ts @@ -10,6 +10,8 @@ import { } from "./shared"; import express from "express"; import fs from "fs/promises"; +import { MediaChromeTheme } from "./media-chrome"; +import { Iframe } from "./iframe"; const app = express(); app.use(express.json()); @@ -20,8 +22,8 @@ const port = 7001; const loadedHooks: LoadedHook[] = []; -app.get("/iframe", async (req, res) => { - const url = req.query.url || null; +app.get("/player", async (req, res) => { + let url = req.query.url || null; res.status(200); res.set({ @@ -34,6 +36,68 @@ app.get("/iframe", async (req, res) => { res.send("

No url query found!

"); return; } + + let player = ""; + let poster = ""; + + const CUSTOM_PLAYER_DOMAINS = [ + "video.sibnet.ru", + "anixart.libria.fun", + "kodik.info", + "aniqit.com", + "kodik.cc", + "kodik.biz", + ]; + const urlDomain = new URL(url.toString()); + const PLAYER_PARSER_URL = process.env.PLAYER_PARSER_URL || null; + + if (CUSTOM_PLAYER_DOMAINS.includes(urlDomain.hostname)) { + try { + if (!PLAYER_PARSER_URL) throw new Error(); + + if ( + ["kodik.info", "aniqit.com", "kodik.cc", "kodik.biz"].includes( + urlDomain.hostname + ) + ) { + player = "kodik"; + } + if ("anixart.libria.fun" == urlDomain.hostname) { + player = "libria"; + } + if ("video.sibnet.ru" == urlDomain.hostname) { + player = "sibnet"; + } + + const playerParserRes = await fetch( + `${PLAYER_PARSER_URL}?url=${encodeURIComponent(url.toString())}&player=${player}` + ); + + if (!playerParserRes.ok) throw new Error(); + + const playerParserData: { manifest: string; poster: string } = + await playerParserRes.json(); + + poster = playerParserData.poster; + if (playerParserData.manifest.startsWith("#EXTM3U")) { + const playerUrlArray = playerParserData.manifest.split("\n"); + url = playerUrlArray.join("\\n"); + } else { + url = playerParserData.manifest; + } + } catch { + res.send(Iframe(url.toString())); + return; + } + } else if (url.toString().endsWith("mp4")) { + player = "mp4"; + } else if (url.toString().endsWith(".m3u8")) { + player = "hls"; + } else { + res.send(Iframe(url.toString())); + return; + } + res.send(` @@ -41,9 +105,38 @@ app.get("/iframe", async (req, res) => { Веб-плеер + ${["kodik", "libria", "hls"].includes(player) ? '' : ""} + - + + ${MediaChromeTheme()} + + + ${ + ["kodik", "libria", "hls"].includes(player) ? + `` + : `` + } + `); @@ -107,8 +200,12 @@ app.get("/*path", async (req, res) => { for (let i = 0; i < hooks.length; i++) { const name = hooks[i]; - if (!name.endsWith(".ts")) continue; - if (name.includes("example")) continue; + if ( + !name.endsWith(".ts") || + name.includes("example") || + name.includes("disabled") + ) + continue; const isHookLoaded = loadedHooks.find( (item) => item.path == `./hooks/${name}` @@ -233,8 +330,12 @@ app.post("/*path", async (req, res) => { for (let i = 0; i < hooks.length; i++) { const name = hooks[i]; - if (!name.endsWith(".ts")) continue; - if (name.includes("example")) continue; + if ( + !name.endsWith(".ts") || + name.includes("example") || + name.includes("disabled") + ) + continue; const isHookLoaded = loadedHooks.find( (item) => item.path == `./hooks/${name}` diff --git a/api-prox/media-chrome.ts b/api-prox/media-chrome.ts new file mode 100644 index 0000000..a0c1a7f --- /dev/null +++ b/api-prox/media-chrome.ts @@ -0,0 +1,813 @@ +export const MediaChromeTheme = () => { + return ` + + + + + +` +} \ No newline at end of file