import sqlite3, os from flask import Flask, render_template, request, redirect, url_for app = Flask(__name__) DB_NAME = './db/my_library.db' UPLOAD_FOLDER = 'static/covers' os.makedirs(UPLOAD_FOLDER, exist_ok=True) def init_db(): conn = sqlite3.connect(DB_NAME) cursor = conn.cursor() cursor.executescript(''' CREATE TABLE IF NOT EXISTS media ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, type TEXT, release_year INTEGER, image_path TEXT DEFAULT 'default.jpg' ); CREATE TABLE IF NOT EXISTS books (book_id INTEGER PRIMARY KEY, author TEXT, FOREIGN KEY (book_id) REFERENCES media (id)); CREATE TABLE IF NOT EXISTS shows (show_id INTEGER PRIMARY KEY, network TEXT, FOREIGN KEY (show_id) REFERENCES media (id)); CREATE TABLE IF NOT EXISTS genres (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE); CREATE TABLE IF NOT EXISTS media_genres (media_id INTEGER, genre_id INTEGER); ''') genres = [('Sci-Fi',), ('Fantasy',), ('Horror',), ('Drama',), ('Comedy',)] cursor.executemany("INSERT OR IGNORE INTO genres (name) VALUES (?)", genres) conn.commit() conn.close() @app.route('/') def index(): conn = sqlite3.connect(DB_NAME) conn.row_factory = sqlite3.Row query = """ SELECT m.*, b.author, s.network, GROUP_CONCAT(g.name, ', ') as genre_list FROM media m LEFT JOIN books b ON m.id = b.book_id LEFT JOIN shows s ON m.id = s.show_id LEFT JOIN media_genres mg ON m.id = mg.media_id LEFT JOIN genres g ON mg.genre_id = g.id GROUP BY m.id """ items = conn.execute(query).fetchall() all_genres = conn.execute("SELECT * FROM genres").fetchall() conn.close() return render_template('main.html', items=items, genres=all_genres) @app.route('/add', methods=['POST']) def add_media(): title, m_type, year = request.form['title'], request.form['type'], request.form['year'] extra, genre_id = request.form['extra_info'], request.form['genre_id'] file = request.files.get('cover_image') filename = file.filename if file and file.filename != '' else 'default.jpg' if file and file.filename != '': file.save(os.path.join(UPLOAD_FOLDER, filename)) conn = sqlite3.connect(DB_NAME) cursor = conn.cursor() cursor.execute("INSERT INTO media (title, type, release_year, image_path) VALUES (?, ?, ?, ?)", (title, m_type, year, filename)) m_id = cursor.lastrowid cursor.execute("INSERT INTO media_genres (media_id, genre_id) VALUES (?, ?)", (m_id, genre_id)) if m_type == 'Book': cursor.execute("INSERT INTO books (book_id, author) VALUES (?, ?)", (m_id, extra)) else: cursor.execute("INSERT INTO shows (show_id, network) VALUES (?, ?)", (m_id, extra)) conn.commit() conn.close() return redirect(url_for('index')) @app.route('/delete/',methods=['POST']) def delete_media(media_id): conn = sqlite3.connect(DB_NAME) cursor = conn.cursor() cursor.execute("SELECT image_path FROM media WHERE id = ?",(media_id,)) row = cursor.fetchone() if row and row[0] != 'default.jpg': image_path = os.path.join(UPLOAD_FOLDER, row[0]) if os.path.exists(image_path): os.remove(image_path) cursor.execute("DELETE from media WHERE id = ?",(media_id,)) cursor.execute("DELETE from books WHERE book_id = ?",(media_id,)) cursor.execute("DELETE from shows WHERE show_id = ?",(media_id,)) cursor.execute("DELETE from media_genres WHERE media_id = ?",(media_id,)) conn.commit() cursor.close() conn.close() return redirect(url_for('index')) if __name__ == '__main__': init_db() app.run(debug=True)