This commit is contained in:
TylerCG 2025-04-20 01:09:31 -04:00
parent c5e6057dff
commit 6061aff2ef
7 changed files with 25 additions and 550 deletions

View File

@ -19,4 +19,4 @@ COPY . .
EXPOSE 8000 EXPOSE 8000
# Run the app with Uvicorn # Run the app with Uvicorn
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

Binary file not shown.

View File

@ -1,531 +0,0 @@
[
{
"SHOW": "Adventuring Academy",
"URL": "https://www.dropout.tv/adventuring-academy",
"SEASONS": [
"1",
"2",
"3",
"4",
"5"
]
},
{
"SHOW": "Bad Internet",
"URL": "https://www.dropout.tv/bad-internet",
"SEASONS": [
"1"
]
},
{
"SHOW": "Breaking News No Laugh Newsroom",
"URL": "https://www.dropout.tv/breaking-news-no-laugh-newsroom",
"SEASONS": [
"1",
"2",
"3",
"4",
"5",
"6",
"7"
]
},
{
"SHOW": "Cartoon Hell",
"URL": "https://www.dropout.tv/cartoon-hell",
"SEASONS": [
"1",
"2"
]
},
{
"SHOW": "Dimension 20",
"URL": "https://www.dropout.tv/dimension-20",
"SEASONS": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25"
]
},
{
"SHOW": "Dimension 20 A Court of Fey Flowers",
"URL": "https://www.dropout.tv/dimension-20-a-court-of-fey-flowers",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 A Crown of Candy",
"URL": "https://www.dropout.tv/dimension-20-a-crown-of-candy",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 A Starstruck Odyssey",
"URL": "https://www.dropout.tv/dimension-20-a-starstruck-odyssey",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Animated",
"URL": "https://www.dropout.tv/dimension-20-animated",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Audio Only",
"URL": "https://www.dropout.tv/dimension-20-audio-only",
"SEASONS": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25"
]
},
{
"SHOW": "Dimension 20 Burrow's End",
"URL": "https://www.dropout.tv/dimension-20-burrow-s-end",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Coffin Run",
"URL": "https://www.dropout.tv/dimension-20-coffin-run",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Dungeons And Drag Queens",
"URL": "https://www.dropout.tv/dimension-20-dungeons-and-drag-queens",
"SEASONS": [
"1",
"2"
]
},
{
"SHOW": "Dimension 20 Escape From The Bloodkeep",
"URL": "https://www.dropout.tv/dimension-20-escape-from-the-bloodkeep",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Fantasy High",
"URL": "https://www.dropout.tv/dimension-20-fantasy-high",
"SEASONS": [
"1",
"2",
"3"
]
},
{
"SHOW": "Dimension 20 Fantasy High Junior Year",
"URL": "https://www.dropout.tv/dimension-20-fantasy-high-junior-year",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Leviathan",
"URL": "https://www.dropout.tv/dimension-20-leviathan",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Mentopolis",
"URL": "https://www.dropout.tv/dimension-20-mentopolis",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Misfits And Magic",
"URL": "https://www.dropout.tv/dimension-20-misfits-and-magic",
"SEASONS": [
"1",
"2",
"3"
]
},
{
"SHOW": "Dimension 20 Never Stop Blowing Up",
"URL": "https://www.dropout.tv/dimension-20-never-stop-blowing-up",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Neverafter",
"URL": "https://www.dropout.tv/dimension-20-neverafter",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Shriek Week",
"URL": "https://www.dropout.tv/dimension-20-shriek-week",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 The Ravening War",
"URL": "https://www.dropout.tv/dimension-20-the-ravening-war",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 The Seven",
"URL": "https://www.dropout.tv/dimension-20-the-seven",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 The Unsleeping City",
"URL": "https://www.dropout.tv/dimension-20-the-unsleeping-city",
"SEASONS": [
"1",
"2"
]
},
{
"SHOW": "Dimension 20 Time Quangle",
"URL": "https://www.dropout.tv/dimension-20-time-quangle",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Tiny Heist",
"URL": "https://www.dropout.tv/dimension-20-tiny-heist",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20 Titan Takedown",
"URL": "https://www.dropout.tv/dimension-20-titan-takedown",
"SEASONS": [
"1"
]
},
{
"SHOW": "Dimension 20's Adventuring Party",
"URL": "https://www.dropout.tv/dimension-20-s-adventuring-party",
"SEASONS": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20"
]
},
{
"SHOW": "Dirty Laundry",
"URL": "https://www.dropout.tv/dirty-laundry",
"SEASONS": [
"1",
"2",
"3",
"4",
"69"
]
},
{
"SHOW": "Dropout Music",
"URL": "https://www.dropout.tv/dropout-music",
"SEASONS": [
"1"
]
},
{
"SHOW": "Erotic Clubhouse",
"URL": "https://www.dropout.tv/erotic-clubhouse",
"SEASONS": [
"1"
]
},
{
"SHOW": "Fantasy High Extra Credit",
"URL": "https://www.dropout.tv/fantasy-high-extra-credit",
"SEASONS": [
"1"
]
},
{
"SHOW": "Game Changer",
"URL": "https://www.dropout.tv/game-changer",
"SEASONS": [
"1",
"2",
"3",
"4",
"5",
"6",
"7"
]
},
{
"SHOW": "Game Changer Animated",
"URL": "https://www.dropout.tv/game-changer-animated",
"SEASONS": [
"1"
]
},
{
"SHOW": "Game Changer Battle Royale",
"URL": "https://www.dropout.tv/game-changer-battle-royale",
"SEASONS": [
"1"
]
},
{
"SHOW": "Gastronauts",
"URL": "https://www.dropout.tv/gastronauts",
"SEASONS": [
"1"
]
},
{
"SHOW": "Gods of Food",
"URL": "https://www.dropout.tv/gods-of-food",
"SEASONS": [
"1"
]
},
{
"SHOW": "Kingpin Katie",
"URL": "https://www.dropout.tv/kingpin-katie",
"SEASONS": [
"1"
]
},
{
"SHOW": "Kingpin Katie The Web Series",
"URL": "https://www.dropout.tv/kingpin-katie-the-web-series",
"SEASONS": [
"1"
]
},
{
"SHOW": "Make Some Noise",
"URL": "https://www.dropout.tv/make-some-noise",
"SEASONS": [
"1",
"2",
"3"
]
},
{
"SHOW": "Mice Murder",
"URL": "https://www.dropout.tv/mice-murder",
"SEASONS": [
"1"
]
},
{
"SHOW": "Monet's Slumber Party",
"URL": "https://www.dropout.tv/monet-s-slumber-party",
"SEASONS": [
"1"
]
},
{
"SHOW": "Nobody Asked",
"URL": "https://www.dropout.tv/nobody-asked",
"SEASONS": [
"1"
]
},
{
"SHOW": "Paranoia",
"URL": "https://www.dropout.tv/paranoia",
"SEASONS": [
"1",
"2"
]
},
{
"SHOW": "Parlor Room",
"URL": "https://www.dropout.tv/parlor-room",
"SEASONS": [
"1"
]
},
{
"SHOW": "Play It By Ear",
"URL": "https://www.dropout.tv/play-it-by-ear",
"SEASONS": [
"1",
"2"
]
},
{
"SHOW": "See Plum Run",
"URL": "https://www.dropout.tv/see-plum-run",
"SEASONS": [
"1"
]
},
{
"SHOW": "Smartypants",
"URL": "https://www.dropout.tv/smartypants",
"SEASONS": [
"1",
"2"
]
},
{
"SHOW": "Thousandaires",
"URL": "https://www.dropout.tv/thousandaires",
"SEASONS": [
"1"
]
},
{
"SHOW": "Total Forgiveness",
"URL": "https://www.dropout.tv/total-forgiveness",
"SEASONS": [
"1"
]
},
{
"SHOW": "Total Forgiveness Early Payoff",
"URL": "https://www.dropout.tv/total-forgiveness-early-payoff",
"SEASONS": [
"1"
]
},
{
"SHOW": "Troopers 1",
"URL": "https://www.dropout.tv/troopers-1",
"SEASONS": [
"1"
]
},
{
"SHOW": "Troopers Animated",
"URL": "https://www.dropout.tv/troopers-animated",
"SEASONS": [
"1"
]
},
{
"SHOW": "Ultramechatron Team Go 1",
"URL": "https://www.dropout.tv/ultramechatron-team-go-1",
"SEASONS": [
"1"
]
},
{
"SHOW": "Um Actually",
"URL": "https://www.dropout.tv/um-actually",
"SEASONS": [
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10"
]
},
{
"SHOW": "Very Important People",
"URL": "https://www.dropout.tv/very-important-people",
"SEASONS": [
"1",
"2"
]
},
{
"SHOW": "What The Facts 101",
"URL": "https://www.dropout.tv/what-the-facts-101",
"SEASONS": [
"1"
]
},
{
"SHOW": "Where In The Eff Is Sarah Cincinnati",
"URL": "https://www.dropout.tv/where-in-the-eff-is-sarah-cincinnati",
"SEASONS": [
"1"
]
},
{
"SHOW": "Wtf 101",
"URL": "https://www.dropout.tv/wtf-101",
"SEASONS": [
"1"
]
}
]

View File

@ -13,8 +13,8 @@ class grab():
class dropout(): class dropout():
def show(show,season,episode): def show(show,season,episode):
directory='/mnt/plex/tv/'+show+'/Season '+season+'/' directory='/tv/'+show+'/Season '+season+'/'
with open('data/dropout.json', 'r') as json_file: with open('/data/dropout.json', 'r') as json_file:
url_mapping = json.load(json_file) url_mapping = json.load(json_file)
url = next((item['URL'] for item in url_mapping if item['SHOW'] == show), None) url = next((item['URL'] for item in url_mapping if item['SHOW'] == show), None)
if url is not None: if url is not None:
@ -35,7 +35,7 @@ class dropout():
'format': 'bestvideo+bestaudio/best', 'format': 'bestvideo+bestaudio/best',
'audio_quality': '256K', 'audio_quality': '256K',
'paths': { 'paths': {
'temp': '/mnt/data/downloader/temp', 'temp': '/temp',
'home': directory 'home': directory
}, },
'cookiefile': 'cookies.txt', 'cookiefile': 'cookies.txt',
@ -75,13 +75,12 @@ class dropout():
# Sort the json_data by the 'SHOW' key # Sort the json_data by the 'SHOW' key
sorted_json_data = sorted(json_data, key=lambda x: x['SHOW']) sorted_json_data = sorted(json_data, key=lambda x: x['SHOW'])
with open('data/dropout.json', 'w') as json_file: with open('/data/dropout.json', 'w') as json_file:
json.dump(sorted_json_data, json_file, indent=4) json.dump(sorted_json_data, json_file, indent=4)
return sorted_json_data
def ydl(url, location): def ydl(url, location):
dl_ops = {'paths': {'temp': '/mnt/data/downloader/temp', 'home': location}, 'outtmpl': '%(uploader)s/%(title)s.%(ext)s'} dl_ops = {'paths': {'temp': '/temp', 'home': location}, 'outtmpl': '%(uploader)s/%(title)s.%(ext)s'}
if location == "/mnt/plex/podcasts": if location == "/podcasts":
dl_ops['format'] = 'bestaudio/best[ext=mp3]' dl_ops['format'] = 'bestaudio/best[ext=mp3]'
dl_ops['postprocessors'] = [{ dl_ops['postprocessors'] = [{
'key': 'FFmpegExtractAudio', 'key': 'FFmpegExtractAudio',
@ -91,7 +90,7 @@ def ydl(url, location):
'key': 'FFmpegMetadata', 'key': 'FFmpegMetadata',
'add_metadata': True, 'add_metadata': True,
}] }]
elif location == "/mnt/plex/asmr": elif location == "/asmr":
dl_ops['format'] = 'bestaudio/best[ext=mp3]' dl_ops['format'] = 'bestaudio/best[ext=mp3]'
dl_ops['postprocessors'] = [{ dl_ops['postprocessors'] = [{
'key': 'FFmpegExtractAudio', 'key': 'FFmpegExtractAudio',

View File

@ -3,26 +3,26 @@ from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.templating import Jinja2Templates from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from pathlib import Path from pathlib import Path
import download import app.download as download
import json import json
app = FastAPI() app = FastAPI()
# Mount static files if needed (e.g. CSS, JS, images) # # Mount static files if needed (e.g. CSS, JS, images)
app.mount("/static", StaticFiles(directory="static"), name="static") app.mount("/static", StaticFiles(directory="app/static"), name="static")
# Jinja2 template directory # # Jinja2 template directory
templates = Jinja2Templates(directory="templates") templates = Jinja2Templates(directory="app/templates")
# api # api
@app.get("/dropoutUpdate") @app.get("/dropoutUpdate")
async def grab(): async def dropoutUpdate():
return download.dropout.series() download.dropout.series()
@app.get("/dropoutSeries", response_class=JSONResponse) @app.get("/dropoutSeries", response_class=JSONResponse)
async def read(): async def dropoutSeries():
file_path = Path("data/dropout.json") file_path = Path("/data/dropout.json")
if file_path.exists(): if file_path.exists():
with file_path.open("r", encoding="utf-8") as f: with file_path.open("r", encoding="utf-8") as f:
data = json.load(f) data = json.load(f)
@ -30,7 +30,7 @@ async def read():
return JSONResponse(content={"error": "File not found"}, status_code=404) return JSONResponse(content={"error": "File not found"}, status_code=404)
@app.get("/dropoutDownload") @app.get("/dropoutDownload")
async def download(show: str, season: str, episode: str): async def dropoutDownload(show: str, season: str, episode: str):
download.dropout.show(show,season,episode) download.dropout.show(show,season,episode)
# html # html

View File

@ -0,0 +1,7 @@
bs4
yt_dlp
requests
fastapi
pathlib
uvicorn
jinja2