const fastify = require('fastify')({ logger: true }); const path = require('path'); const { spawn } = require('child_process'); const fs = require('fs'); import { initHeadless } from "./src/shared/headless"; const { initDatabase } = require('./src/shared/database'); const { loadExtensions } = require('./src/shared/extensions'); const viewsRoutes = require('./src/views/views.routes'); const animeRoutes = require('./src/api/anime/anime.routes'); const booksRoutes = require('./src/api/books/books.routes'); const proxyRoutes = require('./src/api/proxy/proxy.routes'); const extensionsRoutes = require('./src/api/extensions/extensions.routes'); const galleryRoutes = require('./src/api/gallery/gallery.routes'); fastify.register(require('@fastify/static'), { root: path.join(__dirname, 'public'), prefix: '/public/', decorateReply: false }); fastify.register(require('@fastify/static'), { root: path.join(__dirname, 'views'), prefix: '/views/', decorateReply: false }); fastify.register(require('@fastify/static'), { root: path.join(__dirname, 'src', 'scripts'), prefix: '/src/scripts/', decorateReply: false }); fastify.register(viewsRoutes); fastify.register(animeRoutes, { prefix: '/api' }); fastify.register(booksRoutes, { prefix: '/api' }); fastify.register(proxyRoutes, { prefix: '/api' }); fastify.register(extensionsRoutes, { prefix: '/api' }); fastify.register(galleryRoutes, { prefix: '/api' }); function startCppScraper() { const exePath = path.join( __dirname, 'src', 'metadata', process.platform === 'win32' ? 'anilist.exe' : 'anilist' ); const dllPath = path.join(__dirname, 'src', 'metadata', 'binaries'); if (!fs.existsSync(exePath)) { console.error(`❌ C++ Error: Could not find executable at: ${exePath}`); console.error(" Did you compile it? (g++ src/metadata/anilist.cpp -o src/metadata/anilist.exe ...)"); return; } const env = { ...process.env }; env.PATH = `${dllPath};${env.PATH}`; console.log("⚡ Starting WaifuBoard Scraper Engine (C++)..."); const scraper = spawn(exePath, [], { stdio: 'inherit', cwd: __dirname, env: env }); scraper.on('error', (err) => { console.error('❌ Failed to spawn C++ process:', err); }); scraper.on('close', (code) => { console.log(`✅ Scraper process finished with code ${code}`); }); } const start = async () => { try { initDatabase("anilist"); initDatabase("favorites"); initDatabase("cache"); await loadExtensions(); await fastify.listen({ port: 3000, host: '0.0.0.0' }); console.log(`Server running at http://localhost:3000`); startCppScraper(); await initHeadless(); } catch (err) { fastify.log.error(err); process.exit(1); } }; start();