Change db to store org url for later download

This commit is contained in:
2025-10-01 13:40:15 +02:00
parent bbb7343654
commit f6b02fc417
5 changed files with 128 additions and 100 deletions

2
.gitignore vendored
View File

@@ -5,6 +5,6 @@ public/
.vscode/ .vscode/
package-lock.json package-lock.json
bundle.js bundle.js
mydb.sqlite *.sqlite
output/ output/
resources/ resources/

View File

@@ -23,3 +23,7 @@ app.use('/api', apiRouter);
app.listen(httpPort, () => { app.listen(httpPort, () => {
console.log(`Server running at http://${hostname}:${httpPort}/`); console.log(`Server running at http://${hostname}:${httpPort}/`);
}); });
import mediaController from "./controllers/mediaController";
await mediaController.checkImages();

View File

@@ -1,13 +1,16 @@
import { type Request, type Response } from "express"; import { type Request, type Response } from "express";
import UserModel, { values } from '../models/userModel'; import UserModel, { values } from '../models/userModel';
import MediaModel, { Table, Media } from '../models/mediaModel'; import MediaModel, { Table, Media } from '../models/mediaModel';
import mediaModel from "../models/mediaModel";
interface omdbRes { interface omdbRes {
Title: string, Title: string,
Released: string, Released: string,
Response: string, Response: string,
Poster: string, Poster: string,
Type: string Type: string,
ImdbID: string,
Year: string,
} }
function fromStringToTable(value: string): (Table | undefined) { function fromStringToTable(value: string): (Table | undefined) {
@@ -22,12 +25,13 @@ async function downloadImage(mData: Media, type: Table) {
const outputPath = '/poster/' + type + '/' + mData.code + '.jpg'; const outputPath = '/poster/' + type + '/' + mData.code + '.jpg';
// Use Bun's built-in fetch to download the image // Use Bun's built-in fetch to download the image
const response = await fetch(mData.webImg); const response = await fetch(mData.poster);
// Check if the request was successful // Check if the request was successful
if (!response.ok) { if (!response.ok) {
console.log("fetch image error"); console.log("fetch image error");
return console.log(mData.title);
return;
} }
// Convert the response to a blob // Convert the response to a blob
@@ -47,10 +51,6 @@ async function createMed(req: Request, res: Response) {
return res.status(500).json({ message: 'Error when creating media' }); return res.status(500).json({ message: 'Error when creating media' });
} }
// remove the tt in front in DB its stored as number
const sub = mediaCode.substring(2);
const cleanCode = parseInt(sub);
try { try {
const uri = `http://www.omdbapi.com/?i=${mediaCode}&apikey=${omdb_key}`; const uri = `http://www.omdbapi.com/?i=${mediaCode}&apikey=${omdb_key}`;
@@ -63,35 +63,31 @@ async function createMed(req: Request, res: Response) {
const media: Media = { const media: Media = {
id: 0, id: 0,
code: cleanCode, code: mData.ImdbID,
title: mData.Title, title: mData.Title,
released: mData.Released, released: mData.Released,
webImg: mData.Poster, webImg: "",
poster: mData.Poster,
year: mData.Year
}; };
const seriesFound = MediaModel.findOne(Table.series, cleanCode); var tableType = Table.series;
if (seriesFound.length != 0) {
res.status(409).json({ message: 'Media already exists' });
await downloadImage(media, Table.series);
return;
}
const moviesFound = MediaModel.findOne(Table.movies, cleanCode);
if (moviesFound.length != 0) {
res.status(409).json({ message: 'Media already exists' });
await downloadImage(media, Table.movies);
return;
}
if (mData.Type.localeCompare("movie") == 0) { if (mData.Type.localeCompare("movie") == 0) {
const savedMedia = MediaModel.save(Table.movies, cleanCode, mData.Title, mData.Released, mData.Poster); tableType = Table.movies;
await downloadImage(media, Table.movies);
} }
else if (mData.Type.localeCompare("series") == 0) {
const savedMedia = MediaModel.save(Table.series, cleanCode, mData.Title, mData.Released, mData.Poster); const found = MediaModel.findOne(tableType, mediaCode);
await downloadImage(media, Table.series); if (found.length != 0) {
res.status(409).json({ message: 'Media already exists' });
await downloadImage(media, tableType);
return;
} }
const savedMedia = MediaModel.save(tableType, "", mData.Title, mData.Released, mData.Poster, mData.ImdbID, mData.Year);
await downloadImage(media, tableType);
res.status(201).json(media); res.status(201).json(media);
} catch (err) { } catch (err) {
return res.status(500).json({ message: 'Error when creating media' }); return res.status(500).json({ message: 'Error when creating media' });
@@ -153,16 +149,18 @@ async function createGame(req: Request, res: Response) {
} }
) )
const coverData = await response.json() const coverData = await response.json()
const game: Media = { const game: Media = {
id: 0, id: 0,
code: gameCode, code: gameCode,
title: gameData[0].name, title: gameData[0].name,
released: dateStr, released: dateStr,
webImg: `https://images.igdb.com/igdb/image/upload/t_cover_big/${coverData[0].image_id}.jpg`, webImg: "",
poster: `https://images.igdb.com/igdb/image/upload/t_cover_big/${coverData[0].image_id}.jpg`,
year: date.getFullYear().toString(),
}; };
const savedGame = MediaModel.save(Table.games, game.code, game.title, game.released, game.webImg); const savedGame = MediaModel.save(Table.games, game.code, game.title, game.released, game.webImg, game.poster, game.year);
await downloadImage(game, Table.games);
return res.status(201).json(game); return res.status(201).json(game);
} catch (error) { } catch (error) {
@@ -171,12 +169,7 @@ async function createGame(req: Request, res: Response) {
} }
} }
export default { function list(req: Request, res: Response) {
/**
* mediaController.list()
*/
list: function (req: Request, res: Response) {
const mediaTable = fromStringToTable(req.params.mediaType); const mediaTable = fromStringToTable(req.params.mediaType);
if (!mediaTable) { if (!mediaTable) {
return res.status(500).json({ return res.status(500).json({
@@ -186,21 +179,17 @@ export default {
const media = MediaModel.find(mediaTable); const media = MediaModel.find(mediaTable);
return res.json(media); return res.json(media);
}, }
create: async function (req: Request, res: Response) { async function create(req: Request, res: Response) {
const mediaCode: string = req.body.code; const mediaCode: string = req.body.code;
if (mediaCode.startsWith("t")) { if (mediaCode.startsWith("t")) {
return await createMed(req, res); return await createMed(req, res);
} else { } else {
return await createGame(req, res); return await createGame(req, res);
} }
}, }
function remove(req: Request, res: Response) {
/**
* mediaController.delete()
*/
remove: function (req: Request, res: Response) {
const mediaTable = fromStringToTable(req.params.mediaType); const mediaTable = fromStringToTable(req.params.mediaType);
if (!mediaTable) { if (!mediaTable) {
return res.status(500).json({ return res.status(500).json({
@@ -222,5 +211,35 @@ export default {
catch (err) { catch (err) {
return res.status(500).json({ message: 'Error when deleting the media.' }); return res.status(500).json({ message: 'Error when deleting the media.' });
} }
}, }
async function checkImages() {
await checkTableImages(Table.games);
await checkTableImages(Table.movies);
await checkTableImages(Table.series);
}
function delay(time:number) {
return new Promise(resolve => setTimeout(resolve, time));
}
async function checkTableImages(table: Table) {
const list = mediaModel.find(table);
for (const element of list) {
const path = "./public/" + element.webImg;
const f = Bun.file(path);
const exists = await f.exists();
if (!exists){
await downloadImage(element, table);
await delay(1000);
}
}
}
export default {
list,
create,
remove,
checkImages
}; };

View File

@@ -2,40 +2,43 @@ import { Database } from "bun:sqlite";
const pool = new Database("mydb.sqlite", { strict: true }); const pool = new Database("mydb.sqlite", { strict: true });
pool.exec(` pool.run(`
CREATE TABLE IF NOT EXISTS series ( CREATE TABLE IF NOT EXISTS series (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
code INT NOT NULL, code INT NOT NULL,
title TEXT NOT NULL, title TEXT NOT NULL,
released TEXT NOT NULL, released TEXT NOT NULL,
webImg TEXT NOT NULL, webImg TEXT NOT NULL,
UNIQUE (code) poster TEXT NOT NULL,
year TEXT NOT NULL
); );
`); `);
pool.exec(` pool.run(`
CREATE TABLE IF NOT EXISTS movies ( CREATE TABLE IF NOT EXISTS movies (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
code INT NOT NULL, code INT NOT NULL,
title TEXT NOT NULL, title TEXT NOT NULL,
released TEXT NOT NULL, released TEXT NOT NULL,
webImg TEXT NOT NULL, webImg TEXT NOT NULL,
UNIQUE (code) poster TEXT NOT NULL,
year TEXT NOT NULL
); );
`); `);
pool.exec(` pool.run(`
CREATE TABLE IF NOT EXISTS games ( CREATE TABLE IF NOT EXISTS games (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
code INT NOT NULL, code INT NOT NULL,
title TEXT NOT NULL, title TEXT NOT NULL,
released TEXT NOT NULL, released TEXT NOT NULL,
webImg TEXT NOT NULL, webImg TEXT NOT NULL,
UNIQUE (code) poster TEXT NOT NULL,
year TEXT NOT NULL
); );
`); `);
pool.exec(` pool.run(`
CREATE TABLE IF NOT EXISTS userData ( CREATE TABLE IF NOT EXISTS userData (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, name TEXT NOT NULL,
@@ -52,7 +55,7 @@ function inset_keys() {
return; return;
} }
pool.exec(` pool.run(`
INSERT INTO userData (name, value) VALUES ("pass", ""); INSERT INTO userData (name, value) VALUES ("pass", "");
INSERT INTO userData (name, value) VALUES ("omdb_key", ""); INSERT INTO userData (name, value) VALUES ("omdb_key", "");
INSERT INTO userData (name, value) VALUES ("twitch_client_id", ""); INSERT INTO userData (name, value) VALUES ("twitch_client_id", "");

View File

@@ -3,10 +3,12 @@ import pool from 'backend/miscellaneous/db'
export class Media { export class Media {
id!: number; id!: number;
code!: number; code!: string
title!: string; title!: string;
released!: string; released!: string;
webImg!: string; webImg!: string;
poster!: string;
year!: string;
} }
export enum Table { export enum Table {
@@ -15,11 +17,11 @@ export enum Table {
games = "games", games = "games",
} }
function save(table: Table, code: number, title: string, released: string, webImg: string): number { function save(table: Table, code: string, title: string, released:string, webImg:string, poster: string, year: string): number {
try { try {
const sql = "INSERT INTO " + table + " (code, title, released, webImg) VALUES (?,?,?,?)"; const sql = "INSERT INTO " + table + " (code, title, released, webImg, poster, year) VALUES (?,?,?,?,?,?)";
const result = pool.query(sql).run(code, title, released, webImg); const result = pool.query(sql).run(code, title, released, webImg, poster, year);
return result.changes; return result.changes;
} }
catch (err) { catch (err) {
@@ -28,7 +30,7 @@ function save(table: Table, code: number, title: string, released: string, webIm
return 0; return 0;
} }
function updateWebImg(table: Table, code: number, webImg: string): number { function updateWebImg(table: Table, code: string, webImg: string): number {
try { try {
const sql = "UPDATE " + table + " SET webImg = ? WHERE code = ?;"; const sql = "UPDATE " + table + " SET webImg = ? WHERE code = ?;";
const result = pool.query(sql).run(webImg, code); const result = pool.query(sql).run(webImg, code);
@@ -40,7 +42,7 @@ function updateWebImg(table: Table, code: number, webImg: string): number {
return 0; return 0;
} }
function findOneAndDelete(table: Table, code: number): number { function findOneAndDelete(table: Table, code: string): number {
try { try {
const result = pool.query("DELETE FROM " + table + " WHERE code = ?;").run(code); const result = pool.query("DELETE FROM " + table + " WHERE code = ?;").run(code);
return result.changes; return result.changes;
@@ -51,7 +53,7 @@ function findOneAndDelete(table: Table, code: number): number {
return 0; return 0;
} }
function findOne(table: Table, code: number): Media[] { function findOne(table: Table, code: string): Media[] {
try { try {
const rows = pool.query("SELECT * FROM " + table + " WHERE code = ?;").as(Media).all(code); const rows = pool.query("SELECT * FROM " + table + " WHERE code = ?;").as(Media).all(code);
return rows; return rows;