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/") 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/") 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})