Changed the database to use models.

The database is now used through models instead of direct SQL queries.
This commit is contained in:
Matthew Welch 2019-08-22 10:43:14 -07:00
parent 3341325ca7
commit 0041ad4b3b
10 changed files with 429 additions and 306 deletions

9
app.py
View File

@ -6,6 +6,7 @@ from flask_log import Logging
import threading import threading
import logging import logging
import inotify.adapters, inotify.constants import inotify.adapters, inotify.constants
import inspect
import scripts.func as func import scripts.func as func
from scripts import database from scripts import database
@ -95,14 +96,14 @@ def update_comic_db(sender, **kw):
try: try:
database.add_comics(kw["meta"], kw["thumbnails"]) database.add_comics(kw["meta"], kw["thumbnails"])
except Exception as e: except Exception as e:
print(e) print(inspect.stack()[0][3], type(e), e)
def update_movie_db(sender, **kw): def update_movie_db(sender, **kw):
try: try:
database.add_movies(kw["movies"]) database.add_movies(kw["movies"])
except Exception as e: except Exception as e:
print(e) print(inspect.stack()[0][3], type(e), e)
def update_tv_show_db(sender, **kw): def update_tv_show_db(sender, **kw):
@ -111,14 +112,14 @@ def update_tv_show_db(sender, **kw):
if kw["tv_episodes"]: if kw["tv_episodes"]:
database.add_tv_episodes(kw["tv_episodes"]) database.add_tv_episodes(kw["tv_episodes"])
except Exception as e: except Exception as e:
print(e) print(inspect.stack()[0][3], type(e), e)
def update_tv_episodes_db(sender, **kw): def update_tv_episodes_db(sender, **kw):
try: try:
database.add_tv_episodes(kw["tv_episodes"]) database.add_tv_episodes(kw["tv_episodes"])
except Exception as e: except Exception as e:
print(e) print(inspect.stack()[0][3], type(e), e)
func.comic_loaded.connect(update_comic_db) func.comic_loaded.connect(update_comic_db)

View File

@ -5,6 +5,7 @@ from urllib import parse
from io import BytesIO from io import BytesIO
from wand.image import Image from wand.image import Image
import os, pytz, datetime import os, pytz, datetime
import inspect
from scripts import database, func from scripts import database, func
@ -24,7 +25,7 @@ def index():
end = len(publishers) if len(publishers) < max_items*page else max_items*page end = len(publishers) if len(publishers) < max_items*page else max_items*page
return render_template("comics/index.html", title="Comics", publishers=publishers, page=page, max_items=max_items, start=start, end=end, item_count=len(publishers)) return render_template("comics/index.html", title="Comics", publishers=publishers, page=page, max_items=max_items, start=start, end=end, item_count=len(publishers))
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e)) + " " + str(e) return str(type(e)) + " " + str(e)
@ -67,7 +68,7 @@ def search():
publisher_start=publisher_start, series_start=series_start, comics_start=comics_start, publisher_start=publisher_start, series_start=series_start, comics_start=comics_start,
publisher_end=publisher_end, series_end=series_end, comics_end=comics_end) publisher_end=publisher_end, series_end=series_end, comics_end=comics_end)
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e))+" "+str(e) return str(type(e))+" "+str(e)
@ -98,7 +99,7 @@ def comics_publisher(publisher):
return render_template("comics/publisherSeriesView.html", title="Comics", publisher_series=publisher_series, return render_template("comics/publisherSeriesView.html", title="Comics", publisher_series=publisher_series,
start=start, end=end, page=page, max_items=max_items, item_count=len(publisher_series)) start=start, end=end, page=page, max_items=max_items, item_count=len(publisher_series))
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e)) + " " + str(e) return str(type(e)) + " " + str(e)
@ -124,7 +125,7 @@ def comic_viewer(publisher, series, series_year, issue):
title = "Comics: "+meta["series"]+": #"+meta["issueText"]+" "+(meta["title"] or "") title = "Comics: "+meta["series"]+": #"+meta["issueText"]+" "+(meta["title"] or "")
return render_template("comics/comicView.html", title=title, on_mobile=on_mobile, prev_url=prev_url, next_url=next_url, comic=meta, page_number=page_number) return render_template("comics/comicView.html", title=title, on_mobile=on_mobile, prev_url=prev_url, next_url=next_url, comic=meta, page_number=page_number)
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e)) + " " + str(e) return str(type(e)) + " " + str(e)
@ -137,7 +138,7 @@ def comic_gallery(publisher, series, series_year, issue):
end = meta["pageCount"] if meta["pageCount"] < max_items*page else max_items*page end = meta["pageCount"] if meta["pageCount"] < max_items*page else max_items*page
return render_template("comics/comicGallery.html", title="Comics", comic=meta, start=start, end=end, page=page, max_items=max_items, item_count=meta["pageCount"]) return render_template("comics/comicGallery.html", title="Comics", comic=meta, start=start, end=end, page=page, max_items=max_items, item_count=meta["pageCount"])
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e)) + " " + str(e) return str(type(e)) + " " + str(e)

1
scripts/create_user.py Normal file
View File

@ -0,0 +1 @@
import click

View File

@ -5,8 +5,13 @@ from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash from werkzeug.security import generate_password_hash, check_password_hash
from io import BytesIO from io import BytesIO
from wand.image import Image from wand.image import Image
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy import orm
from sqlalchemy import Column, Integer, String, BLOB, Boolean
from sqlalchemy.orm import sessionmaker
import sqlite3 import sqlite3
import os, time import os, time, inspect
from comicapi.issuestring import IssueString from comicapi.issuestring import IssueString
@ -22,6 +27,183 @@ DATABASE = RPI_DATABASE if os.path.exists(RPI_DATABASE) else MC_DATABASE
IMDB_DATABASE = RPI_IMDB_DATABASE if os.path.exists(RPI_IMDB_DATABASE) else MC_IMDB_DATABASE IMDB_DATABASE = RPI_IMDB_DATABASE if os.path.exists(RPI_IMDB_DATABASE) else MC_IMDB_DATABASE
engine = create_engine("sqlite:///"+DATABASE+"?check_same_thread=False")
Session =sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
class Comic(Base):
__tablename__ = "comics"
path = Column(String, unique=True)
tagOrigin = Column(String)
series = Column(String)
issue = Column(Integer)
issueText = Column(String)
title = Column(String)
publisher = Column(String)
month = Column(Integer)
year = Column(Integer)
day = Column(Integer)
seriesYear = Column(Integer)
issueCount = Column(Integer)
volume = Column(String)
genre = Column(String)
language = Column(String)
comments = Column(String)
volumeCount = Column(Integer)
criticalRating = Column(String)
country = Column(String)
alternateSeries = Column(String)
alternateNumber = Column(String)
alternateCount = Column(Integer)
imprint = Column(String)
notes = Column(String)
webLink = Column(String)
format = Column(String)
manga = Column(String)
blackAndWhite = Column(String)
pageCount = Column(Integer)
maturityRating = Column(String)
storyArc = Column(String)
seriesGroup = Column(String)
scanInfo = Column(String)
characters = Column(String)
teams = Column(String)
locations = Column(String)
id = Column(Integer, primary_key=True, autoincrement=True)
def __init__(self, data):
i = 0
try:
for column in self.__table__.columns:
if column.name == "id":
continue
setattr(self, column.name, data[i])
i += 1
except Exception as e:
print(inspect.stack()[0][3], type(e), e)
def __repr__(self):
return "<Comic: {series} {issue}>".format(series=self.series, issue=self.issueText)
class ComicThumbnail(Base):
__tablename__ = "comic_thumbnails"
comic_id = Column(Integer)
pageNumber = Column(Integer)
image = Column(BLOB)
type = Column(String)
id = Column(Integer, primary_key=True, autoincrement=True)
def __init__(self, data):
i = 0
try:
for column in self.__table__.columns:
if column.name == "id":
continue
setattr(self, column.name, data[i])
i += 1
except Exception as e:
print(inspect.stack()[0][3], type(e), e)
class Movie(Base):
__tablename__ = "movies"
path = Column(String)
imdb_id = Column(String, primary_key=True)
tmdb_id = Column(Integer)
title = Column(String)
year = Column(Integer)
length = Column(Integer)
description = Column(String)
extended = Column(Boolean)
directors_cut = Column(Boolean)
poster_path = Column(String)
backdrop_path = Column(String)
def __init__(self, data):
i = 0
try:
for column in self.__table__.columns:
setattr(self, column.name, data[i])
i += 1
except Exception as e:
print(inspect.stack()[0][3], type(e), e)
class TvShow(Base):
__tablename__ = "tv_shows"
imdb_id = Column(String, primary_key=True)
tmdb_id = Column(Integer)
title = Column(String)
year = Column(Integer)
description = Column(String)
poster_path = Column(String)
path = Column(String)
def __init__(self, data):
i = 0
try:
for column in self.__table__.columns:
setattr(self, column.name, data[i])
i += 1
except Exception as e:
print(inspect.stack()[0][3], type(e), e)
class TvEpisode(Base):
__tablename__ = "tv_episodes"
imdb_id = Column(String, primary_key=True)
parent_imdb_id = Column(String)
tmdb_id = Column(Integer)
title = Column(String)
season = Column(Integer)
episode = Column(Integer)
description = Column(String)
still_path = Column(String)
path = Column(String)
def __init__(self, data):
i = 0
try:
for column in self.__table__.columns:
setattr(self, column.name, data[i])
i += 1
except Exception as e:
print(inspect.stack()[0][3], type(e), e)
class User(Base, UserMixin):
__tablename__ = "users"
username = Column(String, unique=True, primary_key=True)
passwordHash = Column(String(128))
isAdmin = Column(Boolean, default=False)
def __init__(self, data):
i = 0
for column in self.__table__.columns:
setattr(self, column.name, data[i])
i += 1
@orm.reconstructor
def get_user_data(self):
pass
def get_id(self):
return self.username
def check_password(self, password):
result = check_password_hash(self.passwordHash, password)
return result
def get_db(): def get_db():
db = getattr(g, '_database', None) db = getattr(g, '_database', None)
if db is None: if db is None:
@ -87,10 +269,11 @@ def initialize_db():
"primary" INTEGER NOT NULL "primary" INTEGER NOT NULL
)""") )""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "comic_thumbnails" ( get_db().execute("""CREATE TABLE IF NOT EXISTS "comic_thumbnails" (
"id" INTEGER, "comic_id" INTEGER,
"pageNumber" INTEGER, "pageNumber" INTEGER,
"image" BLOB, "image" BLOB,
"type" TEXT "type" TEXT,
"id" INTEGER PRIMARY KEY AUTOINCREMENT
)""") )""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "users" ( get_db().execute("""CREATE TABLE IF NOT EXISTS "users" (
"username" TEXT UNIQUE PRIMARY KEY, "username" TEXT UNIQUE PRIMARY KEY,
@ -99,7 +282,7 @@ def initialize_db():
)""") )""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "movies" ( get_db().execute("""CREATE TABLE IF NOT EXISTS "movies" (
"path" TEXT, "path" TEXT,
"imdb_id" INTEGER, "imdb_id" INTEGER PRIMARY KEY,
"tmdb_id" INTEGER, "tmdb_id" INTEGER,
"title" TEXT, "title" TEXT,
"year" INTEGER, "year" INTEGER,
@ -111,7 +294,7 @@ def initialize_db():
"backdrop_path" TEXT "backdrop_path" TEXT
)""") )""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "tv_shows" ( get_db().execute("""CREATE TABLE IF NOT EXISTS "tv_shows" (
"imdb_id" TEXT UNIQUE, "imdb_id" TEXT PRIMARY KEY ,
"tmdb_id" INTEGER UNIQUE, "tmdb_id" INTEGER UNIQUE,
"title" TEXT, "title" TEXT,
"year" INTEGER, "year" INTEGER,
@ -120,7 +303,7 @@ def initialize_db():
"path" TEXT "path" TEXT
)""") )""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "tv_episodes" ( get_db().execute("""CREATE TABLE IF NOT EXISTS "tv_episodes" (
"imdb_id" INTEGER UNIQUE, "imdb_id" INTEGER PRIMARY KEY,
"parent_imdb_id" INTEGER, "parent_imdb_id" INTEGER,
"tmdb_id" INTEGER UNIQUE, "tmdb_id" INTEGER UNIQUE,
"title" TEXT, "title" TEXT,
@ -131,7 +314,7 @@ def initialize_db():
"path" TEXT "path" TEXT
)""") )""")
get_db().execute("CREATE INDEX IF NOT EXISTS path_index ON comics(path);") get_db().execute("CREATE INDEX IF NOT EXISTS path_index ON comics(path);")
get_db().execute("CREATE INDEX IF NOT EXISTS id_index ON comic_thumbnails(id);") get_db().execute("CREATE INDEX IF NOT EXISTS comic_id_index ON comic_thumbnails(comic_id);")
get_db().commit() get_db().commit()
get_imdb().execute("CREATE INDEX IF NOT EXISTS original_title_index ON title_basics(originalTitle)") get_imdb().execute("CREATE INDEX IF NOT EXISTS original_title_index ON title_basics(originalTitle)")
@ -140,36 +323,31 @@ def initialize_db():
get_imdb().commit() get_imdb().commit()
def table_exists(table_name):
cursor = get_db().execute("SELECT name FROM sqlite_master WHERE type='table' AND name='{}'".format(table_name))
get_db().commit()
if cursor.rowcount == 0:
return False
return True
def add_movies(movies): def add_movies(movies):
for movie in movies: for movie_data in movies:
get_db().execute("INSERT INTO movies(path, imdb_id, tmdb_id, title, year, length, description, extended, directors_cut, poster_path, backdrop_path) VALUES(?,?,?,?,?,?,?,?,?,?,?)", movie = Movie(movie_data)
(movie[0], movie[1], movie[2], movie[3], movie[4], movie[5], movie[6], movie[7], movie[8], movie[9], movie[10])) session.add(movie)
get_db().commit() session.commit()
def add_tv_shows(tv_show): def add_tv_shows(tv_show_data):
try: try:
get_db().execute("INSERT INTO tv_shows(imdb_id, tmdb_id, title, year, description, poster_path, path) VALUES(?,?,?,?,?,?,?)", tv_show) tv_show = TvShow(tv_show_data)
get_db().commit() session.add(tv_show)
session.commit()
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
def add_tv_episodes(episodes): def add_tv_episodes(episodes):
for episode in episodes: for episode_data in episodes:
try: try:
get_db().execute("INSERT INTO tv_episodes(imdb_id, parent_imdb_id, tmdb_id, title, season, episode, description, still_path, path) VALUES(?,?,?,?,?,?,?,?,?)", episode) episode = TvEpisode(episode_data)
get_db().commit() if not session.query(TvEpisode).filter(TvEpisode.tmdb_id == episode.tmdb_id).one_or_none():
session.add(episode)
session.commit()
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
def add_comics(meta, thumbnails): def add_comics(meta, thumbnails):
@ -183,137 +361,107 @@ def add_comics(meta, thumbnails):
info[1].notes, info[1].webLink, info[1].format, info[1].manga, info[1].blackAndWhite, info[1].notes, info[1].webLink, info[1].format, info[1].manga, info[1].blackAndWhite,
info[1].pageCount, info[1].maturityRating, info[1].storyArc, info[1].seriesGroup, info[1].scanInfo, info[1].pageCount, info[1].maturityRating, info[1].storyArc, info[1].seriesGroup, info[1].scanInfo,
info[1].characters, info[1].teams, info[1].locations]) info[1].characters, info[1].teams, info[1].locations])
for comic in data: for comic_data in data:
for i in range(len(comic)): for i in range(len(comic_data)):
if comic[i] == "": if comic_data[i] == "":
comic[i] = None comic_data[i] = None
for comic, images in zip(data, thumbnails): for comic_data, images in zip(data, thumbnails):
get_db().execute("""INSERT INTO comics(path, tagOrigin, series, issue, issueText, title, publisher, comic = Comic(comic_data)
month, year, day, seriesYear, issueCount, volume, genre, language, comments, volumeCount, session.add(comic)
criticalRating, country, alternateSeries, alternateNumber, alternateCount, imprint, session.commit()
notes, webLink, format, manga, blackAndWhite, pageCount, maturityRating, storyArc, comic_id = session.query(Comic.id).order_by(Comic.id.desc()).first()[0]
seriesGroup, scanInfo, characters, teams, locations)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""", comic)
get_db().commit()
comic_id = get_db().execute("SELECT id from comics ORDER BY id DESC LIMIT 1").fetchone()[0]
for index in range(len(images)): for index in range(len(images)):
get_db().execute("INSERT INTO comic_thumbnails(id, pageNumber, image, type) VALUES (?,?,?,?)", (comic_id, index, images[index][0], images[index][1])) thumbnail = ComicThumbnail([comic_id, index, images[index][0], images[index][1]])
get_db().commit() session.add(thumbnail)
session.commit()
print("#"*18) print("#"*18)
print("# {} comic{} added #".format(len(meta), "s" if len(meta)>1 else "")) print("# {} comic{} added #".format(len(meta), "s" if len(meta)>1 else ""))
print("#"*18) print("#"*18)
def add_comic_thumbnails(thumbnails):
comic_id = 1
row = get_db().execute("SELECT id from comic_thumbnails ORDER BY id DESC LIMIT 1").fetchone()
if row:
comic_id = row[0]+1
print("start comics added:", len(thumbnails))
for images in thumbnails:
print("pages in comic:", len(images))
for index in range(len(images)):
print("comic page added:", index)
get_db().execute("INSERT INTO comic_thumbnails(id, pageNumber, image) VALUES (?,?,?)", (comic_id, index, images[index]))
comic_id += 1
get_db().commit()
def db_get_all_comics(): def db_get_all_comics():
result = get_db().execute("SELECT * FROM comics ORDER BY series, issue").fetchall() result = session.query(Comic).all()
get_db().commit()
return result return result
def db_get_series_by_publisher(publisher): def db_get_series_by_publisher(publisher):
series = [] result = session.query(Comic).filter(Comic.publisher == publisher).group_by(Comic.publisher, Comic.series, Comic.seriesYear).order_by(Comic.series, Comic.seriesYear).all()
rows = get_db().execute("SELECT publisher, series, seriesYear, id, min(issue) FROM comics WHERE publisher=? GROUP BY publisher, series, seriesYear ORDER BY series, seriesYear", [publisher]).fetchall() series = [comic.__dict__ for comic in result]
for row in rows:
series.append(row)
return series return series
def db_get_comics_in_series(series, publisher, series_year): def db_get_comics_in_series(series, publisher, series_year):
comics = [] result = session.query(Comic).filter(Comic.publisher == publisher, Comic.series == series, Comic.seriesYear == series_year)\
rows = get_db().execute("SELECT * FROM comics WHERE series=? AND publisher=? AND seriesYear=? ORDER BY series, issue", [series, publisher, series_year]).fetchall() .order_by(Comic.issue).all()
get_db().commit() comics = [comic.__dict__ for comic in result]
for row in rows:
comics.append(row)
return comics return comics
def get_publishers(): def get_publishers():
publishers = [] result = session.query(Comic.publisher).distinct(Comic.publisher).order_by(Comic.publisher).all()
rows = get_db().execute("SELECT DISTINCT publisher FROM comics ORDER BY publisher").fetchall() publishers = [r for (r,) in result]
for row in rows:
publishers.append(row[0])
return publishers return publishers
def db_get_comic_by_id(comic_id): def db_get_comic_by_id(comic_id):
row = get_db().execute("SELECT * FROM comics WHERE id=?", [comic_id]).fetchone() comic = session.query(Comic).filter(Comic.id == comic_id).one().__dict__
return row return comic
def db_get_thumbnail_by_id_page(comic_id, pageNumber): def db_get_thumbnail_by_id_page(comic_id, pageNumber):
row = get_db().execute("SELECT * FROM comic_thumbnails WHERE id=? AND pageNumber=?", [comic_id, pageNumber]).fetchone() thumbnail = session.query(ComicThumbnail).filter(ComicThumbnail.comic_id == comic_id, ComicThumbnail.pageNumber == pageNumber).one().__dict__
return row return thumbnail
def db_get_comic(publisher, series, series_year, issue): def db_get_comic(publisher, series, series_year, issue):
row = get_db().execute("SELECT * FROM comics WHERE publisher=? AND series=? AND seriesYear=? AND issue=?", comic = session.query(Comic).filter(Comic.publisher == publisher, Comic.series == series, Comic.seriesYear == series_year, Comic.issue == issue).one().__dict__
[publisher, series, series_year, issue]).fetchone() return comic
return row
def comic_path_in_db(path): def comic_path_in_db(path):
try: try:
result = get_db().execute("SELECT path FROM comics WHERE path=?", [path]) result = session.query(Comic).filter(Comic.path == path).one_or_none()
get_db().commit() if result:
if result.fetchone():
return True return True
except Exception as e: except Exception as e:
print(path) print(path)
print(e) print(inspect.stack()[0][3], type(e), e)
return False return False
def movie_path_in_db(path): def movie_path_in_db(path):
try: try:
result = get_db().execute("SELECT path FROM movies WHERE path=?", [path]) result = session.query(Movie).filter(Movie.path == path).one_or_none()
get_db().commit() if result:
if result.fetchone():
return True return True
except Exception as e: except Exception as e:
print(path) print(path)
print(e) print(inspect.stack()[0][3], type(e), e)
return False return False
def tv_show_path_in_db(path): def tv_show_path_in_db(path):
try: try:
result = get_db().execute("SELECT path FROM tv_shows WHERE path=?", [path]).fetchone() result = session.query(TvShow).filter(TvShow.path == path).one_or_none()
if result: if result:
return True return True
except Exception as e: except Exception as e:
print(path) print(path)
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return False return False
def tv_episode_path_in_db(path): def tv_episode_path_in_db(path):
try: try:
result = get_db().execute("SELECT path FROM tv_episodes WHERE path=?", [path]).fetchone() result = session.query(TvEpisode).filter(TvEpisode.path == path).one_or_none()
if result: if result:
return True return True
except Exception as e: except Exception as e:
print(path) print(path)
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return False return False
def verify_paths(): def verify_paths():
rows = get_db().execute("SELECT path FROM comics").fetchall() rows = get_db().execute("SELECT path FROM comics").fetchall()
get_db().commit() get_db().commit()
@ -369,47 +517,36 @@ def tmdb_get_tv_episode_by_imdb_id(imdb_id):
def db_get_all_movies(): def db_get_all_movies():
rows = get_db().execute("SELECT * FROM movies ORDER BY title, year;").fetchall() movies = session.query(Movie).all()
return rows return movies
def db_get_movie_by_imdb_id(imdb_id, extended=0, directors_cut=0): def db_get_movie_by_imdb_id(imdb_id, extended=False, directors_cut=False):
row = get_db().execute("SELECT * FROM movies WHERE imdb_id=? AND extended=? AND directors_cut=?", [imdb_id, extended, directors_cut]).fetchone() result = session.query(Movie).filter(Movie.imdb_id == imdb_id, Movie.extended == extended,
return row Movie.directors_cut == directors_cut).one()
return result
def get_all_tv_shows(): def get_all_tv_shows():
rows = get_db().execute("SELECT * FROM tv_shows ORDER BY title, year;").fetchall() result = session.query(TvShow).order_by(TvShow.title, TvShow.year).all()
return rows return result
def get_tv_show_episodes_by_imdb_id(imdb_id): def get_tv_show_episodes_by_imdb_id(imdb_id):
rows = get_db().execute("SELECT * FROM tv_episodes WHERE parent_imdb_id=? ORDER BY season, episode", [imdb_id]).fetchall() result = session.query(TvEpisode).filter(TvEpisode.parent_imdb_id == imdb_id).order_by(TvEpisode.season, TvEpisode.episode).all()
return rows return result
def db_get_episode_by_imdb_id(imdb_id): def db_get_episode_by_imdb_id(imdb_id):
row = get_db().execute("SELECT * FROM tv_episodes WHERE imdb_id=?", [imdb_id]).fetchone() result = session.query(TvEpisode).filter(TvEpisode.imdb_id == imdb_id).one()
return row return result
def db_search_table_columns_by_query(query, table, columns, group="", order=""): def db_search_table_columns_by_query(query, table, columns, group=[], order=[]):
results = {} results = {}
final_query = "%"+query.replace(" ", "%")+"%" final_query = "%" + query.replace(" ", "%") + "%"
sqlite_base_statement = "SELECT * FROM "+table+" WHERE {condition} {group} {order}"
if not group == "":
group = "GROUP BY "+group
if not order == "":
order = "ORDER BY "+order
for column in columns: for column in columns:
sqlite_statement = sqlite_base_statement.format(condition=column+" LIKE '"+final_query+"'", group=group, order=order) results[column.name] = session.query(table).filter(column.like(final_query)).group_by(*group).order_by(*order).all()
results[column] = get_db().execute(sqlite_statement).fetchall()
# sqlite_condition = ""
# for column in columns:
# sqlite_condition += column+" LIKE '"+final_query+"'"+(" OR " if column != columns[-1] else "")
# sqlite_statement = "SELECT * FROM {table} WHERE {condition}".format(table=table, condition=sqlite_condition)
# rows = get_db().execute(sqlite_statement).fetchall()
return results return results
@ -418,23 +555,23 @@ def db_search_comics(query):
series = [] series = []
comics = [] comics = []
results = db_search_table_columns_by_query(query, "comics", ["publisher", "title", "series", "year"]) results = db_search_table_columns_by_query(query, Comic, [Comic.publisher, Comic.title, Comic.series, Comic.year])
series_results = db_search_table_columns_by_query(query, "comics", ["publisher", "title", "series", "year"], series_results = db_search_table_columns_by_query(query, Comic, [Comic.publisher, Comic.title, Comic.series, Comic.year],
group="series, seriesYear", order="issue") group=[Comic.series, Comic.seriesYear], order=[Comic.issue])
for row in results["publisher"]: for row in results["publisher"]:
if row["publisher"] not in publishers: if row["publisher"] not in publishers:
publishers.append(row["publisher"]) publishers.append(row.publisher)
for row in series_results["series"]: for row in series_results["series"]:
dict = {"publisher": row["publisher"],"series": row["series"],"seriesYear": row["seriesYear"],"id": row["id"]} dict = row.__dict__
if dict not in series: if dict not in series:
series.append(dict) series.append(dict)
for row in results["title"]: for row in results["title"]:
dict = {"publisher": row["publisher"],"series": row["series"],"seriesYear": row["seriesYear"],"issue": row["issue"],"id": row["id"],"title": row["title"]} dict = row.__dict__
if dict not in comics: if dict not in comics:
comics.append(dict) comics.append(dict)
for row in results["year"]: for row in results["year"]:
dict = {"publisher": row["publisher"],"series": row["series"],"seriesYear": row["seriesYear"],"issue": row["issue"],"id": row["id"],"title": row["title"]} dict = row.__dict__
if dict not in comics: if dict not in comics:
comics.append(dict) comics.append(dict)
@ -442,32 +579,32 @@ def db_search_comics(query):
def db_search_movies(query): def db_search_movies(query):
results = db_search_table_columns_by_query(query, "movies", ["title", "year", "description"], order="title") results = db_search_table_columns_by_query(query, Movie, [Movie.title, Movie.year, Movie.description], order=[Movie.title])
movies = [] movies = []
for movie in results["title"]: for movie in results["title"]:
if movie not in movies: if movie.__dict__ not in movies:
movies.append(movie) movies.append(movie.__dict__)
for movie in results["description"]: for movie in results["description"]:
if movie not in movies: if movie.__dict__ not in movies:
movies.append(movie) movies.append(movie.__dict__)
for movie in results["year"]: for movie in results["year"]:
if movie not in movies: if movie.__dict__ not in movies:
movies.append(movie) movies.append(movie.__dict__)
return movies return movies
def db_search_tv_shows(query): def db_search_tv_shows(query):
results = db_search_table_columns_by_query(query, "tv_shows", ["title", "year", "description"], order="title") results = db_search_table_columns_by_query(query, TvShow, [TvShow.title, TvShow.year, TvShow.description], order=[TvShow.title])
tv_shows = [] tv_shows = []
for show in results["title"]: for show in results["title"]:
if show not in tv_shows: if show.__dict__ not in tv_shows:
tv_shows.append(show) tv_shows.append(show.__dict__)
for show in results["description"]: for show in results["description"]:
if show not in tv_shows: if show.__dict__ not in tv_shows:
tv_shows.append(show) tv_shows.append(show.__dict__)
for show in results["year"]: for show in results["year"]:
if show not in tv_shows: if show.__dict__ not in tv_shows:
tv_shows.append(show) tv_shows.append(show.__dict__)
return tv_shows return tv_shows
@ -496,28 +633,14 @@ def fix_thumbnails():
image = Image(file=BytesIO(row["image"])) image = Image(file=BytesIO(row["image"]))
if image.width > new_width or image.height > new_height: if image.width > new_width or image.height > new_height:
print("id:", row["id"], "pageNumber:", row["pageNumber"]) print("id:", row["id"], "pageNumber:", row["pageNumber"])
get_db().execute("UPDATE comic_thumbnails SET image=? WHERE id=? AND pageNumber=?", get_db().execute("UPDATE comic_thumbnails SET image=? WHERE comic_id=? AND pageNumber=?",
[resize_image(image, new_width, new_height).make_blob(), row["id"], row["pageNumber"]]) [resize_image(image, new_width, new_height).make_blob(), row["id"], row["pageNumber"]])
get_db().commit() get_db().commit()
print("Finished fix thumbnail size") print("Finished fix thumbnail size")
def get_user(username): def get_user(username):
user_data = get_db().execute("SELECT * FROM users WHERE username=?", [username]).fetchone() result = session.query(User).filter(User.username == username).one()
if user_data: if result:
return User(user_data)
return None
class User(UserMixin):
def __init__(self, user):
self.username = user["username"]
self.password_hash = user["passwordHash"]
self.is_admin = user["isAdmin"]
def get_id(self):
return self.username
def check_password(self, password):
result = check_password_hash(self.password_hash, password)
return result return result
return None

View File

@ -142,14 +142,14 @@ def get_movies():
title = match.group(1) title = match.group(1)
print("movie title:", title) print("movie title:", title)
year = int(match.group(2)) year = int(match.group(2))
extended = 0 extended = False
directors_cut = 0 directors_cut = False
if match.group(3): if match.group(3):
extended = 1 extended = True
imdb_data = database.imdb_get_movie(title.replace(match.group(3), ""), year) imdb_data = database.imdb_get_movie(title.replace(match.group(3), ""), year)
elif match.group(4): elif match.group(4):
imdb_data = database.imdb_get_movie(title.replace(match.group(4), ""), year) imdb_data = database.imdb_get_movie(title.replace(match.group(4), ""), year)
directors_cut = 1 directors_cut = True
else: else:
imdb_data = database.imdb_get_movie(title, year) imdb_data = database.imdb_get_movie(title, year)
if not imdb_data: if not imdb_data:
@ -215,30 +215,30 @@ def get_tv_episodes():
rows = database.get_all_tv_shows() rows = database.get_all_tv_shows()
for tv_show in rows: for tv_show in rows:
episodes = [] episodes = []
for video in sorted(os.listdir(tv_show["path"])): for video in sorted(os.listdir(tv_show.path)):
video_match = re.fullmatch(video_pattern, video) video_match = re.fullmatch(video_pattern, video)
if video_match: if video_match:
path = tv_show["path"] + video path = tv_show.path + video
if not database.tv_episode_path_in_db(path): if not database.tv_episode_path_in_db(path):
season = int(video_match.group(1)) season = int(video_match.group(1))
episode = int(video_match.group(2)) episode = int(video_match.group(2))
episode_name = video_match.group(3) episode_name = video_match.group(3)
episode_imdb_data = database.imdb_get_tv_episode(tv_show["imdb_id"], season, episode) episode_imdb_data = database.imdb_get_tv_episode(tv_show.imdb_id, season, episode)
if not episode_imdb_data: if not episode_imdb_data:
print("could not get imdb data for:", tv_show["title"], tv_show["year"], season, episode) print("could not get imdb data for:", tv_show.title, tv_show.year, season, episode)
continue continue
episode_imdb_id = episode_imdb_data["tconst"] episode_imdb_id = episode_imdb_data["tconst"]
episode_tmdb_data = database.tmdb_get_tv_episode_by_imdb_id(episode_imdb_id) episode_tmdb_data = database.tmdb_get_tv_episode_by_imdb_id(episode_imdb_id)
if not episode_tmdb_data: if not episode_tmdb_data:
print("could not get tmdb data for:", tv_show["title"], tv_show["year"], season, episode) print("could not get tmdb data for:", tv_show.title, tv_show.year, season, episode)
with open("/var/lib/rpiWebApp/log.txt", "a") as f: with open("/var/lib/rpiWebApp/log.txt", "a") as f:
f.write("could not get tmdb data for: " + episode_imdb_id + " " + tv_show["title"] + " " + str( f.write("could not get tmdb data for: " + episode_imdb_id + " " + tv_show.title + " " + str(
tv_show["year"]) + " " + str(season) + " " + str(episode) + "\n") tv_show.year) + " " + str(season) + " " + str(episode) + "\n")
continue continue
episode_tmdb_id = episode_tmdb_data[0] episode_tmdb_id = episode_tmdb_data[0]
episode_description = episode_tmdb_data[1] episode_description = episode_tmdb_data[1]
episode_still_path = episode_tmdb_data[2] episode_still_path = episode_tmdb_data[2]
episodes.append((episode_imdb_id, tv_show["imdb_id"], episode_tmdb_id, episode_name, season, episode, episodes.append((episode_imdb_id, tv_show.imdb_id, episode_tmdb_id, episode_name, season, episode,
episode_description, episode_still_path, path)) episode_description, episode_still_path, path))
tv_episodes_loaded.send("anonymous", tv_episodes=episodes) tv_episodes_loaded.send("anonymous", tv_episodes=episodes)
print("finish load tv episodes.") print("finish load tv episodes.")

View File

@ -1,5 +1,6 @@
import requests import requests
import logging import logging
import inspect
logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("requests").setLevel(logging.WARNING)
logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("urllib3").setLevel(logging.WARNING)
@ -10,6 +11,7 @@ TMDB_IMG_URL = "https://image.tmdb.org/t/p/original"
def get_movie_data(imdb_id): def get_movie_data(imdb_id):
try:
data = { data = {
"api_key": API_KEY, "api_key": API_KEY,
"language": "en-US", "language": "en-US",
@ -20,6 +22,9 @@ def get_movie_data(imdb_id):
if "status_code" in info.keys(): if "status_code" in info.keys():
print("error getting tmdb data, status code:", info["status_code"]) print("error getting tmdb data, status code:", info["status_code"])
return None return None
if info["movie_results"] == []:
print("no tmdb results for:", imdb_id)
return None
print("tmdb movie title:", info["movie_results"][0]["title"]) print("tmdb movie title:", info["movie_results"][0]["title"])
movie_id = info["movie_results"][0]["id"] movie_id = info["movie_results"][0]["id"]
overview = info["movie_results"][0]["overview"] overview = info["movie_results"][0]["overview"]
@ -27,9 +32,12 @@ def get_movie_data(imdb_id):
backdrop_path = info["movie_results"][0]["backdrop_path"] backdrop_path = info["movie_results"][0]["backdrop_path"]
return movie_id, overview, poster_path, backdrop_path return movie_id, overview, poster_path, backdrop_path
except Exception as e:
print(inspect.stack()[0][3], type(e), e)
def get_tv_show_data(imdb_id): def get_tv_show_data(imdb_id):
try:
data = { data = {
"api_key": API_KEY, "api_key": API_KEY,
"language": "en-US", "language": "en-US",
@ -43,15 +51,18 @@ def get_tv_show_data(imdb_id):
if info["tv_results"] == []: if info["tv_results"] == []:
print("no tmdb results for:", imdb_id) print("no tmdb results for:", imdb_id)
return None return None
print("tmdb movie title:", info["tv_results"][0]["name"]) print("tmdb tv show title:", info["tv_results"][0]["name"])
tv_show_id = info["tv_results"][0]["id"] tv_show_id = info["tv_results"][0]["id"]
overview = info["tv_results"][0]["overview"] overview = info["tv_results"][0]["overview"]
poster_path = info["tv_results"][0]["poster_path"] poster_path = info["tv_results"][0]["poster_path"]
return tv_show_id, overview, poster_path return tv_show_id, overview, poster_path
except Exception as e:
print(inspect.stack()[0][3], type(e), e)
def get_tv_episode_data(imdb_id): def get_tv_episode_data(imdb_id):
try:
data = { data = {
"api_key": API_KEY, "api_key": API_KEY,
"language": "en-US", "language": "en-US",
@ -65,10 +76,12 @@ def get_tv_episode_data(imdb_id):
if info["tv_episode_results"] == []: if info["tv_episode_results"] == []:
print("no tmdb results for:", imdb_id) print("no tmdb results for:", imdb_id)
return None return None
print("tmdb movie title:", info["tv_episode_results"][0]["name"]) print("tmdb tv episode title:", info["tv_episode_results"][0]["name"])
tv_episode_id = info["tv_episode_results"][0]["id"] tv_episode_id = info["tv_episode_results"][0]["id"]
name = info["tv_episode_results"][0]["name"] name = info["tv_episode_results"][0]["name"]
overview = info["tv_episode_results"][0]["overview"] overview = info["tv_episode_results"][0]["overview"]
still_path = info["tv_episode_results"][0]["still_path"] still_path = info["tv_episode_results"][0]["still_path"]
return tv_episode_id, overview, still_path return tv_episode_id, overview, still_path
except Exception as e:
print(inspect.stack()[0][3], type(e), e)

65
test.py
View File

@ -2,6 +2,7 @@ import threading
import time import time
import os import os
import sqlite3 import sqlite3
import inspect
from comicapi import comicarchive from comicapi import comicarchive
from comicapi.issuestring import IssueString from comicapi.issuestring import IssueString
from urllib import parse from urllib import parse
@ -9,12 +10,21 @@ from io import BytesIO
from PIL import Image from PIL import Image
import datetime, pytz import datetime, pytz
from werkzeug.security import generate_password_hash from werkzeug.security import generate_password_hash
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, BLOB, Boolean
from sqlalchemy.orm import sessionmaker
from scripts import database from scripts import database
db = sqlite3.connect(database.DATABASE) db = sqlite3.connect(database.DATABASE)
db.row_factory = sqlite3.Row db.row_factory = sqlite3.Row
engine = create_engine("sqlite:///"+database.DATABASE+"?check_same_thread=False")
Session =sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
DC_Comics = ["DC", "Young Animal", "WildStorm", "Earth-M", "Vertigo", "Sandman Universe", "DC Black Label", "Wonder Comics", "DC Ink", "DC Zoom", "Mad", "All Star", "Amalgam Comics", "DC Focus", "Elseworlds", "First Wave", "Helix", "Impact Comics", "Johnny DC", "Minx", "Paradox Press", "Piranha Press", "Tangent Comics", "WildStorm Productions", "America's Best Comics", "Cliffhanger", "CMX Manga", "Homage Comics", "WildStorm Signature", "Zuda Comics"] DC_Comics = ["DC", "Young Animal", "WildStorm", "Earth-M", "Vertigo", "Sandman Universe", "DC Black Label", "Wonder Comics", "DC Ink", "DC Zoom", "Mad", "All Star", "Amalgam Comics", "DC Focus", "Elseworlds", "First Wave", "Helix", "Impact Comics", "Johnny DC", "Minx", "Paradox Press", "Piranha Press", "Tangent Comics", "WildStorm Productions", "America's Best Comics", "Cliffhanger", "CMX Manga", "Homage Comics", "WildStorm Signature", "Zuda Comics"]
@ -23,58 +33,3 @@ Marvel = ["Aircel Comics", "alibu Comics", "Atlas Comics", "Atlas", "CrossGen
def get_db(): def get_db():
return db return db
def db_search_table_columns_by_query(query, table, columns, group="", order=""):
results = {}
final_query = "%"+query.replace(" ", "%")+"%"
sqlite_base_statement = "SELECT * FROM "+table+" WHERE {condition} {group} {order}"
if not group == "":
group = "GROUP BY "+group
if not order == "":
order = "ORDER BY "+order
for column in columns:
sqlite_statement = sqlite_base_statement.format(condition=column+" LIKE '"+final_query+"'", group=group, order=order)
results[column] = get_db().execute(sqlite_statement).fetchall()
# sqlite_condition = ""
# for column in columns:
# sqlite_condition += column+" LIKE '"+final_query+"'"+(" OR " if column != columns[-1] else "")
# sqlite_statement = "SELECT * FROM {table} WHERE {condition}".format(table=table, condition=sqlite_condition)
# rows = get_db().execute(sqlite_statement).fetchall()
return results
def db_search_comics(query):
publishers = []
series = []
comics = []
results = db_search_table_columns_by_query(query, "comics", ["publisher", "title", "series", "year"])
series_results = db_search_table_columns_by_query(query, "comics", ["publisher", "title", "series", "year"],
group="series, seriesYear", order="issue")
for row in results["publisher"]:
if row["publisher"] not in publishers:
publishers.append(row["publisher"])
for row in series_results["series"]:
dict = {"publisher": row["publisher"],"series": row["series"],"seriesYear": row["seriesYear"],"id": row["id"]}
if dict not in series:
series.append(dict)
for row in results["title"]:
dict = {"publisher": row["publisher"],"series": row["series"],"seriesYear": row["seriesYear"],"issue": row["issue"],"id": row["id"],"title": row["title"]}
if dict not in comics:
comics.append(dict)
for row in results["year"]:
dict = {"publisher": row["publisher"],"series": row["series"],"seriesYear": row["seriesYear"],"issue": row["issue"],"id": row["id"],"title": row["title"]}
if dict not in comics:
comics.append(dict)
return {"publishers": publishers, "series": series, "comics": comics}
results = db_search_comics("lord")
for key in results.keys():
print(key, results[key])

View File

@ -2,18 +2,18 @@
{% block content %} {% block content %}
{% for episode in episodes %} {% for episode in episodes %}
{% if episode["season"] == season_num and episode["episode"] == episode_num %} {% if episode.season == season_num and episode.episode == episode_num %}
<div class="container" style="text-align: center"> <div class="container" style="text-align: center">
<video class="video-js vjs-big-play-centered" style="display: inline-block" controls preload="auto" width="1100" <video class="video-js vjs-big-play-centered" style="display: inline-block" controls preload="auto" width="1100"
poster="https://image.tmdb.org/t/p/original{{ episode["still_path"] }}" data-setup="{}"> poster="https://image.tmdb.org/t/p/original{{ episode.still_path }}" data-setup="{}">
<source src="{{ url_for("tv.index") }}/get_episode/{{ episode["imdb_id"] }}" type="video/webm"> <source src="{{ url_for("tv.index") }}/get_episode/{{ episode.imdb_id }}" type="video/webm">
<p class='vjs-no-js'> <p class='vjs-no-js'>
To view this video please enable JavaScript, and consider upgrading to a web browser that To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href='https://videojs.com/html5-video-support/' target='_blank'>supports HTML5 video</a> <a href='https://videojs.com/html5-video-support/' target='_blank'>supports HTML5 video</a>
</p> </p>
</video> </video>
<h1>{{ episode["title"] }}</h1> <h1>{{ episode.title }}</h1>
<p style="text-align: left">{{ episode["description"] }}</p> <p style="text-align: left">{{ episode.description }}</p>
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
@ -23,11 +23,11 @@
<div class="col-auto"> <div class="col-auto">
<select name="season" onchange='this.form.submit()' class="custom-select"> <select name="season" onchange='this.form.submit()' class="custom-select">
{% for episode in episodes %} {% for episode in episodes %}
{% if episode["season"] not in seasons %} {% if episode.season not in seasons %}
<option value="{{ episode["season"] }}" {% if episode["season"] == season_num %}selected{% endif %}> <option value="{{ episode.season }}" {% if episode.season == season_num %}selected{% endif %}>
Season {{ episode["season"] }} Season {{ episode.season }}
</option> </option>
{{ seasons.append(episode["season"]) }} {{ seasons.append(episode.season) }}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</select> </select>
@ -35,9 +35,9 @@
<div class="col-auto"> <div class="col-auto">
<select name="episode" onchange='this.form.submit()' class="custom-select"> <select name="episode" onchange='this.form.submit()' class="custom-select">
{% for episode in episodes %} {% for episode in episodes %}
{% if episode["season"] == season_num %} {% if episode.season == season_num %}
<option value="{{ episode["episode"] }}" {% if episode["episode"] == episode_num %}selected{% endif %}> <option value="{{ episode.episode }}" {% if episode.episode == episode_num %}selected{% endif %}>
Episode {{ episode["episode"] }} Episode {{ episode.episode }}
</option> </option>
{% endif %} {% endif %}
{% endfor %} {% endfor %}

View File

@ -2,6 +2,7 @@ from flask import Blueprint, render_template, request, make_response, send_file,
from flask_login import login_required from flask_login import login_required
from scripts import database, func from scripts import database, func
import inspect
TV = Blueprint("tv", __name__, template_folder="templates") TV = Blueprint("tv", __name__, template_folder="templates")
@ -17,7 +18,7 @@ def index():
end = len(tv_shows) if len(tv_shows) < max_items * page else max_items * page end = len(tv_shows) if len(tv_shows) < max_items * page else max_items * page
return render_template("tv/index.html", title="Tv", tv_shows=tv_shows, page=page, max_items=max_items, start=start, end=end, item_count=len(tv_shows)) return render_template("tv/index.html", title="Tv", tv_shows=tv_shows, page=page, max_items=max_items, start=start, end=end, item_count=len(tv_shows))
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e))+" "+str(e) return str(type(e))+" "+str(e)
@ -38,7 +39,7 @@ def search():
return render_template("tv/search.html", title="Tv", tv_shows=tv_shows, page=page, max_items=max_items, return render_template("tv/search.html", title="Tv", tv_shows=tv_shows, page=page, max_items=max_items,
start=start, end=end, item_count=len(tv_shows)) start=start, end=end, item_count=len(tv_shows))
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e))+" "+str(e) return str(type(e))+" "+str(e)
@ -47,11 +48,11 @@ def search():
def episode_viewer(imdb_id): def episode_viewer(imdb_id):
try: try:
episodes = database.get_tv_show_episodes_by_imdb_id(imdb_id) episodes = database.get_tv_show_episodes_by_imdb_id(imdb_id)
season = request.args.get("season", type=int, default=episodes[0]["season"]) season = request.args.get("season", type=int, default=episodes[0].season)
episode = request.args.get("episode", type=int, default=episodes[0]["episode"]) episode = request.args.get("episode", type=int, default=episodes[0].episode)
return render_template("tv/episodeViewer.html", title="Tv", episodes=episodes, season_num=season, episode_num=episode) return render_template("tv/episodeViewer.html", title="Tv", episodes=episodes, season_num=season, episode_num=episode)
except Exception as e: except Exception as e:
print(type(e), e) print(inspect.stack()[0][3], type(e), e)
return str(type(e)) + " " + str(e) return str(type(e)) + " " + str(e)
@ -59,8 +60,8 @@ def episode_viewer(imdb_id):
@login_required @login_required
def get_episode(imdb_id): def get_episode(imdb_id):
episode_data = database.db_get_episode_by_imdb_id(imdb_id) episode_data = database.db_get_episode_by_imdb_id(imdb_id)
filename = "S{:02d}E{:02d} - {}.mkv".format(episode_data["season"], episode_data["episode"], episode_data["title"]) filename = "S{:02d}E{:02d} - {}.mkv".format(episode_data.season, episode_data.episode, episode_data.title)
dir = episode_data["path"].replace(filename, "") dir = episode_data.path.replace(filename, "")
response = make_response(send_from_directory(dir, filename)) response = make_response(send_from_directory(dir, filename))
response.headers["content-type"] = "video/webm" response.headers["content-type"] = "video/webm"
return response return response

28
update_tables.sql Normal file
View File

@ -0,0 +1,28 @@
.print "start alter table"
ALTER TABLE comic_thumbnails RENAME TO old_comic_thumbnails;
.print "finish alter table"
.print ""
.print "start create new table"
CREATE TABLE IF NOT EXISTS "comic_thumbnails" (
"comic_id" INTEGER,
"pageNumber" INTEGER,
"image" BLOB,
"type" TEXT,
"id" INTEGER PRIMARY KEY AUTOINCREMENT
);
.print "finish create new table"
.print ""
.print "start copy from old table"
INSERT INTO comic_thumbnails(comic_id, pageNumber, image, type)
SELECT id, pageNumber, image, type FROM old_comic_thumbnails;
.print "finish copy from old table"
.print ""
.print "start delete old table"
DROP TABLE old_comic_thumbnails;
.print "finish delete old table"