dptxa-proxy / src /lib /localDb.js
TXAVLOG
Deploy DPTXA to Hugging Face Spaces
4bea261
Raw
History Blame Contribute Delete
7.75 kB
import fs from 'node:fs/promises';
import path from 'node:path';
import { txasupabase } from './txasupabase.js';
const DATA_DIR = path.join(process.cwd(), 'src/data');
const MOVIES_FILE = path.join(DATA_DIR, 'movies.json');
const DELETED_FILE = path.join(DATA_DIR, 'deleted_movies.json');
const GENRES_FILE = path.join(DATA_DIR, 'genres.json');
const COUNTRIES_FILE = path.join(DATA_DIR, 'countries.json');
const ACTORS_FILE = path.join(DATA_DIR, 'actors.json');
const SERVERS_FILE = path.join(DATA_DIR, 'servers.json');
const USERS_FILE = path.join(DATA_DIR, 'users.json');
const RATINGS_FILE = path.join(DATA_DIR, 'ratings.json');
// --- AUTO MIGRATION FROM LOCAL JSON TO SUPABASE ---
let isMigrated = false;
async function checkAndMigrate() {
if (isMigrated) return;
try {
// 1. Kiểm tra xem trên Supabase đã có phim nào chưa
const movies = await txasupabase.getLocalMovies();
if (Object.keys(movies).length === 0) {
console.log('=== [SUPABASE AUTO-MIGRATION START] ===');
// A. Di trú Server
try {
const localServers = JSON.parse(await fs.readFile(SERVERS_FILE, 'utf-8'));
if (Array.isArray(localServers) && localServers.length > 0) {
console.log(`Migrating ${localServers.length} servers to Supabase...`);
for (const s of localServers) {
await txasupabase.saveServer(s.name);
}
}
} catch (e) {}
// B. Di trú Thể loại
try {
const localGenres = JSON.parse(await fs.readFile(GENRES_FILE, 'utf-8'));
if (Array.isArray(localGenres) && localGenres.length > 0) {
console.log(`Migrating ${localGenres.length} genres to Supabase...`);
for (const g of localGenres) {
await txasupabase.saveGenre(g.slug, g.name);
}
}
} catch (e) {}
// C. Di trú Quốc gia
try {
const localCountries = JSON.parse(await fs.readFile(COUNTRIES_FILE, 'utf-8'));
if (Array.isArray(localCountries) && localCountries.length > 0) {
console.log(`Migrating ${localCountries.length} countries to Supabase...`);
for (const c of localCountries) {
await txasupabase.saveCountry(c.slug, c.name);
}
}
} catch (e) {}
// D. Di trú Diễn viên
try {
const localActors = JSON.parse(await fs.readFile(ACTORS_FILE, 'utf-8'));
if (Array.isArray(localActors) && localActors.length > 0) {
console.log(`Migrating ${localActors.length} actors to Supabase...`);
for (const a of localActors) {
await txasupabase.saveActor(a.name);
}
}
} catch (e) {}
// E. Di trú Deleted/Hidden Movies list
try {
const localDeleted = JSON.parse(await fs.readFile(DELETED_FILE, 'utf-8'));
if (Array.isArray(localDeleted) && localDeleted.length > 0) {
console.log(`Migrating ${localDeleted.length} hidden movie slugs to Supabase...`);
for (const slug of localDeleted) {
await txasupabase.deleteLocalMovie(slug);
}
}
} catch (e) {}
// F. Di trú Phim cục bộ
try {
const localMovies = JSON.parse(await fs.readFile(MOVIES_FILE, 'utf-8'));
const entries = Object.entries(localMovies);
if (entries.length > 0) {
console.log(`Migrating ${entries.length} movies with episodes to Supabase...`);
for (const [slug, mData] of entries) {
await txasupabase.saveLocalMovie(slug, mData);
}
}
} catch (e) {}
// G. Di trú Users
try {
const localUsers = JSON.parse(await fs.readFile(USERS_FILE, 'utf-8'));
if (Array.isArray(localUsers) && localUsers.length > 0) {
console.log(`Migrating ${localUsers.length} user accounts to Supabase...`);
for (const user of localUsers) {
await txasupabase.saveUser(user);
}
}
} catch (e) {}
// H. Di trú Ratings
try {
const localRatings = JSON.parse(await fs.readFile(RATINGS_FILE, 'utf-8'));
const entries = Object.entries(localRatings);
if (entries.length > 0) {
console.log(`Migrating ${entries.length} movie ratings to Supabase...`);
for (const [slug, rData] of entries) {
await txasupabase.saveRating(slug, rData.count, rData.totalScore, rData.userRatings || {}, rData.ipRatings || {});
}
}
} catch (e) {}
console.log('=== [SUPABASE AUTO-MIGRATION COMPLETED SUCCESS] ===');
}
isMigrated = true;
} catch (err) {
console.error('Error during Supabase auto-migration:', err);
}
}
// --- MOVIES ---
export async function getLocalMovies() {
await checkAndMigrate();
return await txasupabase.getLocalMovies();
}
export async function saveLocalMovie(slug, movieData) {
await checkAndMigrate();
return await txasupabase.saveLocalMovie(slug, movieData);
}
export async function resetLocalMovie(slug) {
await checkAndMigrate();
return await txasupabase.resetLocalMovie(slug);
}
// --- DELETED MOVIES ---
export async function getDeletedMovies() {
await checkAndMigrate();
return await txasupabase.getDeletedMovies();
}
export async function deleteLocalMovie(slug) {
await checkAndMigrate();
return await txasupabase.deleteLocalMovie(slug);
}
export async function restoreLocalMovie(slug) {
await checkAndMigrate();
return await txasupabase.restoreLocalMovie(slug);
}
// --- GENRES ---
export async function getGenres() {
await checkAndMigrate();
return await txasupabase.getGenres();
}
export async function saveGenre(slug, name) {
await checkAndMigrate();
return await txasupabase.saveGenre(slug, name);
}
export async function deleteGenre(slug) {
await checkAndMigrate();
return await txasupabase.deleteGenre(slug);
}
export async function bulkDeleteGenres(slugs) {
await checkAndMigrate();
return await txasupabase.bulkDeleteGenres(slugs);
}
// --- COUNTRIES ---
export async function getCountries() {
await checkAndMigrate();
return await txasupabase.getCountries();
}
export async function saveCountry(slug, name) {
await checkAndMigrate();
return await txasupabase.saveCountry(slug, name);
}
export async function deleteCountry(slug) {
await checkAndMigrate();
return await txasupabase.deleteCountry(slug);
}
export async function bulkDeleteCountries(slugs) {
await checkAndMigrate();
return await txasupabase.bulkDeleteCountries(slugs);
}
// --- ACTORS ---
export async function getActors() {
await checkAndMigrate();
return await txasupabase.getActors();
}
export async function saveActor(name, originalName = null) {
await checkAndMigrate();
return await txasupabase.saveActor(name, originalName);
}
export async function deleteActor(name) {
await checkAndMigrate();
return await txasupabase.deleteActor(name);
}
export async function bulkDeleteActors(names) {
await checkAndMigrate();
return await txasupabase.bulkDeleteActors(names);
}
// --- SERVERS ---
export async function getServers() {
await checkAndMigrate();
return await txasupabase.getServers();
}
export async function saveServer(name, originalName = null) {
await checkAndMigrate();
return await txasupabase.saveServer(name, originalName);
}
export async function deleteServer(name) {
await checkAndMigrate();
return await txasupabase.deleteServer(name);
}
export async function bulkDeleteServers(names) {
await checkAndMigrate();
return await txasupabase.bulkDeleteServers(names);
}
// --- AUTOMATIC SYNC FROM MOVIES DATA ---
export async function syncFromMovies(type) {
await checkAndMigrate();
return await txasupabase.syncFromMovies(type);
}