Files
2026-02-26 12:25:59 -05:00

96 lines
3.7 KiB
Python

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/<int:media_id>',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)