dptxa-proxy / src /pages /api /admin /movie /sync-episodes.js
TXAVLOG
Deploy DPTXA to Hugging Face Spaces
4bea261
Raw
History Blame Contribute Delete
5.3 kB
import { getLocalMovies, saveLocalMovie } from '../../../../lib/localDb.js';
export async function POST({ request }) {
// Check quyền admin từ cookie
const cookies = request.headers.get('cookie') || '';
const hasToken = cookies.includes('auth_token=');
if (!hasToken) {
return new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401 });
}
const { slug, type } = await request.json();
if (!slug) {
return new Response(JSON.stringify({ error: 'Thiếu slug phim' }), { status: 400 });
}
try {
const localMovies = await getLocalMovies();
const movieData = localMovies[slug];
if (!movieData) {
return new Response(JSON.stringify({ error: 'Không tìm thấy phim trong database cục bộ' }), { status: 404 });
}
// Gọi API KKPhim gốc
const res = await fetch(`https://phimapi.com/phim/${slug}`);
if (!res.ok) {
return new Response(JSON.stringify({ error: `Không thể gọi API KKPhim (HTTP ${res.status})` }), { status: 500 });
}
const apiData = await res.json();
if (!apiData.status || !apiData.episodes) {
return new Response(JSON.stringify({ error: 'Dữ liệu API KKPhim rỗng' }), { status: 500 });
}
const apiEpisodes = apiData.episodes || [];
const localEpisodes = movieData.episodes || [];
let updatedCount = 0;
let addedCount = 0;
if (type === 'sync_new') {
// Chỉ quét và thêm tập phim mới
const updatedEpisodes = [];
for (const apiServer of apiEpisodes) {
const localServer = localEpisodes.find(s => s.server_name === apiServer.server_name);
if (!localServer) {
updatedEpisodes.push(apiServer);
addedCount += apiServer.server_data.length;
continue;
}
const mergedData = [...localServer.server_data];
const localNames = new Set(localServer.server_data.map(e => e.name));
for (const apiEp of apiServer.server_data) {
if (!localNames.has(apiEp.name)) {
mergedData.push(apiEp);
addedCount++;
}
}
updatedEpisodes.push({
server_name: apiServer.server_name,
server_data: mergedData
});
}
movieData.episodes = updatedEpisodes;
movieData.movie.episode_current = apiData.movie.episode_current || movieData.movie.episode_current;
movieData.movie.episode_total = apiData.movie.episode_total || movieData.movie.episode_total || null;
movieData.movie.modified = { time: new Date().toISOString() };
await saveLocalMovie(slug, movieData);
return new Response(JSON.stringify({
message: `Đồng bộ thành công! Đã thêm ${addedCount} tập phim mới.`,
episodes: updatedEpisodes,
episode_current: movieData.movie.episode_current
}));
} else if (type === 'sync_all') {
// Cập nhật lại toàn bộ link stream của tất cả các tập, giữ nguyên Intro/Outro
const updatedEpisodes = [];
for (const apiServer of apiEpisodes) {
const localServer = localEpisodes.find(s => s.server_name === apiServer.server_name);
if (!localServer) {
updatedEpisodes.push(apiServer);
updatedCount += apiServer.server_data.length;
continue;
}
const mergedData = [];
const localMap = new Map(localServer.server_data.map(e => [e.name, e]));
for (const apiEp of apiServer.server_data) {
const localEp = localMap.get(apiEp.name);
if (localEp) {
// Giữ lại cấu hình Intro/Outro cũ
mergedData.push({
...apiEp,
introStart: localEp.introStart,
introEnd: localEp.introEnd,
outroStart: localEp.outroStart,
outroEnd: localEp.outroEnd,
// Tương thích với các trường cũ nếu có
time_intro_start: localEp.time_intro_start || 0,
time_intro_end: localEp.time_intro_end || 0,
time_outro_start: localEp.time_outro_start || 0,
time_outro_end: localEp.time_outro_end || 0
});
updatedCount++;
} else {
mergedData.push(apiEp);
addedCount++;
}
}
updatedEpisodes.push({
server_name: apiServer.server_name,
server_data: mergedData
});
}
movieData.episodes = updatedEpisodes;
movieData.movie.episode_current = apiData.movie.episode_current || movieData.movie.episode_current;
movieData.movie.episode_total = apiData.movie.episode_total || movieData.movie.episode_total || null;
movieData.movie.modified = { time: new Date().toISOString() };
await saveLocalMovie(slug, movieData);
return new Response(JSON.stringify({
message: `Đồng bộ thành công! Làm mới ${updatedCount} link tập và thêm ${addedCount} tập mới.`,
episodes: updatedEpisodes,
episode_current: movieData.movie.episode_current
}));
}
return new Response(JSON.stringify({ error: 'Loại đồng bộ không hợp lệ' }), { status: 400 });
} catch (e) {
return new Response(JSON.stringify({ error: e.message }), { status: 500 });
}
}