✨ (DROP): add thumbnail extraction and attachment to tracks
♻️ (DROP): improve episode number extraction logic and add default for extras
This commit is contained in:
parent
c2caa7db64
commit
e72829ccd9
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user