260 lines
10 KiB
Python
260 lines
10 KiB
Python
import os
|
|
from uuid import uuid4
|
|
from urllib.parse import quote
|
|
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
|
from .entry import Entry
|
|
from .link import Link
|
|
import sqlite3,json
|
|
import config
|
|
import extras
|
|
|
|
class Catalog(object):
|
|
def __init__(
|
|
self,
|
|
title,
|
|
id=None,
|
|
author_name=None,
|
|
author_uri=None,
|
|
root_url=None,
|
|
url=None,
|
|
):
|
|
self.title = title
|
|
self.id = id or uuid4()
|
|
self.author_name = author_name
|
|
self.author_uri = author_uri
|
|
self.root_url = root_url
|
|
self.url = url
|
|
self.entries = []
|
|
|
|
def add_entry(self, entry):
|
|
self.entries.append(entry)
|
|
|
|
def render(self):
|
|
env = Environment(
|
|
loader=FileSystemLoader(
|
|
searchpath=os.path.join(os.path.dirname(__file__), "templates")
|
|
),
|
|
autoescape=select_autoescape(["html", "xml"]),
|
|
)
|
|
template = env.get_template("catalog.opds.jinja2")
|
|
return template.render(catalog=self)
|
|
|
|
def fromsearch(root_url, url, content_base_path, content_relative_path):
|
|
|
|
c = Catalog(
|
|
title="test"
|
|
)
|
|
|
|
return c
|
|
|
|
def fromdir(root_url, url, content_base_path, content_relative_path):
|
|
|
|
path = os.path.join(content_base_path, content_relative_path)
|
|
|
|
if os.path.basename(content_relative_path) == "":
|
|
c = Catalog(
|
|
title="Comics",
|
|
root_url=root_url,
|
|
url=url
|
|
)
|
|
else:
|
|
c = Catalog(
|
|
title=extras.xmlesc(os.path.basename(content_relative_path)),
|
|
root_url=root_url,
|
|
url=url
|
|
)
|
|
#title=os.path.basename(os.path.dirname(path)), root_url=root_url, url=url
|
|
|
|
##########WORKING AREA###########
|
|
searchArr=[]
|
|
if c.url.endswith("/catalog"):
|
|
with open('test.json') as fi:
|
|
data=json.load(fi)
|
|
print("--> LOADED FILE") # try and get this as low as possible.
|
|
#searchArr=["Girl","Bat","Part One"]
|
|
|
|
for e in data:
|
|
for key, value in e.items():
|
|
searchArr.append(key)
|
|
print(searchArr)
|
|
######################
|
|
|
|
|
|
|
|
|
|
if not "search" in c.url:
|
|
onlydirs = [
|
|
f for f in os.listdir(path) if not os.path.isfile(os.path.join(path, f))
|
|
]
|
|
onlydirs.sort()
|
|
print(onlydirs)
|
|
for dirname in onlydirs:
|
|
print(dirname)
|
|
link = Link(
|
|
href=quote(f"/catalog/{content_relative_path}/{dirname}").replace('//','/'), #windows fix
|
|
rel="subsection",
|
|
rpath=path,
|
|
type="application/atom+xml;profile=opds-catalog;kind=acquisition",
|
|
)
|
|
c.add_entry(Entry(title=extras.xmlesc(dirname), id=uuid4(), links=[link]))
|
|
|
|
|
|
if c.url.endswith("/catalog"):
|
|
|
|
for i in searchArr:
|
|
|
|
link2 = Link(
|
|
href=quote(f"/catalog/search["+i+"]"),
|
|
rel="subsection",
|
|
rpath=path,
|
|
type="application/atom+xml;profile=opds-catalog;kind=acquisition",
|
|
)
|
|
c.add_entry(Entry(title="["+i+"]",id=uuid4(),links=[link2]))
|
|
|
|
if not "search" in c.url:
|
|
onlyfiles = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
|
|
onlyfiles.sort()
|
|
for filename in onlyfiles:
|
|
if not filename.endswith('cbz'):
|
|
continue
|
|
link = Link(
|
|
href=quote(f"/content/{content_relative_path}/{filename}"),
|
|
rel="http://opds-spec.org/acquisition",
|
|
rpath=path,
|
|
type=mimetype(filename),
|
|
)
|
|
|
|
#c.add_entry(Entry(title=filename.rsplit(".",1)[0], id=uuid4(), links=[link]))
|
|
c.add_entry(Entry(title=extras.xmlesc(filename).rsplit(".",1)[0], id=uuid4(), links=[link]))
|
|
|
|
#fixed issue with multiple . in filename
|
|
#print(c.render())
|
|
else:
|
|
with open('test.json') as fi:
|
|
data=json.load(fi)
|
|
config._print("--> LOADED 2 FILE") # try and get this as low as possible.
|
|
for e in data:
|
|
for key, value in e.items():
|
|
config._print(key)
|
|
searchArr.append(key)
|
|
for i in searchArr:
|
|
config._print("i (in searchArr): " + i)
|
|
config._print("quote i: " + quote(f""+i))
|
|
if quote(f""+i) in c.url:
|
|
conn = sqlite3.connect('app.db')
|
|
for e in data:
|
|
config._print("e (in data): " + str(e))
|
|
for key, value in e.items():
|
|
config._print("key: " + key)
|
|
if key == i:
|
|
config._print("key <" + str(key) + "> matches <" + str(i) + ">")
|
|
query="SELECT * FROM COMICS where "
|
|
for h in value:
|
|
first=True
|
|
for j,k in h.items():
|
|
|
|
if j == 'SQL':
|
|
query = query + k
|
|
if k != '' and j != "SQL":
|
|
config._print(j)
|
|
config._print(k)
|
|
config._print(query)
|
|
if not first and j != 'limit':
|
|
query = query + "and "
|
|
config._print(query)
|
|
if type(k) == list:
|
|
config._print(k)
|
|
if j == "series" or j == "title":
|
|
firstS = True
|
|
query = query + "("
|
|
config._print(query)
|
|
for l in k:
|
|
if not firstS:
|
|
query = query + "or "
|
|
config._print(query)
|
|
query = query + j + " like '%" + l + "%' "
|
|
config._print(query)
|
|
if firstS:
|
|
firstS = False
|
|
query = query + ") "
|
|
config._print(query)
|
|
else:
|
|
query = query + j + " in ("
|
|
config._print(query)
|
|
firstL = True
|
|
for l in k:
|
|
if not firstL:
|
|
query = query + ","
|
|
config._print(query)
|
|
query = query + "'" + str(l) + "'"
|
|
config._print(query)
|
|
if firstL:
|
|
firstL = False
|
|
query = query + ") "
|
|
config._print(query)
|
|
|
|
elif j != 'limit':
|
|
query = query + j + " like '%" + str(k) + "%' "
|
|
config._print(query)
|
|
elif j == 'limit':
|
|
config.DEFAULT_SEARCH_NUMBER = k
|
|
else:
|
|
print(">>>>>>>>>>>ERROR THIS SHOULD NOT HAPPEN<<<<<<<<<<<")
|
|
if first:
|
|
first = False
|
|
|
|
query = query + " order by series asc, cast(issue as unsigned) asc "
|
|
if config.DEFAULT_SEARCH_NUMBER != 0:
|
|
query = query + "LIMIT " + str(config.DEFAULT_SEARCH_NUMBER) + ";"
|
|
else:
|
|
query = query + ";"
|
|
break
|
|
else:
|
|
config._print("key <" + str(key) + "> DOES NOT match <" + str(i) + ">")
|
|
|
|
config._print("----> " + query)
|
|
|
|
sql = query
|
|
#sql="SELECT * from COMICS where SERIES like '%" + i+ "%' or Title like '%" + i+ "%';"
|
|
#config._print(sql)
|
|
s = conn.execute(sql)
|
|
#list=[]
|
|
for r in s:
|
|
#config._print(r)
|
|
tUrl=f""+r[7].replace('\\','/').replace(config.WIN_DRIVE_LETTER + ':','').replace(config.CONTENT_BASE_DIR,"/content")
|
|
#config._print(tUrl)
|
|
tTitle=r[6]
|
|
link3 = Link(
|
|
#href=quote(f"/content/DC Comics/Earth Cities/Gotham City/Batgirl/Annual/(2012) Batgirl Annual/Batgirl Annual #001 - The Blood That Moves Us [December, 2012].cbz"),
|
|
href=quote(tUrl),
|
|
rel="http://opds-spec.org/acquisition",
|
|
rpath=path,
|
|
type="application/x-cbz",
|
|
)
|
|
#config._print(link3.href)
|
|
c.add_entry(
|
|
Entry(
|
|
title=tTitle,
|
|
id=uuid4(),
|
|
links=[link3]
|
|
)
|
|
)
|
|
#print(c.title)
|
|
return c
|
|
|
|
|
|
|
|
|
|
def mimetype(path):
|
|
extension = path.split(".")[-1].lower()
|
|
if extension == "pdf":
|
|
return "application/pdf"
|
|
elif extension == "epub":
|
|
return "application/epub"
|
|
elif extension == "mobi":
|
|
return "application/mobi"
|
|
elif extension == "cbz":
|
|
return "application/x-cbz"
|
|
else:
|
|
return "application/unknown"
|