Toloka2WebV2/app/api/titles.py

121 lines
4 KiB
Python

import os
from flask import Blueprint, jsonify, request, current_app
from app.services.torrents import initiate_config, serialize_operation_result
from flask_sqlalchemy import SQLAlchemy
from app.db import db, ImagesCache
from app.models.request_data import RequestData
from . import api_bp
from toloka2MediaServer.main_logic import (
add_release_by_url,
update_release_by_name,
update_releases,
search_torrents,
get_torrent as get_torrent_external,
add_torrent as add_torrent_external,
)
@api_bp.route("/api/titles")
def titles_route():
sections = []
config = initiate_config()
titles = config.titles_config
for title in titles.sections():
if request.args.get("query", "") in title:
image_cache = db.session.execute(
db.select(ImagesCache).filter_by(codename=title)
).scalar_one_or_none()
if image_cache:
titles[title]["image"] = image_cache.image
else:
toloka_torrent = config.toloka.get_torrent(
f"https://toloka.to/{titles[title]['guid']}"
)
toloka_img = (
f"https:{toloka_torrent.img}"
if toloka_torrent.img.startswith("//")
else toloka_torrent.img
)
db.session.add(ImagesCache(title, toloka_img))
db.session.commit()
titles[title]["image"] = toloka_img
titles[title]["codename"] = title
titles[title]["torrent_name"] = titles[title]["torrent_name"].replace(
'"', ""
)
sections.append(dict(titles[title]))
return jsonify(sections)
@api_bp.route("/api/add", methods=["POST"])
def add_route():
config = initiate_config()
requestData = RequestData(
url=request.json["tolokaUrl"],
season=request.json["seasonIndex"],
index=int(request.json["episodeIndex"].split(".")[0]),
correction=int(request.json["adjustedEpisodeNumber"]),
title=request.json["dirname"],
)
config.args = requestData
operation_result = add_release_by_url(config)
output = serialize_operation_result(operation_result)
return jsonify({"result": True})
@api_bp.route("/api/delete/<codename>")
def delete_route(codename):
config = initiate_config()
titles = config.titles_config
titles.remove_section(codename)
with open("data/titles.ini", "w") as f:
titles.write(f)
return f"{codename} успішно видалений."
@api_bp.route("/api/update/", defaults={"codename": None})
@api_bp.route("/api/update/<codename>")
def update_route(codename):
# Process the name to update release
try:
config = initiate_config()
requestData = RequestData(codename=codename)
if codename:
config.args = requestData
operation_result = update_release_by_name(config)
else:
config.args = RequestData()
operation_result = update_releases(config)
output = serialize_operation_result(operation_result)
return output
except Exception as e:
message = f"Error: {str(e)}"
return {"error": message}
@api_bp.route("/api/edit", methods=["POST"])
def edit_route():
config = initiate_config()
titles = config.titles_config
for title in titles.sections():
if titles._sections[title]["hash"] != request.json["hash"]:
continue
titles._sections[title]["episode_index"] = request.json["episodeIndex"]
titles._sections[title]["season_number"] = request.json["seasonNumber"]
titles._sections[title]["torrent_name"] = request.json["torrentName"]
titles._sections[title]["download_dir"] = request.json["downloadDir"]
titles._sections[title]["publish_date"] = request.json["publishDate"]
titles._sections[title]["adjusted_episode_number"] = request.json["adjustedEpisodeNumber"]
with open("data/titles.ini", "w") as f:
titles.write(f)
return jsonify({"result": True})