Files
mangaDownloader/main.py

239 lines
7.7 KiB
Python

from flask_sqlalchemy import SQLAlchemy
from flask import Flask, jsonify, render_template, request
import json
import os
import subprocess
from waitress import serve
PATH = '/download'
app = Flask(__name__,
template_folder="templates")
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://mdownload:mdownload@192.168.86.198:3306/Downloads'
db = SQLAlchemy(app)
class downloaderSettings(db.Model):
ID = db.Column(db.Integer, primary_key=True)
path = db.Column(db.Text)
class manga(db.Model):
manga_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
url = db.Column(db.Text)
url_flag = db.Column(db.Text)
view_format = db.Column(db.Integer)
unknown_value = db.Column(db.Integer)
active = db.Column(db.Boolean, default=1)
class url_metadata(db.Model):
url_id = db.Column(db.Integer, primary_key=True)
source_name = db.Column(db.VARCHAR(length=10000))
flag = db.Column(db.Text)
base_url = db.Column(db.VARCHAR(length=10000))
@app.route('/', methods=['GET'])
def index():
return render_template("index.html")
@app.route('/download', methods=['GET'])
def download():
updated = []
result = db.session.query(manga, url_metadata).filter_by(active=1).join(url_metadata, manga.url_flag==url_metadata.flag).all()
for each in result:
book={}
if 'http' in each.manga.name or 'https' in each.manga.url:
# execute = """manga-py """ + each.manga.url + """ -n \"""" + each.manga.name + """\" -d \"""" + PATH + """\" -z -N --print-json"""
exec_command = subprocess.Popen(['manga-py', each.manga.url, '-n', each.manga.name, '-d', PATH, '-z', '-N', '--print-json'], stdout=subprocess.PIPE)
else:
print('nothing')
# execute = """manga-py """ + each.url_metadata.base_url+each.manga.url + """ -n \"""" + each.manga.name.strip('?') + """\" -d \"""" + PATH + """\" -z -N --print-json"""
exec_command = subprocess.Popen(['manga-py', each.url_metadata.base_url+each.manga.url, '-n', each.manga.name.strip('?'), '-d', PATH, '-z', '-N', '--print-json'], stdout=subprocess.PIPE)
book['title'] = each.manga.name
# book['command'] = 'nothing'
# os.system(execute)
# exec_command = subprocess.Popen(execute, stdout=subprocess.PIPE)
# book['output'] = exec_command.communicate()
exec_command.communicate()
book['command'] = exec_command.args
updated.append(book)
missing = check(passin=1)
return jsonify(manga=updated, missingFlags=missing[0], missingManga=missing[1])
@app.route('/upload', methods=['GET'])
def upload_jason():
url = []
base = []
name = []
y = 0
z = 0
added = []
with open(PATH+"/tach.json", "r") as tf:
# with open("tach.json", "r") as tf:
data = json.load(tf)
for x in data["mangas"]:
# Manga Name
name.append(data["mangas"][y]["manga"][1])
# Mange URL
url.append(data["mangas"][y]["manga"][0])
# Mange Base URL
base.append(data["mangas"][y]["manga"][2])
y=y+1
for each in name:
# print('start')
if not manga.query.filter_by(name=name[z]).first():
new_manga={}
query = manga(name=name[z], url=url[z], url_flag=str(base[z]), view_format=0, unknown_value=0)
new_manga['title'] = name[z]
added.append(new_manga)
db.session.add(query)
z = z + 1
db.session.commit()
return jsonify(added=added)
@app.route('/active', methods=['GET'])
def active():
activbooks=[]
result = manga.query.filter_by(active=1).all()
for each in result:
book={}
book['id'] = each.manga_id
book['title'] = each.name
book['url'] = each.url
book['url_flag'] = each.url_flag
activbooks.append(book)
return jsonify(active=activbooks)
@app.route('/check/', methods=['GET'])
def check(passin=0):
passin=passin
missingManga = []
missingFlags = []
providerFlags = []
mangaFlags = manga.query.with_entities(manga.url_flag).distinct()
providerFlagResult = url_metadata.query.all()
for each in providerFlagResult:
providerFlags.append(each.flag)
for each in mangaFlags:
if each.url_flag not in providerFlags:
missingFlags.append(each.url_flag)
for each in missingFlags:
mangaInfo = {}
badManga = manga.query.filter_by(url_flag=each).all()
for each in badManga:
mangaInfo['name'] = each.name
mangaInfo['url_flag'] = each.url_flag
mangaInfo['active'] = each.active
missingManga.append(mangaInfo)
if passin == 1:
return missingFlags, missingManga
else:
return jsonify(missingFlags=missingFlags, missingManga=missingManga)
@app.route('/add/', methods=['PUT'])
def add():
data = request.get_json()
added = []
if 'http' or 'https' not in data['url']:
return jsonify(error='invalid url')
if not manga.query.filter_by(name=data['name']).first():
new_manga={}
query = manga(name=data['name'], url=data['url'], url_flag='000000', view_format=0, unknown_value=0)
new_manga['title'] = data['name']
added.append(new_manga)
db.session.add(query)
db.session.commit()
return jsonify(added=added)
@app.route('/upgrade/', methods=['PUT'])
def upgrade():
os.system('pip install --upgrade manga-py')
return jsonify(status='manga-py upgrade ran')
@app.route('/ood/', methods=['GET'])
def ood():
updated = []
unadded = []
url = []
base = []
name = []
y = 0
z = 0
with open(PATH + "/tach.json", "r") as tf:
# with open("tach.json", "r") as tf:
data = json.load(tf)
for x in data["mangas"]:
# Manga Name
name.append(data["mangas"][y]["manga"][1])
# Mange URL
url.append(data["mangas"][y]["manga"][0])
# Mange Base URL
base.append(data["mangas"][y]["manga"][2])
y = y + 1
for each in name:
# print('start')
if manga.query.filter_by(name=name[z]).first():
result = manga.query.filter_by(name=name[z]).first()
if result.url != url[z]:
new_manga={}
# print('----' + name[z])
# print(url[z])
# print(result.url)
# query = manga(name=name[z], url=url[z], url_flag=str(base[z]), view_format=0, unknown_value=0)
result.url = url[z]
new_manga['title'] = name[z]
updated.append(new_manga)
else:
new_manga = {}
new_manga['title'] = name[z]
unadded.append(new_manga)
z = z + 1
db.session.commit()
return jsonify(updated=updated, unadded=unadded)
@app.route('/test/', methods=['GET'])
def test():
y = 0
mangaInfo=[]
mangaName = manga.query.all()
with open(PATH + "/tach.json", "r") as tf:
data = json.load(tf)
for x in data["mangas"]:
watchedManga = {}
# Manga Name
watchedManga['name']=data["mangas"][y]["manga"][1]
# Mange URL
watchedManga['url']=data["mangas"][y]["manga"][0]
# Mange Base URL
watchedManga['base']=data["mangas"][y]["manga"][2]
y = y + 1
mangaInfo.append(watchedManga)
return jsonify(mangaInfo)
if __name__ == "__main__":
# app.run(host='0.0.0.0', debug=True)
serve(app, host='0.0.0.0', port=8000)