finished gallery section
This commit is contained in:
@@ -1,48 +1,166 @@
|
||||
const sqlite3 = require('sqlite3').verbose();
|
||||
const path = require('path');
|
||||
const os = require("os");
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
|
||||
const DB_PATH = path.join(__dirname, '..', 'metadata', 'anilist_anime.db');
|
||||
let db = null;
|
||||
const databases = new Map();
|
||||
|
||||
function initDatabase() {
|
||||
db = new sqlite3.Database(DB_PATH, sqlite3.OPEN_READONLY, (err) => {
|
||||
const DEFAULT_PATHS = {
|
||||
anilist: path.join(__dirname, '..', 'metadata', 'anilist_anime.db'),
|
||||
favorites: path.join(os.homedir(), "WaifuBoards", "favorites.db")
|
||||
};
|
||||
|
||||
function ensureFavoritesDB(dbPath) {
|
||||
const dir = path.dirname(dbPath);
|
||||
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
|
||||
const exists = fs.existsSync(dbPath);
|
||||
|
||||
const db = new sqlite3.Database(
|
||||
dbPath,
|
||||
sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE
|
||||
);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
|
||||
if (!exists) {
|
||||
const schema = `
|
||||
CREATE TABLE IF NOT EXISTS favorites (
|
||||
id TEXT PRIMARY KEY,
|
||||
title TEXT NOT NULL,
|
||||
image_url TEXT NOT NULL,
|
||||
thumbnail_url TEXT NOT NULL DEFAULT "",
|
||||
tags TEXT NOT NULL DEFAULT "",
|
||||
headers TEXT NOT NULL DEFAULT "",
|
||||
provider TEXT NOT NULL DEFAULT ""
|
||||
);
|
||||
`;
|
||||
|
||||
db.exec(schema, (err) => {
|
||||
if (err) reject(err);
|
||||
else resolve(true);
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
db.all(`PRAGMA table_info(favorites)`, (err, cols) => {
|
||||
if (err) return reject(err);
|
||||
|
||||
const hasHeaders = cols.some(c => c.name === "headers");
|
||||
const hasProvider = cols.some(c => c.name === "provider");
|
||||
|
||||
const queries = [];
|
||||
|
||||
if (!hasHeaders) {
|
||||
queries.push(
|
||||
`ALTER TABLE favorites ADD COLUMN headers TEXT NOT NULL DEFAULT ""`
|
||||
);
|
||||
}
|
||||
|
||||
if (!hasProvider) {
|
||||
queries.push(
|
||||
`ALTER TABLE favorites ADD COLUMN provider TEXT NOT NULL DEFAULT ""`
|
||||
);
|
||||
}
|
||||
|
||||
if (queries.length === 0) {
|
||||
return resolve(false);
|
||||
}
|
||||
|
||||
db.exec(queries.join(";"), (err) => {
|
||||
if (err) reject(err);
|
||||
else resolve(true);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function initDatabase(name = 'anilist', dbPath = null, readOnly = false) {
|
||||
if (databases.has(name)) {
|
||||
return databases.get(name);
|
||||
}
|
||||
|
||||
const finalPath = dbPath || DEFAULT_PATHS[name] || DEFAULT_PATHS.anilist;
|
||||
|
||||
if (name === "favorites") {
|
||||
ensureFavoritesDB(finalPath)
|
||||
.catch(err => console.error("Error creando favorites:", err));
|
||||
}
|
||||
|
||||
const mode = readOnly ? sqlite3.OPEN_READONLY : (sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE);
|
||||
|
||||
const db = new sqlite3.Database(finalPath, mode, (err) => {
|
||||
if (err) {
|
||||
console.error("Database Error:", err.message);
|
||||
console.error(`Database Error (${name}):`, err.message);
|
||||
} else {
|
||||
console.log("Connected to local AniList database.");
|
||||
console.log(`Connected to ${name} database at ${finalPath}`);
|
||||
}
|
||||
});
|
||||
|
||||
databases.set(name, db);
|
||||
return db;
|
||||
}
|
||||
|
||||
function getDatabase() {
|
||||
if (!db) {
|
||||
throw new Error("Database not initialized. Call initDatabase() first.");
|
||||
function getDatabase(name = 'anilist') {
|
||||
if (!databases.has(name)) {
|
||||
return initDatabase(name, null, name === 'anilist');
|
||||
}
|
||||
return db;
|
||||
return databases.get(name);
|
||||
}
|
||||
|
||||
function queryOne(sql, params = []) {
|
||||
function queryOne(sql, params = [], dbName = 'anilist') {
|
||||
return new Promise((resolve, reject) => {
|
||||
getDatabase().get(sql, params, (err, row) => {
|
||||
getDatabase(dbName).get(sql, params, (err, row) => {
|
||||
if (err) reject(err);
|
||||
else resolve(row);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function queryAll(sql, params = []) {
|
||||
function queryAll(sql, params = [], dbName = 'anilist') {
|
||||
return new Promise((resolve, reject) => {
|
||||
getDatabase().all(sql, params, (err, rows) => {
|
||||
getDatabase(dbName).all(sql, params, (err, rows) => {
|
||||
if (err) reject(err);
|
||||
else resolve(rows || []);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function run(sql, params = [], dbName = 'anilist') {
|
||||
return new Promise((resolve, reject) => {
|
||||
getDatabase(dbName).run(sql, params, function(err) {
|
||||
if (err) reject(err);
|
||||
else resolve({ changes: this.changes, lastID: this.lastID });
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function closeDatabase(name = null) {
|
||||
if (name) {
|
||||
const db = databases.get(name);
|
||||
if (db) {
|
||||
db.close();
|
||||
databases.delete(name);
|
||||
console.log(`Closed ${name} database`);
|
||||
}
|
||||
} else {
|
||||
for (const [dbName, db] of databases) {
|
||||
db.close();
|
||||
console.log(`Closed ${dbName} database`);
|
||||
}
|
||||
databases.clear();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
initDatabase,
|
||||
getDatabase,
|
||||
queryOne,
|
||||
queryAll
|
||||
queryAll,
|
||||
run,
|
||||
closeDatabase
|
||||
};
|
||||
Reference in New Issue
Block a user