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}`;
@@ -62,36 +62,32 @@ 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,56 +169,77 @@ async function createGame(req: Request, res: Response) {
} }
} }
function list(req: Request, res: Response) {
const mediaTable = fromStringToTable(req.params.mediaType);
if (!mediaTable) {
return res.status(500).json({
message: 'Error when getting media.'
});
}
const media = MediaModel.find(mediaTable);
return res.json(media);
}
async function create(req: Request, res: Response) {
const mediaCode: string = req.body.code;
if (mediaCode.startsWith("t")) {
return await createMed(req, res);
} else {
return await createGame(req, res);
}
}
function remove(req: Request, res: Response) {
const mediaTable = fromStringToTable(req.params.mediaType);
if (!mediaTable) {
return res.status(500).json({
message: 'Error when deleting the media.'
});
}
const code = req.body.code;
try {
const mediaTable = req.baseUrl.includes('movies') ? Table.movies : Table.series;
const media = MediaModel.findOneAndDelete(mediaTable, code);
if (!media) {
return res.status(404).json({ message: 'No such media' });
}
return res.status(204).json();
}
catch (err) {
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 { export default {
list,
/** create,
* mediaController.list() remove,
*/ checkImages
list: function (req: Request, res: Response) {
const mediaTable = fromStringToTable(req.params.mediaType);
if (!mediaTable) {
return res.status(500).json({
message: 'Error when getting media.'
});
}
const media = MediaModel.find(mediaTable);
return res.json(media);
},
create: async function (req: Request, res: Response) {
const mediaCode: string = req.body.code;
if (mediaCode.startsWith("t")) {
return await createMed(req, res);
} else {
return await createGame(req, res);
}
},
/**
* mediaController.delete()
*/
remove: function (req: Request, res: Response) {
const mediaTable = fromStringToTable(req.params.mediaType);
if (!mediaTable) {
return res.status(500).json({
message: 'Error when deleting the media.'
});
}
const code = req.body.code;
try {
const mediaTable = req.baseUrl.includes('movies') ? Table.movies : Table.series;
const media = MediaModel.findOneAndDelete(mediaTable, code);
if (!media) {
return res.status(404).json({ message: 'No such media' });
}
return res.status(204).json();
}
catch (err) {
return res.status(500).json({ message: 'Error when deleting the media.' });
}
},
}; };

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;