mirror of
https://github.com/movixcorp/MovixOpenSource.git
synced 2026-08-07 20:00:10 +00:00
- corrige l’extraction Fsvid/Vidzy dans proxiesembed, les extensions et le userscript avec un décodage XOR/P.A.C.K.E.R plus robuste - rejette les URL « troll » et supprime les résultats Fsvid/Vidzy contaminés des caches - ajoute KissKH pour les films et séries avec matching TMDB, catalogue, cache distribué, verrouillage, rotation des proxys et fallback sécurisé - ajoute le relais KissKH HLS/MP4 dans proxiesembed, avec retry SOCKS5 sur les erreurs 403 et streaming des segments BYTERANGE - prend en charge les sous-titres KissKH SRT/TXT/TXT2, leur déchiffrement AES et leur conversion en WebVTT - intègre KissKH au lecteur, aux priorités de sources, aux extensions Chrome/Firefox et au userscript - améliore la sélection, le formatage sécurisé, la traduction et l’affichage Picture-in-Picture des sous-titres - corrige le Cast web et Android pour transmettre les sous-titres internes, externes, KissKH et traduits - ajoute le support des pistes WebVTT inline via le relais LAN Android et améliore le suivi des sessions Cast - protège les liens jouables des caches Cpasmal et Coflix contre les rafraîchissements vides ou concurrents - fiabilise la sélection des saisons FStream et améliore le matching DarkiWorld par TMDB, titre et année - simplifie les nouvelles URL TMDB tout en conservant le décodage des anciens identifiants encodés - corrige l’opacité des icônes SVG dans toute l’interface en séparant la couleur de leur niveau d’opacité - met à jour le Dockerfile vers Node.js 22 et installe uniquement les dépendances runtime du workspace Hono - ajoute le workspace server avec ses dépendances dédiées et un arrêt gracieux sur SIGTERM/SIGINT - accélère le healthcheck Docker et évite de recopier tous les node_modules du builder dans l’image finale - retire les migrations et créations de tables automatiques au démarrage de la Main API au profit de db:init - attribue un port CycleTLS distinct à chaque worker pour éviter les conflits en mode cluster - ajoute des tests de non-régression pour KissKH, les caches de sources, CycleTLS et le Cast Android - publie Android 2.5.8 build 17 avec le nouvel APK - met à jour les extensions Chrome 1.3.13 et Firefox 1.5.10 Co-authored-by: GPT-5.6 Sol <noreply@openai.com>
70 lines
2.3 KiB
JavaScript
70 lines
2.3 KiB
JavaScript
import { serve } from '@hono/node-server';
|
|
import { serveStatic } from '@hono/node-server/serve-static';
|
|
import { Hono } from 'hono';
|
|
import { readFile } from 'node:fs/promises';
|
|
import { existsSync } from 'node:fs';
|
|
import { join, dirname } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { buildSocialPreviewResponse } from '../functions/_lib/socialPreview.js';
|
|
import { registerGracefulShutdown } from './gracefulShutdown.js';
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const ROOT = join(__dirname, '..');
|
|
const DIST = join(ROOT, 'dist');
|
|
const INDEX_HTML = join(DIST, 'index.html');
|
|
|
|
if (!existsSync(DIST)) {
|
|
console.error(`[server] dist/ introuvable (${DIST}). Lance "npm run build" avant "npm start".`);
|
|
process.exit(1);
|
|
}
|
|
|
|
const app = new Hono();
|
|
|
|
app.use('/*', async (c, next) => {
|
|
await next();
|
|
if (c.res.headers.has('cache-control')) return;
|
|
const path = new URL(c.req.url).pathname;
|
|
const isAssetHit = path.startsWith('/assets/') && c.res.status === 200;
|
|
if (isAssetHit) {
|
|
c.header('Cache-Control', 'public, max-age=31536000, immutable');
|
|
} else {
|
|
c.header('Cache-Control', 'no-cache, must-revalidate');
|
|
}
|
|
});
|
|
|
|
app.get('/health', (c) => c.json({ ok: true, runtime: 'node', app: 'movix-hono' }));
|
|
|
|
const toCloudflareCtx = (c) => ({
|
|
request: new Request(c.req.url, { method: c.req.method, headers: c.req.raw.headers }),
|
|
env: process.env,
|
|
next: async () => {
|
|
const html = await readFile(INDEX_HTML, 'utf8');
|
|
return new Response(html, { headers: { 'Content-Type': 'text/html; charset=utf-8' } });
|
|
},
|
|
});
|
|
|
|
const socialPreviewHandler = async (c) => {
|
|
const res = await buildSocialPreviewResponse(toCloudflareCtx(c));
|
|
return res;
|
|
};
|
|
|
|
app.get('/movie/:id', socialPreviewHandler);
|
|
app.get('/tv/:id', socialPreviewHandler);
|
|
|
|
app.use('/*', serveStatic({ root: './dist' }));
|
|
|
|
app.get('*', async (c) => {
|
|
const path = new URL(c.req.url).pathname;
|
|
if (/\.[^/]+$/.test(path)) {
|
|
return c.text('Not Found', 404);
|
|
}
|
|
const html = await readFile(INDEX_HTML, 'utf8');
|
|
return c.html(html);
|
|
});
|
|
|
|
const port = Number(process.env.PORT) || 3001;
|
|
const server = serve({ fetch: app.fetch, port, hostname: '0.0.0.0' }, (info) => {
|
|
console.log(`[server] Movix Hono → http://0.0.0.0:${info.port}`);
|
|
});
|
|
|
|
registerGracefulShutdown(server);
|