218 lines
7.7 KiB
Python
218 lines
7.7 KiB
Python
import base64
|
|
import json
|
|
from datetime import datetime
|
|
|
|
from flask import (
|
|
Blueprint,
|
|
current_app,
|
|
flash,
|
|
redirect,
|
|
render_template,
|
|
request,
|
|
session,
|
|
url_for,
|
|
)
|
|
from flask_login import current_user
|
|
from collections import defaultdict
|
|
from api import Client
|
|
from forms import RequestForm
|
|
from models import RequestItem, RequestUser
|
|
from utils import login_required, handle_config
|
|
|
|
requests_page = Blueprint("requests", __name__, url_prefix="/requests")
|
|
|
|
|
|
@requests_page.route("/<request_id>/<download_id>", methods=["GET"])
|
|
@login_required
|
|
def download_details(request_id, download_id):
|
|
c = Client()
|
|
request = RequestItem.query.filter(RequestItem.id == request_id).one_or_none()
|
|
if request is None:
|
|
flash("Unknown request ID", "danger")
|
|
return redirect(url_for("requests.details", request_id=request_id))
|
|
try:
|
|
qbt = c.qbittorent.poll(download_id)
|
|
except Exception:
|
|
flash("Unknown download ID", "danger")
|
|
return redirect(url_for("requests.details", request_id=request_id))
|
|
return render_template("qbittorrent/details.html", qbt=qbt)
|
|
|
|
|
|
@requests_page.route("/<request_id>", methods=["GET"])
|
|
@login_required
|
|
def details(request_id):
|
|
c = Client()
|
|
if current_user.is_admin:
|
|
requests = RequestItem.query
|
|
else:
|
|
user_id = current_user.get_id()
|
|
requests = RequestItem.query.filter(
|
|
RequestItem.users.any(RequestUser.user_id == user_id)
|
|
)
|
|
request = requests.filter(RequestItem.id == request_id).one_or_none()
|
|
if request is None:
|
|
flash("Unknown request ID", "danger")
|
|
return redirect(url_for("requests.index"))
|
|
RequestUser.query.filter(
|
|
(RequestUser.user_id == current_user.id)
|
|
& (RequestUser.item_id == request.item_id)
|
|
).update({RequestUser.updated: False})
|
|
current_app.db.session.commit()
|
|
jf_item = None
|
|
arr = request.arr_item
|
|
id_map = c.jellyfin.id_map()
|
|
for key_id in ["tmdbId", "imdbId", "tvdbId"]:
|
|
if key_id in arr:
|
|
key = (key_id.lower()[:-2], str(arr[key_id]))
|
|
jf_item = id_map.get(key, None)
|
|
if jf_item:
|
|
break
|
|
return render_template(
|
|
"requests/details.html", request=request, jellyfin_id=jf_item
|
|
)
|
|
|
|
|
|
@requests_page.route("/", methods=["GET", "POST"])
|
|
@login_required
|
|
def index():
|
|
c = Client()
|
|
form = RequestForm()
|
|
user_id = current_user.get_id()
|
|
cfg = handle_config()
|
|
used_requests = defaultdict(int)
|
|
if current_user.is_admin:
|
|
requests = RequestItem.query
|
|
else:
|
|
requests = RequestItem.query.filter(
|
|
RequestItem.users.any(RequestUser.user_id == user_id)
|
|
)
|
|
for item in requests:
|
|
if item.approved is None:
|
|
used_requests[item.request_type] += 1
|
|
remaining = {}
|
|
remaining["movies"] = (
|
|
cfg["num_requests_per_user"]["movies"] - used_requests["radarr"]
|
|
)
|
|
remaining["shows"] = cfg["num_requests_per_user"]["shows"] - used_requests["sonarr"]
|
|
print("RQs:", used_requests, remaining)
|
|
if (
|
|
request.method == "POST"
|
|
and ("approve" in request.form)
|
|
or ("decline" in request.form)
|
|
):
|
|
approved = "approve" in request.form
|
|
declined = "decline" in request.form
|
|
if approved and declined:
|
|
flash("What the fuck?")
|
|
approved = False
|
|
declined = False
|
|
if approved or declined:
|
|
new_state = approved
|
|
print("Approved:", approved)
|
|
for item_id in request.form.getlist("selected[]"):
|
|
item = RequestItem.query.get(item_id)
|
|
if item.approved != new_state:
|
|
RequestUser.query.filter(RequestUser.item_id == item_id).update(
|
|
{RequestUser.updated: True}
|
|
)
|
|
item.approved = new_state
|
|
if new_state is True:
|
|
search_type = item.request_type
|
|
if hasattr(c, search_type):
|
|
api = getattr(c, search_type)
|
|
if hasattr(api, "add"):
|
|
result = api.add(json.loads(item.data))
|
|
print(result)
|
|
if item.request_type == "sonarr":
|
|
item.arr_id = result["seriesId"]
|
|
if item.request_type == "radarr":
|
|
item.arr_id = result["id"]
|
|
else:
|
|
flash("Invalid search type: {}".format(search_type), "danger")
|
|
current_app.db.session.merge(item)
|
|
current_app.db.session.commit()
|
|
return render_template(
|
|
"requests/index.html",
|
|
results=[],
|
|
form=form,
|
|
search_type=None,
|
|
requests=requests,
|
|
)
|
|
return redirect(url_for("requests.index"))
|
|
if request.method == "POST" and form.search.data is False:
|
|
request_type = request.form["search_type"]
|
|
for item in request.form.getlist("selected[]"):
|
|
data = str(base64.b64decode(item), "utf8")
|
|
item = json.loads(data)
|
|
item_id = "{type}/{titleSlug}/{year}".format(type=request_type, **item)
|
|
user_id = session["jf_user"].get_id()
|
|
request_entry = RequestItem.query.get(item_id)
|
|
if request_entry is None:
|
|
request_entry = RequestItem(
|
|
added_date=datetime.now(),
|
|
item_id=item_id,
|
|
users=[],
|
|
data=data,
|
|
request_type=request_type,
|
|
)
|
|
current_app.db.session.add(request_entry)
|
|
request_entry.users.append(
|
|
RequestUser(
|
|
user_id=user_id, item_id=item_id, user_name=current_user["Name"]
|
|
)
|
|
)
|
|
current_app.db.session.merge(request_entry)
|
|
current_app.db.session.commit()
|
|
return render_template(
|
|
"requests/index.html", results=[], form=form, requests=requests
|
|
)
|
|
if form and form.validate_on_submit():
|
|
c = Client()
|
|
query = form.query.data
|
|
search_type = form.search_type.data
|
|
if hasattr(c, search_type):
|
|
api = getattr(c, search_type)
|
|
if hasattr(api, "search"):
|
|
results = api.search(query)
|
|
return render_template(
|
|
"requests/index.html",
|
|
results=results,
|
|
form=form,
|
|
search_type=search_type,
|
|
)
|
|
flash("Invalid search type: {}".format(search_type), "danger")
|
|
return render_template(
|
|
"requests/index.html",
|
|
results=[],
|
|
form=form,
|
|
search_type=None,
|
|
requests=requests,
|
|
)
|
|
|
|
|
|
"""
|
|
if form.validate_on_submit():
|
|
query = form.query.data
|
|
if not (form.torrents.data or form.movies.data or form.tv_shows.data):
|
|
form.torrents.data = True
|
|
form.movies.data = True
|
|
form.tv_shows.data = True
|
|
|
|
if form.torrents.data:
|
|
results["torrents"] = c.jackett.search(
|
|
query, form.indexer.data or form.indexer.choices
|
|
)
|
|
if form.movies.data:
|
|
results["movies"] = c.radarr.search(query)
|
|
if form.tv_shows.data:
|
|
results["tv_shows"] = c.sonarr.search(query)
|
|
return render_template(
|
|
"search/index.html",
|
|
# form=form,
|
|
search_term=query,
|
|
results=results,
|
|
client=c,
|
|
group_by_tracker=form.group_by_tracker.data,
|
|
)
|
|
"""
|