(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 re
import os
import json import json
import click import click
from typing import Optional, Union from typing import Optional, Union
from http.cookiejar import CookieJar from http.cookiejar import CookieJar
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from devine.core.config import config
from devine.core.service import Service from devine.core.service import Service
from devine.core.titles import Episode, Series from devine.core.titles import Episode, Series
from devine.core.tracks import Tracks from devine.core.tracks import Tracks
from devine.core.credential import Credential from devine.core.credential import Credential
from devine.core.manifests import HLS from devine.core.manifests import HLS
from devine.core.tracks.attachment import Attachment
class DROP(Service): class DROP(Service):
""" """
@ -87,7 +91,6 @@ class DROP(Service):
episodes = [] episodes = []
season_urls = [] season_urls = []
# Extract season URLs
season_select = soup.find("select", class_="js-switch-season") season_select = soup.find("select", class_="js-switch-season")
if season_select: if season_select:
for option in season_select.find_all("option"): for option in season_select.find_all("option"):
@ -109,11 +112,14 @@ class DROP(Service):
episode_title = episode_data["label"] episode_title = episode_data["label"]
episode_number_elem = item.find("span", class_="media-identifier media-episode") episode_number_elem = item.find("span", class_="media-identifier media-episode")
episode_number = ( if episode_number_elem:
int(re.search(r"Episode (\d+)", episode_number_elem.text).group(1)) episode_number_match = re.search(r"Episode (\d+)", episode_number_elem.text)
if episode_number_elem if episode_number_match:
else None 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() show_title = self.title.split("/")[-1].replace("-", " ").title()
@ -124,7 +130,7 @@ class DROP(Service):
season=season_number, season=season_number,
number=episode_number, number=episode_number,
name=episode_title, name=episode_title,
year=None, # You might want to extract this from somewhere else year=None,
data={"url": episode_url}, data={"url": episode_url},
) )
episodes.append(episode) episodes.append(episode)
@ -153,7 +159,6 @@ class DROP(Service):
"Sec-Fetch-Site": "cross-site", "Sec-Fetch-Site": "cross-site",
} }
# This is dirty as fuck, but it works. # This is dirty as fuck, but it works.
embed_page = self.session.get(embed_url, headers=headers).text embed_page = self.session.get(embed_url, headers=headers).text
config_url_match = re.search(r'config_url":"([^"]+)"', embed_page) 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") mpd_url = cdn["avc_url"].replace("playlist.json", "playlist.mpd")
tracks = HLS.from_url(url=mpd_url).to_tracks(language="en") 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 return tracks
def get_chapters(self, title): def get_chapters(self, title):