test
This commit is contained in:
parent
4503dfa0b3
commit
a02f91fdf2
@ -1,15 +1,6 @@
|
|||||||
from fastapi.responses import JSONResponse
|
import os, yt_dlp, json, requests, re
|
||||||
import os, yt_dlp, json, requests
|
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import re
|
from urllib.parse import urlsplit
|
||||||
|
|
||||||
# Define your patterns
|
|
||||||
reject_patterns = [
|
|
||||||
re.compile(r'(?i).*behind.?the.?scenes.*'),
|
|
||||||
re.compile(r'(?i).*trailer.*'),
|
|
||||||
re.compile(r'(?i).*recap.*'),
|
|
||||||
re.compile(r'(?i).*last.looks.*'),
|
|
||||||
]
|
|
||||||
|
|
||||||
class grab():
|
class grab():
|
||||||
def season(url):
|
def season(url):
|
||||||
@ -21,6 +12,40 @@ class grab():
|
|||||||
seasons = [item.replace(url+'/season:', '') for item in option_values]
|
seasons = [item.replace(url+'/season:', '') for item in option_values]
|
||||||
return seasons
|
return seasons
|
||||||
|
|
||||||
|
def poster(url, save_dir='/data/posters/', force_download=False):
|
||||||
|
page_html = requests.get(url)
|
||||||
|
soup = BeautifulSoup(page_html.text, 'html.parser')
|
||||||
|
|
||||||
|
# Find the first <img> anywhere inside a .product-feature
|
||||||
|
feature_section = soup.find(class_='product-feature')
|
||||||
|
if not feature_section:
|
||||||
|
return None
|
||||||
|
|
||||||
|
img_tag = feature_section.find('img', attrs={'data-image-primary': True}) or feature_section.find('img')
|
||||||
|
|
||||||
|
if img_tag and img_tag.has_attr('src'):
|
||||||
|
img_url = img_tag['src']
|
||||||
|
|
||||||
|
# Use alt for filename if available, fallback to a generic name
|
||||||
|
alt_value = img_tag.get('alt', 'image')
|
||||||
|
path = urlsplit(img_url).path
|
||||||
|
ext = os.path.splitext(path)[-1] or '.jpeg'
|
||||||
|
|
||||||
|
safe_name = re.sub(r'[\\/:*?"<>|]', '_', alt_value.replace(' ', '_'))
|
||||||
|
filename = f"{safe_name}{ext}"
|
||||||
|
filepath = os.path.join(save_dir, filename)
|
||||||
|
|
||||||
|
if not os.path.exists(filepath) or force_download:
|
||||||
|
os.makedirs(save_dir, exist_ok=True)
|
||||||
|
img_data = requests.get(img_url).content
|
||||||
|
with open(filepath, 'wb') as handler:
|
||||||
|
handler.write(img_data)
|
||||||
|
|
||||||
|
return filepath
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def thumbnail(ydl,url,location):
|
def thumbnail(ydl,url,location):
|
||||||
# Extracting video information
|
# Extracting video information
|
||||||
video_info = ydl.extract_info(url, download=False)
|
video_info = ydl.extract_info(url, download=False)
|
||||||
@ -179,6 +204,7 @@ class dropout():
|
|||||||
name=url.replace('https://www.dropout.tv/','').replace('-s-',"'s-").replace('-',' ').title().replace('Of','of').replace("'S","'s")
|
name=url.replace('https://www.dropout.tv/','').replace('-s-',"'s-").replace('-',' ').title().replace('Of','of').replace("'S","'s")
|
||||||
info_data['SHOW'] = name
|
info_data['SHOW'] = name
|
||||||
info_data['URL'] = url
|
info_data['URL'] = url
|
||||||
|
info_data['POSTER'] = grab.poster(url)
|
||||||
info_data['SEASONS'] = grab.season(url)
|
info_data['SEASONS'] = grab.season(url)
|
||||||
json_data.append(info_data)
|
json_data.append(info_data)
|
||||||
|
|
||||||
@ -218,34 +244,4 @@ class youtube():
|
|||||||
|
|
||||||
with yt_dlp.YoutubeDL(dl_ops) as ydl:
|
with yt_dlp.YoutubeDL(dl_ops) as ydl:
|
||||||
ydl.download([url])
|
ydl.download([url])
|
||||||
# grab.thumbnail(ydl,url,location)
|
# grab.thumbnail(ydl,url,location)
|
||||||
|
|
||||||
def downloadOptions(dl_ops):
|
|
||||||
if dl_ops['paths']['home'] == "/podcasts":
|
|
||||||
dl_ops['format'] = 'bestaudio/best[ext=mp3]'
|
|
||||||
dl_ops['postprocessors'] = [{
|
|
||||||
'key': 'FFmpegExtractAudio',
|
|
||||||
'preferredcodec': 'mp3',
|
|
||||||
'preferredquality': '192',
|
|
||||||
}, {
|
|
||||||
'key': 'FFmpegMetadata',
|
|
||||||
'add_metadata': True,
|
|
||||||
}]
|
|
||||||
elif dl_ops['paths']['home'] == "/asmr":
|
|
||||||
dl_ops['format'] = 'bestaudio/best[ext=mp3]'
|
|
||||||
dl_ops['postprocessors'] = [{
|
|
||||||
'key': 'FFmpegExtractAudio',
|
|
||||||
'preferredcodec': 'mp3',
|
|
||||||
'preferredquality': '192',
|
|
||||||
}, {
|
|
||||||
'key': 'FFmpegMetadata',
|
|
||||||
'add_metadata': True,
|
|
||||||
}]
|
|
||||||
elif dl_ops['paths']['home'] == "/nsfw":
|
|
||||||
dl_ops['format'] = 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best'
|
|
||||||
else:
|
|
||||||
dl_ops = {
|
|
||||||
'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best',
|
|
||||||
}
|
|
||||||
|
|
||||||
return dl_ops
|
|
||||||
@ -33,7 +33,7 @@ async def dropoutSeries():
|
|||||||
return JSONResponse(content=data)
|
return JSONResponse(content=data)
|
||||||
return JSONResponse(content={"error": "File not found"}, status_code=404)
|
return JSONResponse(content={"error": "File not found"}, status_code=404)
|
||||||
|
|
||||||
@app.post("/dropout/download")
|
@app.post("/dropout/download", description="Download an entire season from episode 1. Ignores behind the scenes and trailers.")
|
||||||
async def dropoutDownload(
|
async def dropoutDownload(
|
||||||
show: str = Form(...),
|
show: str = Form(...),
|
||||||
season: int = Form(...),
|
season: int = Form(...),
|
||||||
@ -45,7 +45,7 @@ async def dropoutDownload(
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return JSONResponse(status_code=500, content={"status": "error", "message": str(e)})
|
return JSONResponse(status_code=500, content={"status": "error", "message": str(e)})
|
||||||
|
|
||||||
@app.post("/dropout/download/specials")
|
@app.post("/dropout/download/specials", description="Downloads a seasons behind the scenes and trailers, ignores main episodes.")
|
||||||
async def dropoutDownload(
|
async def dropoutDownload(
|
||||||
show: str = Form(...),
|
show: str = Form(...),
|
||||||
season: int = Form(...),
|
season: int = Form(...),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user