(DROP): add thumbnail extraction and attachment to tracks

♻️ (DROP): improve episode number extraction logic and add default for extras
This commit is contained in:
Sp4rk.y 2024-09-07 20:15:58 -06:00
parent c2caa7db64
commit e72829ccd9

View File

@ -1,15 +1,19 @@
import re
import os
import json
import click
from typing import Optional, Union
from http.cookiejar import CookieJar
from bs4 import BeautifulSoup
from devine.core.config import config
from devine.core.service import Service
from devine.core.titles import Episode, Series
from devine.core.tracks import Tracks
from devine.core.credential import Credential
from devine.core.manifests import HLS
from devine.core.tracks.attachment import Attachment
class DROP(Service):
"""
@ -87,7 +91,6 @@ class DROP(Service):
episodes = []
season_urls = []
# Extract season URLs
season_select = soup.find("select", class_="js-switch-season")
if season_select:
for option in season_select.find_all("option"):
@ -109,11 +112,14 @@ class DROP(Service):
episode_title = episode_data["label"]
episode_number_elem = item.find("span", class_="media-identifier media-episode")
episode_number = (
int(re.search(r"Episode (\d+)", episode_number_elem.text).group(1))
if episode_number_elem
else None
)
if episode_number_elem:
episode_number_match = re.search(r"Episode (\d+)", episode_number_elem.text)
if episode_number_match:
episode_number = int(episode_number_match.group(1))
else:
episode_number = 0 # Set to 0 for extras
else:
episode_number = 0 # Set to 0 for extras
show_title = self.title.split("/")[-1].replace("-", " ").title()
@ -124,7 +130,7 @@ class DROP(Service):
season=season_number,
number=episode_number,
name=episode_title,
year=None, # You might want to extract this from somewhere else
year=None,
data={"url": episode_url},
)
episodes.append(episode)
@ -153,7 +159,6 @@ class DROP(Service):
"Sec-Fetch-Site": "cross-site",
}
# This is dirty as fuck, but it works.
embed_page = self.session.get(embed_url, headers=headers).text
config_url_match = re.search(r'config_url":"([^"]+)"', embed_page)
@ -165,6 +170,34 @@ class DROP(Service):
mpd_url = cdn["avc_url"].replace("playlist.json", "playlist.mpd")
tracks = HLS.from_url(url=mpd_url).to_tracks(language="en")
# Extract thumbnail URL from config_data
thumbnail_base_url = config_data["video"]["thumbs"]["base"]
thumbnail_url = f"{thumbnail_base_url}"
# Download the thumbnail
thumbnail_response = self.session.get(thumbnail_url)
if thumbnail_response.status_code == 200:
thumbnail_filename = f"{title.id}_thumbnail.jpg"
thumbnail_path = config.directories.temp / thumbnail_filename
# Ensure the directory exists
os.makedirs(config.directories.temp, exist_ok=True)
# Save the thumbnail file
with open(thumbnail_path, "wb") as f:
f.write(thumbnail_response.content)
# Create an Attachment object
thumbnail_attachment = Attachment(
path=thumbnail_path,
name=thumbnail_filename,
mime_type="image/jpeg",
description="Thumbnail"
)
# Add the attachment to the tracks
tracks.attachments.append(thumbnail_attachment)
return tracks
def get_chapters(self, title):