playlist bilateral working :o

This commit is contained in:
Jesse Bannon 2024-03-30 00:52:42 -07:00
parent bbed76fb7c
commit d7bb8d21f1
7 changed files with 307 additions and 157 deletions

View file

@ -55,10 +55,6 @@ class UrlDownloaderThumbnailPlugin(SourcePluginExtension):
enhanced_download_archive=enhanced_download_archive, enhanced_download_archive=enhanced_download_archive,
) )
self._thumbnails_downloaded: Set[str] = set() self._thumbnails_downloaded: Set[str] = set()
self._collection_url_mapping: Dict[str, UrlValidator] = {
self.overrides.apply_formatter(collection_url.url): collection_url
for collection_url in options.urls.list
}
def _download_parent_thumbnails( def _download_parent_thumbnails(
self, self,
@ -137,11 +133,10 @@ class UrlDownloaderThumbnailPlugin(SourcePluginExtension):
if not self.is_dry_run: if not self.is_dry_run:
try_convert_download_thumbnail(entry=entry) try_convert_download_thumbnail(entry=entry)
if (input_url := entry.get(v.ytdl_sub_input_url, str)) in self._collection_url_mapping: self._download_url_thumbnails(
self._download_url_thumbnails( collection_url=self.plugin_options.urls.list[entry.get(v.ytdl_sub_input_url_index, int)],
collection_url=self._collection_url_mapping[input_url], entry=entry,
entry=entry, )
)
return entry return entry
@ -158,25 +153,12 @@ class UrlDownloaderCollectionVariablePlugin(SourcePluginExtension):
enhanced_download_archive=enhanced_download_archive, enhanced_download_archive=enhanced_download_archive,
) )
self._thumbnails_downloaded: Set[str] = set() self._thumbnails_downloaded: Set[str] = set()
self._collection_url_mapping: Dict[str, UrlValidator] = {
self.overrides.apply_formatter(collection_url.url): collection_url
for collection_url in options.urls.list
}
def modify_entry_metadata(self, entry: Entry) -> Optional[Entry]: def modify_entry_metadata(self, entry: Entry) -> Optional[Entry]:
""" """
Add collection variables to the entry Add collection variables to the entry
""" """
# COLLECTION_URL is a recent variable that may not exist for old entries when updating. collection_url = self.plugin_options.urls.list[entry.get(v.ytdl_sub_input_url_index, int)]
# Try to use source_webpage_url if it does not exist
entry_collection_url = entry.get(v.ytdl_sub_input_url, str)
# If the collection URL cannot find its mapping, use the last URL
collection_url = (
self._collection_url_mapping.get(entry_collection_url)
or list(self._collection_url_mapping.values())[-1]
)
entry.add(collection_url.variables.dict_with_format_strings) entry.add(collection_url.variables.dict_with_format_strings)
return entry return entry
@ -232,12 +214,8 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
) )
self._downloaded_entries: Set[str] = set() self._downloaded_entries: Set[str] = set()
self._url_state: Optional[URLDownloadState] = None self._url_state: Optional[URLDownloadState] = None
self._collection_url_mapping: Dict[str, UrlValidator] = {
self.overrides.apply_formatter(collection_url.url): collection_url
for collection_url in options.urls.list
}
def download_ytdl_options(self, url: Optional[str] = None) -> Dict: def download_ytdl_options(self, url_idx: Optional[int] = None) -> Dict:
""" """
Returns Returns
------- -------
@ -246,17 +224,12 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
return ( return (
self._download_ytdl_options_builder.clone() self._download_ytdl_options_builder.clone()
.add(self.ytdl_option_defaults(), before=True) .add(self.ytdl_option_defaults(), before=True)
.add(self._collection_url_mapping[url].ytdl_options.dict if url else None, before=True) .add(self.plugin_options.urls.list[url_idx].ytdl_options.dict if url_idx is not None else None, before=True)
.to_dict() .to_dict()
) )
def metadata_ytdl_options(self, url: Optional[str] = None) -> Dict: def metadata_ytdl_options(self, ytdl_option_overrides: Dict) -> Dict:
""" """
Parameters
----------
url
To fetch the URL specific ytdl_options
Returns Returns
------- -------
YTDL options dict for fetching metadata YTDL options dict for fetching metadata
@ -265,7 +238,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
return ( return (
self._metadata_ytdl_options_builder.clone() self._metadata_ytdl_options_builder.clone()
.add(self.ytdl_option_defaults(), before=True) .add(self.ytdl_option_defaults(), before=True)
.add(self._collection_url_mapping[url].ytdl_options.dict if url else None, before=True) .add(ytdl_option_overrides, before=True)
.to_dict() .to_dict()
) )
@ -287,11 +260,6 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
""" """
return self.download_ytdl_options().get("writethumbnail", False) return self.download_ytdl_options().get("writethumbnail", False)
def _get_url_options(self, url: Optional[str]) -> Dict:
if url:
return self._collection_url_mapping[url].ytdl_options.dict
return {}
############################################################################################### ###############################################################################################
# DOWNLOAD FUNCTIONS # DOWNLOAD FUNCTIONS
@ -353,7 +321,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
def _extract_entry_info_with_retry(self, entry: Entry) -> Entry: def _extract_entry_info_with_retry(self, entry: Entry) -> Entry:
download_entry_dict = YTDLP.extract_info_with_retry( download_entry_dict = YTDLP.extract_info_with_retry(
ytdl_options_overrides=self.download_ytdl_options( ytdl_options_overrides=self.download_ytdl_options(
url=entry.get(v.ytdl_sub_input_url, str) url_idx=entry.get(v.ytdl_sub_input_url_index, int)
), ),
is_downloaded_fn=None if self.is_dry_run else entry.is_downloaded, is_downloaded_fn=None if self.is_dry_run else entry.is_downloaded,
is_thumbnail_downloaded_fn=None is_thumbnail_downloaded_fn=None
@ -459,15 +427,17 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
): ):
yield orphan yield orphan
def _download_metadata(self, url: str) -> Iterable[Entry]: def _download_metadata(self, url: str, validator: UrlValidator) -> Iterable[Entry]:
metadata_ytdl_options = self.metadata_ytdl_options(url=url) metadata_ytdl_options = self.metadata_ytdl_options(
ytdl_option_overrides=validator.ytdl_options.dict
)
download_reversed = ScriptUtils.bool_formatter_output( download_reversed = ScriptUtils.bool_formatter_output(
self.overrides.apply_formatter(self._collection_url_mapping[url].download_reverse) self.overrides.apply_formatter(validator.download_reverse)
) )
parents, orphan_entries = self._download_url_metadata( parents, orphan_entries = self._download_url_metadata(
url=url, url=url,
include_sibling_metadata=self._collection_url_mapping[url].include_sibling_metadata, include_sibling_metadata=validator.include_sibling_metadata,
ytdl_options_overrides=metadata_ytdl_options, ytdl_options_overrides=metadata_ytdl_options,
) )
@ -482,18 +452,22 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
orphans=orphan_entries, orphans=orphan_entries,
download_reversed=download_reversed, download_reversed=download_reversed,
): ):
entry.initialize_script(self.overrides).add({v.ytdl_sub_input_url: url})
yield entry yield entry
def download_metadata(self) -> Iterable[Entry]: def download_metadata(self) -> Iterable[Entry]:
"""The function to perform the download of all media entries""" """The function to perform the download of all media entries"""
# download the bottom-most urls first since they are top-priority # download the bottom-most urls first since they are top-priority
for collection_url in reversed(self.collection.urls.list): for idx, url_validator in reversed(list(enumerate(self.collection.urls.list))):
# URLs can be empty. If they are, then skip # URLs can be empty. If they are, then skip
if not (url := self.overrides.apply_formatter(collection_url.url)): if not (url := self.overrides.apply_formatter(url_validator.url)):
continue continue
for entry in self._download_metadata(url=url): for entry in self._download_metadata(url=url, validator=url_validator):
entry.initialize_script(self.overrides).add({
v.ytdl_sub_input_url: url,
v.ytdl_sub_input_url_index: idx,
})
yield entry yield entry
def download(self, entry: Entry) -> Optional[Entry]: def download(self, entry: Entry) -> Optional[Entry]:

View file

@ -750,6 +750,14 @@ class YtdlSubVariableDefinitions(ABC):
""" """
return StringVariable(variable_name="ytdl_sub_input_url", definition="{ %string('') }") return StringVariable(variable_name="ytdl_sub_input_url", definition="{ %string('') }")
@cached_property
def ytdl_sub_input_url_index(self: "VariableDefinitions") -> IntegerVariable:
"""
:description:
The index of the input URL as defined in the subscription, top-most being the 0th index.
"""
return IntegerVariable(variable_name="ytdl_sub_input_url_index", definition="{ %int(0) }")
@cached_property @cached_property
def download_index(self: "VariableDefinitions") -> IntegerVariable: def download_index(self: "VariableDefinitions") -> IntegerVariable:
""" """

View file

@ -335,10 +335,7 @@ presets:
# multi-url with bilateral scraping built into it via # multi-url with bilateral scraping built into it via
# inspection of the URL and conditionally adding another # inspection of the URL and conditionally adding another
# ytdl-sub url download with the scraping and download reversed # ytdl-sub url download with the scraping and download reversed
_multi_url_bilateral: _multi_url_bilateral_inner:
preset:
- "_multi_url"
overrides: overrides:
enable_bilateral_scraping: True enable_bilateral_scraping: True
"%is_bilateral_url": >- "%is_bilateral_url": >-
@ -359,400 +356,405 @@ presets:
- url: "{ %bilateral_url(url) }" - url: "{ %bilateral_url(url) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url2) }" - url: "{ %bilateral_url(url2) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url3) }" - url: "{ %bilateral_url(url3) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url4) }" - url: "{ %bilateral_url(url4) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url5) }" - url: "{ %bilateral_url(url5) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url6) }" - url: "{ %bilateral_url(url6) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url7) }" - url: "{ %bilateral_url(url7) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url8) }" - url: "{ %bilateral_url(url8) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url9) }" - url: "{ %bilateral_url(url9) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url10) }" - url: "{ %bilateral_url(url10) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url11) }" - url: "{ %bilateral_url(url11) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url12) }" - url: "{ %bilateral_url(url12) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url13) }" - url: "{ %bilateral_url(url13) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url14) }" - url: "{ %bilateral_url(url14) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url15) }" - url: "{ %bilateral_url(url15) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url16) }" - url: "{ %bilateral_url(url16) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url17) }" - url: "{ %bilateral_url(url17) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url18) }" - url: "{ %bilateral_url(url18) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url19) }" - url: "{ %bilateral_url(url19) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url20) }" - url: "{ %bilateral_url(url20) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url21) }" - url: "{ %bilateral_url(url21) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url22) }" - url: "{ %bilateral_url(url22) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url23) }" - url: "{ %bilateral_url(url23) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url24) }" - url: "{ %bilateral_url(url24) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url25) }" - url: "{ %bilateral_url(url25) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url26) }" - url: "{ %bilateral_url(url26) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url27) }" - url: "{ %bilateral_url(url27) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url28) }" - url: "{ %bilateral_url(url28) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url29) }" - url: "{ %bilateral_url(url29) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url30) }" - url: "{ %bilateral_url(url30) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url31) }" - url: "{ %bilateral_url(url31) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url32) }" - url: "{ %bilateral_url(url32) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url33) }" - url: "{ %bilateral_url(url33) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url34) }" - url: "{ %bilateral_url(url34) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url35) }" - url: "{ %bilateral_url(url35) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url36) }" - url: "{ %bilateral_url(url36) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url37) }" - url: "{ %bilateral_url(url37) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url38) }" - url: "{ %bilateral_url(url38) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url39) }" - url: "{ %bilateral_url(url39) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url40) }" - url: "{ %bilateral_url(url40) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url41) }" - url: "{ %bilateral_url(url41) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url42) }" - url: "{ %bilateral_url(url42) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url43) }" - url: "{ %bilateral_url(url43) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url44) }" - url: "{ %bilateral_url(url44) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url45) }" - url: "{ %bilateral_url(url45) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url46) }" - url: "{ %bilateral_url(url46) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url47) }" - url: "{ %bilateral_url(url47) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url48) }" - url: "{ %bilateral_url(url48) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url49) }" - url: "{ %bilateral_url(url49) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url50) }" - url: "{ %bilateral_url(url50) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url51) }" - url: "{ %bilateral_url(url51) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url52) }" - url: "{ %bilateral_url(url52) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url53) }" - url: "{ %bilateral_url(url53) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url54) }" - url: "{ %bilateral_url(url54) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url55) }" - url: "{ %bilateral_url(url55) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url56) }" - url: "{ %bilateral_url(url56) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url57) }" - url: "{ %bilateral_url(url57) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url58) }" - url: "{ %bilateral_url(url58) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url59) }" - url: "{ %bilateral_url(url59) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url60) }" - url: "{ %bilateral_url(url60) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url61) }" - url: "{ %bilateral_url(url61) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url62) }" - url: "{ %bilateral_url(url62) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url63) }" - url: "{ %bilateral_url(url63) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url64) }" - url: "{ %bilateral_url(url64) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url65) }" - url: "{ %bilateral_url(url65) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url66) }" - url: "{ %bilateral_url(url66) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url67) }" - url: "{ %bilateral_url(url67) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url68) }" - url: "{ %bilateral_url(url68) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url69) }" - url: "{ %bilateral_url(url69) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url70) }" - url: "{ %bilateral_url(url70) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url71) }" - url: "{ %bilateral_url(url71) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url72) }" - url: "{ %bilateral_url(url72) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url73) }" - url: "{ %bilateral_url(url73) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url74) }" - url: "{ %bilateral_url(url74) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url75) }" - url: "{ %bilateral_url(url75) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url76) }" - url: "{ %bilateral_url(url76) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url77) }" - url: "{ %bilateral_url(url77) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url78) }" - url: "{ %bilateral_url(url78) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url79) }" - url: "{ %bilateral_url(url79) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url80) }" - url: "{ %bilateral_url(url80) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url81) }" - url: "{ %bilateral_url(url81) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url82) }" - url: "{ %bilateral_url(url82) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url83) }" - url: "{ %bilateral_url(url83) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url84) }" - url: "{ %bilateral_url(url84) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url85) }" - url: "{ %bilateral_url(url85) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url86) }" - url: "{ %bilateral_url(url86) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url87) }" - url: "{ %bilateral_url(url87) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url88) }" - url: "{ %bilateral_url(url88) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url89) }" - url: "{ %bilateral_url(url89) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url90) }" - url: "{ %bilateral_url(url90) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url91) }" - url: "{ %bilateral_url(url91) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url92) }" - url: "{ %bilateral_url(url92) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url93) }" - url: "{ %bilateral_url(url93) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url94) }" - url: "{ %bilateral_url(url94) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url95) }" - url: "{ %bilateral_url(url95) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url96) }" - url: "{ %bilateral_url(url96) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url97) }" - url: "{ %bilateral_url(url97) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url98) }" - url: "{ %bilateral_url(url98) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url99) }" - url: "{ %bilateral_url(url99) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
- url: "{ %bilateral_url(url100) }" - url: "{ %bilateral_url(url100) }"
download_reverse: True download_reverse: True
ytdl_options: ytdl_options:
playlistreverse: True playlist_items: "-1:0:-1"
_multi_url_bilateral:
preset:
- "_multi_url_bilateral_inner"
- "_multi_url"

View file

@ -267,7 +267,6 @@ class TestPlaylist:
preset_name="bilateral_test", preset_name="bilateral_test",
preset_dict=playlist_bilateral_dict, preset_dict=playlist_bilateral_dict,
) )
transaction_log = playlist_subscription.download(dry_run=True) transaction_log = playlist_subscription.download(dry_run=True)
assert_transaction_log_matches( assert_transaction_log_matches(
output_directory=output_directory, output_directory=output_directory,

View file

@ -2,7 +2,7 @@ import os
import shutil import shutil
from pathlib import Path from pathlib import Path
REGENERATE_FIXTURES: bool = True REGENERATE_FIXTURES: bool = False
RESOURCE_PATH: Path = Path("tests") / "resources" RESOURCE_PATH: Path = Path("tests") / "resources"
_FILE_FIXTURE_PATH: Path = RESOURCE_PATH / "file_fixtures" _FILE_FIXTURE_PATH: Path = RESOURCE_PATH / "file_fixtures"

View file

@ -2,6 +2,8 @@ Files created:
---------------------------------------- ----------------------------------------
{output_directory} {output_directory}
.ytdl-sub-bilateral_test-download-archive.json .ytdl-sub-bilateral_test-download-archive.json
fanart.jpg
poster.jpg
tvshow.nfo tvshow.nfo
NFO tags: NFO tags:
tvshow: tvshow:

View file

@ -1 +1,166 @@
No new, modified, or removed files in '{output_directory}' Files created:
----------------------------------------
{output_directory}/Season 2011
s2011.e022701 - Jesse's Minecraft Server [Trailer - Feb.27]-thumb.jpg
s2011.e022701 - Jesse's Minecraft Server [Trailer - Feb.27].info.json
s2011.e022701 - Jesse's Minecraft Server [Trailer - Feb.27].mp4
Video Tags:
contentRating: TV-14
date: 2011-02-27
episode_id: 22701
genre: ytdl-sub
show: bilateral_test
synopsis:
https://www.youtube.com/watch?v=qPybBrXspds
Website Link:
http://jesseminecraft.webs.com/
All you have to do is read the rules, and fill out a quick, little application to join the Server so we know you read them. We do this to keep the griefers/newbs out, it only takes three minutes, it's not that big of a deal.
Jesse's Minecraft Server is a City Roleplay/Survival Server, there is a currency, public transportation, strict rules for immersive gameplay, and has a decent size population. Over 750 people have logged onto the server. It is very important you read the rules, we don't tolerate idiots.
There are over 200 empty properties that are ready for anyone to own! Join now!
This is the server state as of Feb. 27, 2011.
----------------------------------------------------------------------------------
Texture Pack:
http://www.minecraftforum.net/viewtopic.php?f=25&t=29164
Recording Software:
http://www.fraps.com/download.php
Video Editing Software:
http://explore.live.com/windows-live-movie-maker?os=other
Song:
Given to Fly - Pearl Jam
(Off of the 'Yield' album)
I claim no ownership of this song, all the credit goes to Pearl Jam and their producers.
title: 2011-02-27 - Jesse's Minecraft Server [Trailer - Feb.27]
year: 2011
s2011.e022701 - Jesse's Minecraft Server [Trailer - Feb.27].nfo
NFO tags:
episodedetails:
aired: 2011-02-27
episode: 22701
genre: ytdl-sub
mpaa: TV-14
plot:
https://www.youtube.com/watch?v=qPybBrXspds
Website Link:
http://jesseminecraft.webs.com/
All you have to do is read the rules, and fill out a quick, little application to join the Server so we know you read them. We do this to keep the griefers/newbs out, it only takes three minutes, it's not that big of a deal.
Jesse's Minecraft Server is a City Roleplay/Survival Server, there is a currency, public transportation, strict rules for immersive gameplay, and has a decent size population. Over 750 people have logged onto the server. It is very important you read the rules, we don't tolerate idiots.
There are over 200 empty properties that are ready for anyone to own! Join now!
This is the server state as of Feb. 27, 2011.
----------------------------------------------------------------------------------
Texture Pack:
http://www.minecraftforum.net/viewtopic.php?f=25&t=29164
Recording Software:
http://www.fraps.com/download.php
Video Editing Software:
http://explore.live.com/windows-live-movie-maker?os=other
Song:
Given to Fly - Pearl Jam
(Off of the 'Yield' album)
I claim no ownership of this song, all the credit goes to Pearl Jam and their producers.
season: 2011
title: 2011-02-27 - Jesse's Minecraft Server [Trailer - Feb.27]
year: 2011
s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg
s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].info.json
s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4
Video Tags:
contentRating: TV-14
date: 2011-03-21
episode_id: 32101
genre: ytdl-sub
show: bilateral_test
synopsis:
https://www.youtube.com/watch?v=DBjFvs6HafU
Website Link:
http://jesseminecraft.webs.com/
To get on the whitelist, please look at the website linked above (^^^). Due to the overwhelming amount of people trying to join, I've made it so it costs $2 to become a member through paypal. All of it is explained on the website.
Jesse's Minecraft Server is a City Roleplay/Survival Server, there is a currency, public transportation, strict rules for immersive gameplay, and has a decent size population. Over 1000 people have logged onto the server. It is very important you read the rules, we don't tolerate idiots.
There are over 300 empty properties that are ready for anyone to own! Join now!
This is the server state as of Mar. 21, 2011.
--------------------------------------------------------------------------------­--
Texture Pack:
http://www.minecraftforum.net/viewtopic.php?f=25&t=29164
Recording Software:
http://www.fraps.com/download.php
Video Editing Software:
http://explore.live.com/windows-live-movie-maker?os=other
Song:
Indifference - Pearl Jam
(Off of the 'Vs.' album)
I claim no ownership of this song, all the credit goes to Pearl Jam and their producers.
title: 2011-03-21 - Jesse's Minecraft Server [Trailer - Mar.21]
year: 2011
s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].nfo
NFO tags:
episodedetails:
aired: 2011-03-21
episode: 32101
genre: ytdl-sub
mpaa: TV-14
plot:
https://www.youtube.com/watch?v=DBjFvs6HafU
Website Link:
http://jesseminecraft.webs.com/
To get on the whitelist, please look at the website linked above (^^^). Due to the overwhelming amount of people trying to join, I've made it so it costs $2 to become a member through paypal. All of it is explained on the website.
Jesse's Minecraft Server is a City Roleplay/Survival Server, there is a currency, public transportation, strict rules for immersive gameplay, and has a decent size population. Over 1000 people have logged onto the server. It is very important you read the rules, we don't tolerate idiots.
There are over 300 empty properties that are ready for anyone to own! Join now!
This is the server state as of Mar. 21, 2011.
--------------------------------------------------------------------------------­--
Texture Pack:
http://www.minecraftforum.net/viewtopic.php?f=25&t=29164
Recording Software:
http://www.fraps.com/download.php
Video Editing Software:
http://explore.live.com/windows-live-movie-maker?os=other
Song:
Indifference - Pearl Jam
(Off of the 'Vs.' album)
I claim no ownership of this song, all the credit goes to Pearl Jam and their producers.
season: 2011
title: 2011-03-21 - Jesse's Minecraft Server [Trailer - Mar.21]
year: 2011
Files modified:
----------------------------------------
{output_directory}
.ytdl-sub-bilateral_test-download-archive.json