from fastapi import FastAPI, Request, Form from fastapi.responses import HTMLResponse, JSONResponse from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles # from fastapi.concurrency import run_in_threadpool from pathlib import Path from functools import partial import json, download, asyncio from typing import Optional import os app = FastAPI() app.mount("/data", StaticFiles(directory="/data"), name="data") templates = Jinja2Templates(directory="app/templates") loop = asyncio.get_running_loop() # JSON cache cached_data = None # api @app.get("/dropout/update") async def dropoutUpdate(): global cached_data try: download.dropout.series() with open('/data/dropout.json') as f: cached_data = json.load(f) return JSONResponse(status_code=200, content={"status": "success", "message": "Series grab complete."}) except Exception as e: return JSONResponse(status_code=500, content={"status": "error", "message": str(e)}) @app.get("/dropout/series") async def dropoutSeries(): global cached_data if cached_data is None: await dropoutUpdate() return JSONResponse(content=cached_data) return JSONResponse(content={"error": "File not found"}, status_code=404) @app.post("/dropout/download", description="Download an entire season from episode 1. Ignores behind the scenes and trailers.") async def dropoutDownload( show: str = Form(...), season: int = Form(...), ): try: await loop.run_in_executor(None, partial(download.dropout.show,show,season,None)) # download.dropout.show(show,season,episode) return JSONResponse(status_code=200, content={"status": "success", "message": "Series downloaded."}) except Exception as e: return JSONResponse(status_code=500, content={"status": "error", "message": str(e)}) @app.post("/dropout/download/specials", description="Downloads a seasons behind the scenes and trailers, ignores main episodes.") async def dropoutDownload( show: str = Form(...), season: int = Form(...), episode: Optional[int] = Form(None) ): try: await loop.run_in_executor(None, partial(download.dropout.specials,show,season,episode)) # download.dropout.show(show,season,episode) return JSONResponse(status_code=200, content={"status": "success", "message": "Series downloaded."}) except Exception as e: return JSONResponse(status_code=500, content={"status": "error", "message": str(e)}) @app.post("/ydl") async def ydl(url: str, location: str): try: await loop.run_in_executor(None, partial(download.youtube.ydl, url, location)) # download.youtube.ydl(url,location) # grab.thumbnail(ydl,url,location) return JSONResponse(status_code=200, content={"status": "success", "message": "Video download completed."}) except Exception as e: return JSONResponse(status_code=500, content={"status": "error", "message": str(e)}) @app.get("/", response_class=HTMLResponse) async def index(request: Request): global cached_data try: if cached_data is None: await dropoutUpdate() return templates.TemplateResponse("index.html", {"request": request, "data": cached_data}) except Exception as e: return JSONResponse(status_code=500, content={"status": "error", "message": str(e)}) @app.get("/show/{show}", include_in_schema=False, response_class=HTMLResponse) async def index(request: Request, show = str): try: global cached_data if cached_data is None: await dropoutUpdate() try: for item in cached_data: if show == item['LINK']: show_data = item return templates.TemplateResponse("show.html", {"request": request, "show": show_data}) except Exception as e: return JSONResponse(status_code=500, content={"status": "error", "message": str(e)}) except Exception as e: return JSONResponse(status_code=500, content={"status": "error", "message": str(e)})