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

View File

@ -5,6 +5,7 @@ from urllib import parse
from io import BytesIO
from wand.image import Image
import os, pytz, datetime
import inspect
from scripts import database, func
@ -24,7 +25,7 @@ def index():
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))
except Exception as e:
print(type(e), e)
print(inspect.stack()[0][3], type(e), 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_end=publisher_end, series_end=series_end, comics_end=comics_end)
except Exception as e:
print(type(e), e)
print(inspect.stack()[0][3], type(e), 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,
start=start, end=end, page=page, max_items=max_items, item_count=len(publisher_series))
except Exception as e:
print(type(e), e)
print(inspect.stack()[0][3], type(e), 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 "")
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:
print(type(e), e)
print(inspect.stack()[0][3], type(e), 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
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:
print(type(e), e)
print(inspect.stack()[0][3], type(e), 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 io import BytesIO
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 os, time
import os, time, inspect
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
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():
db = getattr(g, '_database', None)
if db is None:
@ -87,10 +269,11 @@ def initialize_db():
"primary" INTEGER NOT NULL
)""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "comic_thumbnails" (
"id" INTEGER,
"comic_id" INTEGER,
"pageNumber" INTEGER,
"image" BLOB,
"type" TEXT
"type" TEXT,
"id" INTEGER PRIMARY KEY AUTOINCREMENT
)""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "users" (
"username" TEXT UNIQUE PRIMARY KEY,
@ -99,7 +282,7 @@ def initialize_db():
)""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "movies" (
"path" TEXT,
"imdb_id" INTEGER,
"imdb_id" INTEGER PRIMARY KEY,
"tmdb_id" INTEGER,
"title" TEXT,
"year" INTEGER,
@ -111,7 +294,7 @@ def initialize_db():
"backdrop_path" TEXT
)""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "tv_shows" (
"imdb_id" TEXT UNIQUE,
"imdb_id" TEXT PRIMARY KEY ,
"tmdb_id" INTEGER UNIQUE,
"title" TEXT,
"year" INTEGER,
@ -120,7 +303,7 @@ def initialize_db():
"path" TEXT
)""")
get_db().execute("""CREATE TABLE IF NOT EXISTS "tv_episodes" (
"imdb_id" INTEGER UNIQUE,
"imdb_id" INTEGER PRIMARY KEY,
"parent_imdb_id" INTEGER,
"tmdb_id" INTEGER UNIQUE,
"title" TEXT,
@ -131,7 +314,7 @@ def initialize_db():
"path" TEXT
)""")
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_imdb().execute("CREATE INDEX IF NOT EXISTS original_title_index ON title_basics(originalTitle)")
@ -140,36 +323,31 @@ def initialize_db():
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):
for movie 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[0], movie[1], movie[2], movie[3], movie[4], movie[5], movie[6], movie[7], movie[8], movie[9], movie[10]))
get_db().commit()
for movie_data in movies:
movie = Movie(movie_data)
session.add(movie)
session.commit()
def add_tv_shows(tv_show):
def add_tv_shows(tv_show_data):
try:
get_db().execute("INSERT INTO tv_shows(imdb_id, tmdb_id, title, year, description, poster_path, path) VALUES(?,?,?,?,?,?,?)", tv_show)
get_db().commit()
tv_show = TvShow(tv_show_data)
session.add(tv_show)
session.commit()
except Exception as e:
print(type(e), e)
print(inspect.stack()[0][3], type(e), e)
def add_tv_episodes(episodes):
for episode in episodes:
for episode_data in episodes:
try:
get_db().execute("INSERT INTO tv_episodes(imdb_id, parent_imdb_id, tmdb_id, title, season, episode, description, still_path, path) VALUES(?,?,?,?,?,?,?,?,?)", episode)
get_db().commit()
episode = TvEpisode(episode_data)
if not session.query(TvEpisode).filter(TvEpisode.tmdb_id == episode.tmdb_id).one_or_none():
session.add(episode)
session.commit()
except Exception as e:
print(type(e), e)
print(inspect.stack()[0][3], type(e), e)
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].pageCount, info[1].maturityRating, info[1].storyArc, info[1].seriesGroup, info[1].scanInfo,
info[1].characters, info[1].teams, info[1].locations])
for comic in data:
for i in range(len(comic)):
if comic[i] == "":
comic[i] = None
for comic, images in zip(data, thumbnails):
get_db().execute("""INSERT INTO comics(path, tagOrigin, series, issue, issueText, title, publisher,
month, year, day, seriesYear, issueCount, volume, genre, language, comments, volumeCount,
criticalRating, country, alternateSeries, alternateNumber, alternateCount, imprint,
notes, webLink, format, manga, blackAndWhite, pageCount, maturityRating, storyArc,
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 comic_data in data:
for i in range(len(comic_data)):
if comic_data[i] == "":
comic_data[i] = None
for comic_data, images in zip(data, thumbnails):
comic = Comic(comic_data)
session.add(comic)
session.commit()
comic_id = session.query(Comic.id).order_by(Comic.id.desc()).first()[0]
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]))
get_db().commit()
thumbnail = ComicThumbnail([comic_id, index, images[index][0], images[index][1]])
session.add(thumbnail)
session.commit()
print("#"*18)
print("# {} comic{} added #".format(len(meta), "s" if len(meta)>1 else ""))
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():
result = get_db().execute("SELECT * FROM comics ORDER BY series, issue").fetchall()
get_db().commit()
result = session.query(Comic).all()
return result
def db_get_series_by_publisher(publisher):
series = []
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()
for row in rows:
series.append(row)
result = session.query(Comic).filter(Comic.publisher == publisher).group_by(Comic.publisher, Comic.series, Comic.seriesYear).order_by(Comic.series, Comic.seriesYear).all()
series = [comic.__dict__ for comic in result]
return series
def db_get_comics_in_series(series, publisher, series_year):
comics = []
rows = get_db().execute("SELECT * FROM comics WHERE series=? AND publisher=? AND seriesYear=? ORDER BY series, issue", [series, publisher, series_year]).fetchall()
get_db().commit()
for row in rows:
comics.append(row)
result = session.query(Comic).filter(Comic.publisher == publisher, Comic.series == series, Comic.seriesYear == series_year)\
.order_by(Comic.issue).all()
comics = [comic.__dict__ for comic in result]
return comics
def get_publishers():
publishers = []
rows = get_db().execute("SELECT DISTINCT publisher FROM comics ORDER BY publisher").fetchall()
for row in rows:
publishers.append(row[0])
result = session.query(Comic.publisher).distinct(Comic.publisher).order_by(Comic.publisher).all()
publishers = [r for (r,) in result]
return publishers
def db_get_comic_by_id(comic_id):
row = get_db().execute("SELECT * FROM comics WHERE id=?", [comic_id]).fetchone()
return row
comic = session.query(Comic).filter(Comic.id == comic_id).one().__dict__
return comic
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()
return row
thumbnail = session.query(ComicThumbnail).filter(ComicThumbnail.comic_id == comic_id, ComicThumbnail.pageNumber == pageNumber).one().__dict__
return thumbnail
def db_get_comic(publisher, series, series_year, issue):
row = get_db().execute("SELECT * FROM comics WHERE publisher=? AND series=? AND seriesYear=? AND issue=?",
[publisher, series, series_year, issue]).fetchone()
return row
comic = session.query(Comic).filter(Comic.publisher == publisher, Comic.series == series, Comic.seriesYear == series_year, Comic.issue == issue).one().__dict__
return comic
def comic_path_in_db(path):
try:
result = get_db().execute("SELECT path FROM comics WHERE path=?", [path])
get_db().commit()
if result.fetchone():
result = session.query(Comic).filter(Comic.path == path).one_or_none()
if result:
return True
except Exception as e:
print(path)
print(e)
print(inspect.stack()[0][3], type(e), e)
return False
def movie_path_in_db(path):
try:
result = get_db().execute("SELECT path FROM movies WHERE path=?", [path])
get_db().commit()
if result.fetchone():
result = session.query(Movie).filter(Movie.path == path).one_or_none()
if result:
return True
except Exception as e:
print(path)
print(e)
print(inspect.stack()[0][3], type(e), e)
return False
def tv_show_path_in_db(path):
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:
return True
except Exception as e:
print(path)
print(type(e), e)
print(inspect.stack()[0][3], type(e), e)
return False
def tv_episode_path_in_db(path):
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:
return True
except Exception as e:
print(path)
print(type(e), e)
print(inspect.stack()[0][3], type(e), e)
return False
def verify_paths():
rows = get_db().execute("SELECT path FROM comics").fetchall()
get_db().commit()
@ -369,47 +517,36 @@ def tmdb_get_tv_episode_by_imdb_id(imdb_id):
def db_get_all_movies():
rows = get_db().execute("SELECT * FROM movies ORDER BY title, year;").fetchall()
return rows
movies = session.query(Movie).all()
return movies
def db_get_movie_by_imdb_id(imdb_id, extended=0, directors_cut=0):
row = get_db().execute("SELECT * FROM movies WHERE imdb_id=? AND extended=? AND directors_cut=?", [imdb_id, extended, directors_cut]).fetchone()
return row
def db_get_movie_by_imdb_id(imdb_id, extended=False, directors_cut=False):
result = session.query(Movie).filter(Movie.imdb_id == imdb_id, Movie.extended == extended,
Movie.directors_cut == directors_cut).one()
return result
def get_all_tv_shows():
rows = get_db().execute("SELECT * FROM tv_shows ORDER BY title, year;").fetchall()
return rows
result = session.query(TvShow).order_by(TvShow.title, TvShow.year).all()
return result
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()
return rows
result = session.query(TvEpisode).filter(TvEpisode.parent_imdb_id == imdb_id).order_by(TvEpisode.season, TvEpisode.episode).all()
return result
def db_get_episode_by_imdb_id(imdb_id):
row = get_db().execute("SELECT * FROM tv_episodes WHERE imdb_id=?", [imdb_id]).fetchone()
return row
result = session.query(TvEpisode).filter(TvEpisode.imdb_id == imdb_id).one()
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 = {}
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()
results[column.name] = session.query(table).filter(column.like(final_query)).group_by(*group).order_by(*order).all()
return results
@ -418,23 +555,23 @@ def db_search_comics(query):
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")
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, Comic, [Comic.publisher, Comic.title, Comic.series, Comic.year],
group=[Comic.series, Comic.seriesYear], order=[Comic.issue])
for row in results["publisher"]:
if row["publisher"] not in publishers:
publishers.append(row["publisher"])
publishers.append(row.publisher)
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:
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"]}
dict = row.__dict__
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"]}
dict = row.__dict__
if dict not in comics:
comics.append(dict)
@ -442,32 +579,32 @@ def db_search_comics(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 = []
for movie in results["title"]:
if movie not in movies:
movies.append(movie)
if movie.__dict__ not in movies:
movies.append(movie.__dict__)
for movie in results["description"]:
if movie not in movies:
movies.append(movie)
if movie.__dict__ not in movies:
movies.append(movie.__dict__)
for movie in results["year"]:
if movie not in movies:
movies.append(movie)
if movie.__dict__ not in movies:
movies.append(movie.__dict__)
return movies
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 = []
for show in results["title"]:
if show not in tv_shows:
tv_shows.append(show)
if show.__dict__ not in tv_shows:
tv_shows.append(show.__dict__)
for show in results["description"]:
if show not in tv_shows:
tv_shows.append(show)
if show.__dict__ not in tv_shows:
tv_shows.append(show.__dict__)
for show in results["year"]:
if show not in tv_shows:
tv_shows.append(show)
if show.__dict__ not in tv_shows:
tv_shows.append(show.__dict__)
return tv_shows
@ -496,28 +633,14 @@ def fix_thumbnails():
image = Image(file=BytesIO(row["image"]))
if image.width > new_width or image.height > new_height:
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"]])
get_db().commit()
print("Finished fix thumbnail size")
def get_user(username):
user_data = get_db().execute("SELECT * FROM users WHERE username=?", [username]).fetchone()
if user_data:
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)
result = session.query(User).filter(User.username == username).one()
if result:
return result
return None

View File

@ -142,14 +142,14 @@ def get_movies():
title = match.group(1)
print("movie title:", title)
year = int(match.group(2))
extended = 0
directors_cut = 0
extended = False
directors_cut = False
if match.group(3):
extended = 1
extended = True
imdb_data = database.imdb_get_movie(title.replace(match.group(3), ""), year)
elif match.group(4):
imdb_data = database.imdb_get_movie(title.replace(match.group(4), ""), year)
directors_cut = 1
directors_cut = True
else:
imdb_data = database.imdb_get_movie(title, year)
if not imdb_data:
@ -215,30 +215,30 @@ def get_tv_episodes():
rows = database.get_all_tv_shows()
for tv_show in rows:
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)
if video_match:
path = tv_show["path"] + video
path = tv_show.path + video
if not database.tv_episode_path_in_db(path):
season = int(video_match.group(1))
episode = int(video_match.group(2))
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:
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
episode_imdb_id = episode_imdb_data["tconst"]
episode_tmdb_data = database.tmdb_get_tv_episode_by_imdb_id(episode_imdb_id)
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:
f.write("could not get tmdb data for: " + episode_imdb_id + " " + tv_show["title"] + " " + str(
tv_show["year"]) + " " + str(season) + " " + str(episode) + "\n")
f.write("could not get tmdb data for: " + episode_imdb_id + " " + tv_show.title + " " + str(
tv_show.year) + " " + str(season) + " " + str(episode) + "\n")
continue
episode_tmdb_id = episode_tmdb_data[0]
episode_description = episode_tmdb_data[1]
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))
tv_episodes_loaded.send("anonymous", tv_episodes=episodes)
print("finish load tv episodes.")

View File

@ -1,5 +1,6 @@
import requests
import logging
import inspect
logging.getLogger("requests").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):
try:
data = {
"api_key": API_KEY,
"language": "en-US",
@ -20,6 +22,9 @@ def get_movie_data(imdb_id):
if "status_code" in info.keys():
print("error getting tmdb data, status code:", info["status_code"])
return None
if info["movie_results"] == []:
print("no tmdb results for:", imdb_id)
return None
print("tmdb movie title:", info["movie_results"][0]["title"])
movie_id = info["movie_results"][0]["id"]
overview = info["movie_results"][0]["overview"]
@ -27,9 +32,12 @@ def get_movie_data(imdb_id):
backdrop_path = info["movie_results"][0]["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):
try:
data = {
"api_key": API_KEY,
"language": "en-US",
@ -43,15 +51,18 @@ def get_tv_show_data(imdb_id):
if info["tv_results"] == []:
print("no tmdb results for:", imdb_id)
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"]
overview = info["tv_results"][0]["overview"]
poster_path = info["tv_results"][0]["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):
try:
data = {
"api_key": API_KEY,
"language": "en-US",
@ -65,10 +76,12 @@ def get_tv_episode_data(imdb_id):
if info["tv_episode_results"] == []:
print("no tmdb results for:", imdb_id)
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"]
name = info["tv_episode_results"][0]["name"]
overview = info["tv_episode_results"][0]["overview"]
still_path = info["tv_episode_results"][0]["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 os
import sqlite3
import inspect
from comicapi import comicarchive
from comicapi.issuestring import IssueString
from urllib import parse
@ -9,12 +10,21 @@ from io import BytesIO
from PIL import Image
import datetime, pytz
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
db = sqlite3.connect(database.DATABASE)
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"]
@ -23,58 +33,3 @@ Marvel = ["Aircel Comics", "alibu Comics", "Atlas Comics", "Atlas", "CrossGen
def get_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 %}
{% 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">
<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="{}">
<source src="{{ url_for("tv.index") }}/get_episode/{{ episode["imdb_id"] }}" type="video/webm">
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">
<p class='vjs-no-js'>
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>
</p>
</video>
<h1>{{ episode["title"] }}</h1>
<p style="text-align: left">{{ episode["description"] }}</p>
<h1>{{ episode.title }}</h1>
<p style="text-align: left">{{ episode.description }}</p>
</div>
{% endif %}
{% endfor %}
@ -23,11 +23,11 @@
<div class="col-auto">
<select name="season" onchange='this.form.submit()' class="custom-select">
{% for episode in episodes %}
{% if episode["season"] not in seasons %}
<option value="{{ episode["season"] }}" {% if episode["season"] == season_num %}selected{% endif %}>
Season {{ episode["season"] }}
{% if episode.season not in seasons %}
<option value="{{ episode.season }}" {% if episode.season == season_num %}selected{% endif %}>
Season {{ episode.season }}
</option>
{{ seasons.append(episode["season"]) }}
{{ seasons.append(episode.season) }}
{% endif %}
{% endfor %}
</select>
@ -35,9 +35,9 @@
<div class="col-auto">
<select name="episode" onchange='this.form.submit()' class="custom-select">
{% for episode in episodes %}
{% if episode["season"] == season_num %}
<option value="{{ episode["episode"] }}" {% if episode["episode"] == episode_num %}selected{% endif %}>
Episode {{ episode["episode"] }}
{% if episode.season == season_num %}
<option value="{{ episode.episode }}" {% if episode.episode == episode_num %}selected{% endif %}>
Episode {{ episode.episode }}
</option>
{% endif %}
{% 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 scripts import database, func
import inspect
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
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:
print(type(e), e)
print(inspect.stack()[0][3], type(e), 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,
start=start, end=end, item_count=len(tv_shows))
except Exception as e:
print(type(e), e)
print(inspect.stack()[0][3], type(e), e)
return str(type(e))+" "+str(e)
@ -47,11 +48,11 @@ def search():
def episode_viewer(imdb_id):
try:
episodes = database.get_tv_show_episodes_by_imdb_id(imdb_id)
season = request.args.get("season", type=int, default=episodes[0]["season"])
episode = request.args.get("episode", type=int, default=episodes[0]["episode"])
season = request.args.get("season", type=int, default=episodes[0].season)
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)
except Exception as e:
print(type(e), e)
print(inspect.stack()[0][3], type(e), e)
return str(type(e)) + " " + str(e)
@ -59,8 +60,8 @@ def episode_viewer(imdb_id):
@login_required
def get_episode(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"])
dir = episode_data["path"].replace(filename, "")
filename = "S{:02d}E{:02d} - {}.mkv".format(episode_data.season, episode_data.episode, episode_data.title)
dir = episode_data.path.replace(filename, "")
response = make_response(send_from_directory(dir, filename))
response.headers["content-type"] = "video/webm"
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"