✨ (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 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):
|
||||||
|
Loading…
Reference in New Issue
Block a user