134 lines
5.2 KiB
Python
134 lines
5.2 KiB
Python
from fastapi import FastAPI, Request, Form
|
|
from fastapi.responses import HTMLResponse, JSONResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
from fastapi.staticfiles import StaticFiles
|
|
from functools import partial
|
|
import json, download, asyncio
|
|
from typing import Optional
|
|
|
|
app = FastAPI()
|
|
|
|
|
|
app.mount("/data", StaticFiles(directory="/data"), name="data")
|
|
|
|
|
|
templates = Jinja2Templates(directory="templates")
|
|
loop = asyncio.get_running_loop()
|
|
|
|
# JSON cache
|
|
cached_data = None
|
|
|
|
def shows():
|
|
html = ''
|
|
global cached_data
|
|
accepted_D20 = ('Dimension 20', 'Dimension 20 Animated', "Dimension 20's Adventuring Party")
|
|
for item in cached_data:
|
|
if 'Dimension 20' in item['SHOW']:
|
|
if item['SHOW'] in accepted_D20:
|
|
name = item['SHOW']
|
|
html += f'<option value="{name}">{name}</option>'
|
|
else:
|
|
name = item['SHOW']
|
|
html += f'<option value="{name}>{name}</option>'
|
|
return html
|
|
|
|
# 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 = Form(...), location: str = Form(...)):
|
|
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("/", include_in_schema=False, 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)})
|
|
|
|
@app.get("/ydl", include_in_schema=False)
|
|
async def webpage(request: Request):
|
|
try:
|
|
return templates.TemplateResponse("ydl.html", {"request": request})
|
|
except Exception as e:
|
|
return JSONResponse(status_code=500, content={"status": "error", "message": str(e)})
|
|
|
|
@app.get("/dropout", include_in_schema=False)
|
|
async def webpage(request: Request):
|
|
global cached_data
|
|
if cached_data is None:
|
|
await dropoutUpdate()
|
|
try:
|
|
html = shows()
|
|
return templates.TemplateResponse("dropout.html", {"request": request, "shows": html})
|
|
except Exception as e:
|
|
return JSONResponse(status_code=500, content={"status": "error", "message": str(e)})
|