From e72829ccd940d1c84e5da63132831a9b509a28a6 Mon Sep 17 00:00:00 2001 From: "Sp4rk.y" Date: Sat, 7 Sep 2024 20:15:58 -0600 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20(DROP):=20add=20thumbnail=20extract?= =?UTF-8?q?ion=20and=20attachment=20to=20tracks=20=E2=99=BB=EF=B8=8F=20(DR?= =?UTF-8?q?OP):=20improve=20episode=20number=20extraction=20logic=20and=20?= =?UTF-8?q?add=20default=20for=20extras?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/DROP/__init__.py | 49 ++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/services/DROP/__init__.py b/services/DROP/__init__.py index dbbc5fa..25db331 100644 --- a/services/DROP/__init__.py +++ b/services/DROP/__init__.py @@ -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):