ComicOPDS/main.py

147 lines
5.8 KiB
Python
Raw Normal View History

2023-01-15 10:37:05 +01:00
from flask import Flask, render_template, send_from_directory, request
2022-06-07 09:16:43 +02:00
from flask_httpauth import HTTPBasicAuth
from werkzeug.security import check_password_hash
from gevent.pywsgi import WSGIServer
import timeit
import sqlite3
import os
import zipfile
2022-06-07 21:07:28 +02:00
import gzip
2022-06-07 09:16:43 +02:00
from bs4 import BeautifulSoup
import re
import datetime
import sys
2022-06-07 21:07:28 +02:00
import time
2022-06-07 09:16:43 +02:00
from opds import fromdir
import config
app = Flask(__name__, static_url_path="", static_folder="static")
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
if not config.TEENYOPDS_ADMIN_PASSWORD:
return True
elif username in config.users and check_password_hash(
config.users.get(username), password
):
return username
@app.route("/")
2023-01-15 10:37:05 +01:00
def startpage():
2023-01-19 15:41:27 +01:00
#result = "Hello, World!"
2023-01-15 10:37:05 +01:00
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
cursor.execute("select * from comics;")
result = cursor.fetchall()
conn.close()
return render_template("start.html", result=result)
2022-06-07 09:16:43 +02:00
@app.route("/healthz")
def healthz():
return "ok"
@app.route('/import')
def import2sql():
2022-06-07 21:44:57 +02:00
conn = sqlite3.connect('app.db')
2022-06-07 09:16:43 +02:00
list = []
2023-01-17 14:59:50 +01:00
comiccount = 0
importcount = 0
skippedcount = 0
errorcount = 0
2023-01-19 15:41:27 +01:00
comics_with_errors = []
2022-06-07 20:10:59 +02:00
start_time = timeit.default_timer()
2022-06-07 09:16:43 +02:00
for root, dirs, files in os.walk(os.path.abspath(config.CONTENT_BASE_DIR)):
for file in files:
f = os.path.join(root, file)
2022-06-07 21:07:28 +02:00
#try:
2022-06-07 21:59:03 +02:00
if f.endswith('.cbz'):
2022-06-07 21:44:57 +02:00
try:
2023-01-17 14:59:50 +01:00
comiccount = comiccount + 1
2022-06-07 21:59:03 +02:00
s = zipfile.ZipFile(f)
2023-01-17 14:59:50 +01:00
filemodtime = os.path.getmtime(f)
2022-06-07 21:59:03 +02:00
#s = gzip.GzipFile(f)
Bs_data = BeautifulSoup(s.open('ComicInfo.xml').read(), "xml")
#print(Bs_data.select('Series')[0].text, file=sys.stderr)
#print(Bs_data.select('Title')[0].text, file=sys.stderr)
CVDB=re.findall('(?<=\[CVDB)(.*)(?=].)', Bs_data.select('Notes')[0].text)
#list.append('CVDB'+CVDB[0] + ': ' + Bs_data.select('Series')[0].text + "(" + Bs_data.select('Volume')[0].text + ") : " + Bs_data.select('Number')[0].text )
#print(list, file=sys.stdout)
ISSUE=Bs_data.select('Number')[0].text
SERIES=Bs_data.select('Series')[0].text
VOLUME=Bs_data.select('Volume')[0].text
PUBLISHER=Bs_data.select('Publisher')[0].text
try:
TITLE=Bs_data.select('Title')[0].text
except:
TITLE="" #sometimes title is blank.
PATH=f
2023-01-17 14:59:50 +01:00
UPDATED=filemodtime
2022-06-07 21:59:03 +02:00
#print(UPDATED,file=sys.stdout)
#sql="INSERT OR REPLACE INTO COMICS (CVDB,ISSUE,SERIES,VOLUME, PUBLISHER, TITLE, FILE,PATH,UPDATED) VALUES ("+CVDB[0]+",'"+ISSUE+"','"+SERIES+"','"+VOLUME+"','"+PUBLISHER+"','"+TITLE+"','"+file+"','" + f + "','" + UPDATED + "')"
#print(sql,file=sys.stdout)
#conn.execute(sql);
2023-01-19 15:41:27 +01:00
# CREATE TABLE IF MISSING
# create table COMICS (CVDB, ISSUE, SERIES,VOLUME,PUBLISHER,TITLE,FILE,PATH,UPDATED,PRIMARY KEY(CVDB))
try:
query = "SELECT UPDATED FROM COMICS WHERE CVDB = '" + str(CVDB[0]) + "';"
savedmodtime = conn.execute(query).fetchone()[0]
except:
savedmodtime = 0
2023-01-17 14:59:50 +01:00
#print(savedmodtime)
#print(float(savedmodtime))
#print(type(savedmodtime))
#print(type(filemodtime))
if savedmodtime < filemodtime:
#print(str(savedmodtime) + " is less than " + str(filemodtime))
2023-01-19 15:41:27 +01:00
#print(str(CVDB[0]) + " - s: " + str(savedmodtime))
#print(str(CVDB[0]) + " - f: " + str(filemodtime))
2023-01-17 14:59:50 +01:00
conn.execute("INSERT OR REPLACE INTO COMICS (CVDB,ISSUE,SERIES,VOLUME, PUBLISHER, TITLE, FILE,PATH,UPDATED) VALUES (?,?,?,?,?,?,?,?,?)", (CVDB[0], ISSUE, SERIES, VOLUME, PUBLISHER, TITLE, file, f, UPDATED))
conn.commit()
2023-01-19 15:41:27 +01:00
#print("Adding: " + str(CVDB[0]))
2023-01-17 14:59:50 +01:00
importcount = importcount + 1
else:
# print("Skipping: " + str(CVDB[0]))
skippedcount = skippedcount + 1
2022-06-07 21:44:57 +02:00
except:
2023-01-17 14:59:50 +01:00
errorcount = errorcount + 1
2023-01-19 15:41:27 +01:00
comics_with_errors.append(f)
#print(f,file=sys.stdout)
2022-06-07 09:16:43 +02:00
conn.close()
2022-06-07 20:10:59 +02:00
elapsed = timeit.default_timer() - start_time
2023-01-17 14:59:50 +01:00
elapsed_time = "IMPORTED IN: " + str(round(elapsed,2)) + "s"
2023-01-19 15:41:27 +01:00
import_stats = elapsed_time + "<br>Comics: " + str(comiccount) + "<br>Imported: " + str(importcount) + "<br>Skipped: " + str(skippedcount) + "<br>Errors: " + str(errorcount)
return import_stats #+ "<br>" + ['<li>' + x + '</li>' for x in comics_with_errors]
2022-06-07 09:16:43 +02:00
@app.route("/content/<path:path>")
@auth.login_required
def send_content(path):
2023-01-17 14:59:50 +01:00
print('content')
2022-06-07 09:16:43 +02:00
return send_from_directory(config.CONTENT_BASE_DIR, path)
@app.route("/catalog")
2023-01-19 15:41:27 +01:00
@app.route("/catalog/")
2022-06-07 09:16:43 +02:00
@app.route("/catalog/<path:path>")
@auth.login_required
def catalog(path=""):
2023-01-15 10:37:05 +01:00
#print("PRESSED ON")
2022-06-07 09:16:43 +02:00
start_time = timeit.default_timer()
2023-01-15 10:37:05 +01:00
#print(request.root_url)
2022-06-07 09:16:43 +02:00
c = fromdir(request.root_url, request.url, config.CONTENT_BASE_DIR, path)
elapsed = timeit.default_timer() - start_time
2023-01-17 14:59:50 +01:00
print("RENDERED IN: " + str(round(elapsed,2))+"s")
2022-06-07 09:16:43 +02:00
return c.render()
if __name__ == "__main__":
#http_server = WSGIServer(("", 5000), app)
#http_server.serve_forever()
app.run(debug=True,host='0.0.0.0')