source downloader

This commit is contained in:
Jesse Bannon 2022-09-28 12:14:11 -07:00
parent a1bb2be7f2
commit 84ede62a15
4 changed files with 70 additions and 6 deletions

View file

@ -4,6 +4,7 @@ from typing import Type
from ytdl_sub.downloaders.downloader import Downloader from ytdl_sub.downloaders.downloader import Downloader
from ytdl_sub.downloaders.generic.collection import CollectionDownloader from ytdl_sub.downloaders.generic.collection import CollectionDownloader
from ytdl_sub.downloaders.generic.source import SourceDownloader
from ytdl_sub.downloaders.soundcloud.albums_and_singles import SoundcloudAlbumsAndSinglesDownloader from ytdl_sub.downloaders.soundcloud.albums_and_singles import SoundcloudAlbumsAndSinglesDownloader
from ytdl_sub.downloaders.youtube.channel import YoutubeChannelDownloader from ytdl_sub.downloaders.youtube.channel import YoutubeChannelDownloader
from ytdl_sub.downloaders.youtube.merge_playlist import YoutubeMergePlaylistDownloader from ytdl_sub.downloaders.youtube.merge_playlist import YoutubeMergePlaylistDownloader
@ -39,6 +40,7 @@ class DownloadStrategyMapping:
}, },
"generic": { "generic": {
"collection": CollectionDownloader, "collection": CollectionDownloader,
"source": SourceDownloader,
}, },
} }

View file

@ -79,15 +79,38 @@ class CollectionUrlValidator(StrictDictValidator):
@property @property
def source_thumbnails(self) -> Optional[CollectionThumbnailListValidator]: def source_thumbnails(self) -> Optional[CollectionThumbnailListValidator]:
""" """
Thumbnails to download from the source, if any exist. The hierarchy is Thumbnails to download from the source, if any exist. The hierarchy is defined as
source -> playlist -> entry. source -> playlist -> entry.
Usage:
.. code-block:: yaml
source_thumbnails:
- name: "poster.jpg"
uid: "avatar_uncropped"
UID is the yt-dlp thumbnail ID or can specify ``latest_entry`` to use the last entry's
thumbnail that was downloaded.
""" """
return self._source_thumbnails return self._source_thumbnails
@property @property
def playlist_thumbnails(self) -> Optional[CollectionThumbnailListValidator]: def playlist_thumbnails(self) -> Optional[CollectionThumbnailListValidator]:
""" """
TODO:docstring Thumbnails to download from the source, if any exist. The hierarchy is defined as
source -> playlist -> entry.
Usage:
.. code-block:: yaml
playlist_thumbnails:
- name: "poster.jpg"
uid: "avatar_uncropped"
UID is the yt-dlp thumbnail ID or can specify ``latest_entry`` to use the last entry's
thumbnail that was downloaded.
""" """
return self._playlist_thumbnails return self._playlist_thumbnails

View file

@ -0,0 +1,39 @@
from ytdl_sub.downloaders.downloader import Downloader
from ytdl_sub.downloaders.downloader import DownloaderValidator
from ytdl_sub.downloaders.generic.collection_validator import CollectionUrlValidator
from ytdl_sub.downloaders.generic.collection_validator import CollectionValidator
class SourceDownloadOptions(CollectionUrlValidator, DownloaderValidator):
"""
Downloads from a single URL supported by yt-dlp.
Usage:
.. code-block:: yaml
presets:
my_example_preset:
generic:
# required
download_strategy: "source"
url: "youtube.com/channel/UCsvn_Po0SmunchJYtttWpOxMg"
# optional
playlist_thumbnails:
- name: "poster.jpg"
uid: "avatar_uncropped"
- name: "fanart.jpg"
uid: "banner_uncropped"
"""
@property
def collection_validator(self) -> CollectionValidator:
"""Returns itself!"""
return CollectionValidator(
name=self._name,
value={"urls": [self._value]},
)
class SourceDownloader(Downloader[SourceDownloadOptions]):
downloader_options_type = SourceDownloadOptions

View file

@ -3,6 +3,7 @@ from typing import Dict
from ytdl_sub.downloaders.downloader import Downloader from ytdl_sub.downloaders.downloader import Downloader
from ytdl_sub.downloaders.downloader import DownloaderValidator from ytdl_sub.downloaders.downloader import DownloaderValidator
from ytdl_sub.downloaders.generic.collection_validator import CollectionValidator from ytdl_sub.downloaders.generic.collection_validator import CollectionValidator
from ytdl_sub.downloaders.generic.source import SourceDownloadOptions
from ytdl_sub.validators.url_validator import YoutubeVideoUrlValidator from ytdl_sub.validators.url_validator import YoutubeVideoUrlValidator
@ -38,10 +39,9 @@ class YoutubeVideoDownloaderOptions(DownloaderValidator):
@property @property
def collection_validator(self) -> CollectionValidator: def collection_validator(self) -> CollectionValidator:
"""Downloads the video url""" """Downloads the video url"""
return CollectionValidator( return SourceDownloadOptions(
name=self._name, name=self._name, value={"url": self.video_url}
value={"urls": [{"url": self.video_url, "variables": {"playlist_size": "1"}}]}, ).collection_validator
)
@property @property
def video_url(self) -> str: def video_url(self) -> str: