playlist bilateral working :o
This commit is contained in:
parent
bbed76fb7c
commit
d7bb8d21f1
7 changed files with 307 additions and 157 deletions
|
|
@ -55,10 +55,6 @@ class UrlDownloaderThumbnailPlugin(SourcePluginExtension):
|
|||
enhanced_download_archive=enhanced_download_archive,
|
||||
)
|
||||
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(
|
||||
self,
|
||||
|
|
@ -137,11 +133,10 @@ class UrlDownloaderThumbnailPlugin(SourcePluginExtension):
|
|||
if not self.is_dry_run:
|
||||
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(
|
||||
collection_url=self._collection_url_mapping[input_url],
|
||||
entry=entry,
|
||||
)
|
||||
self._download_url_thumbnails(
|
||||
collection_url=self.plugin_options.urls.list[entry.get(v.ytdl_sub_input_url_index, int)],
|
||||
entry=entry,
|
||||
)
|
||||
return entry
|
||||
|
||||
|
||||
|
|
@ -158,25 +153,12 @@ class UrlDownloaderCollectionVariablePlugin(SourcePluginExtension):
|
|||
enhanced_download_archive=enhanced_download_archive,
|
||||
)
|
||||
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]:
|
||||
"""
|
||||
Add collection variables to the entry
|
||||
"""
|
||||
# COLLECTION_URL is a recent variable that may not exist for old entries when updating.
|
||||
# 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]
|
||||
)
|
||||
|
||||
collection_url = self.plugin_options.urls.list[entry.get(v.ytdl_sub_input_url_index, int)]
|
||||
entry.add(collection_url.variables.dict_with_format_strings)
|
||||
|
||||
return entry
|
||||
|
|
@ -232,12 +214,8 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
)
|
||||
self._downloaded_entries: Set[str] = set()
|
||||
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
|
||||
-------
|
||||
|
|
@ -246,17 +224,12 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
return (
|
||||
self._download_ytdl_options_builder.clone()
|
||||
.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()
|
||||
)
|
||||
|
||||
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
|
||||
-------
|
||||
YTDL options dict for fetching metadata
|
||||
|
|
@ -265,7 +238,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
return (
|
||||
self._metadata_ytdl_options_builder.clone()
|
||||
.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()
|
||||
)
|
||||
|
||||
|
|
@ -287,11 +260,6 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
"""
|
||||
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
|
||||
|
||||
|
|
@ -353,7 +321,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
def _extract_entry_info_with_retry(self, entry: Entry) -> Entry:
|
||||
download_entry_dict = YTDLP.extract_info_with_retry(
|
||||
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_thumbnail_downloaded_fn=None
|
||||
|
|
@ -459,15 +427,17 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
):
|
||||
yield orphan
|
||||
|
||||
def _download_metadata(self, url: str) -> Iterable[Entry]:
|
||||
metadata_ytdl_options = self.metadata_ytdl_options(url=url)
|
||||
def _download_metadata(self, url: str, validator: UrlValidator) -> Iterable[Entry]:
|
||||
metadata_ytdl_options = self.metadata_ytdl_options(
|
||||
ytdl_option_overrides=validator.ytdl_options.dict
|
||||
)
|
||||
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(
|
||||
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,
|
||||
)
|
||||
|
||||
|
|
@ -482,18 +452,22 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]):
|
|||
orphans=orphan_entries,
|
||||
download_reversed=download_reversed,
|
||||
):
|
||||
entry.initialize_script(self.overrides).add({v.ytdl_sub_input_url: url})
|
||||
yield entry
|
||||
|
||||
def download_metadata(self) -> Iterable[Entry]:
|
||||
"""The function to perform the download of all media entries"""
|
||||
# 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
|
||||
if not (url := self.overrides.apply_formatter(collection_url.url)):
|
||||
if not (url := self.overrides.apply_formatter(url_validator.url)):
|
||||
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
|
||||
|
||||
def download(self, entry: Entry) -> Optional[Entry]:
|
||||
|
|
|
|||
|
|
@ -750,6 +750,14 @@ class YtdlSubVariableDefinitions(ABC):
|
|||
"""
|
||||
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
|
||||
def download_index(self: "VariableDefinitions") -> IntegerVariable:
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -335,10 +335,7 @@ presets:
|
|||
# multi-url with bilateral scraping built into it via
|
||||
# inspection of the URL and conditionally adding another
|
||||
# ytdl-sub url download with the scraping and download reversed
|
||||
_multi_url_bilateral:
|
||||
preset:
|
||||
- "_multi_url"
|
||||
|
||||
_multi_url_bilateral_inner:
|
||||
overrides:
|
||||
enable_bilateral_scraping: True
|
||||
"%is_bilateral_url": >-
|
||||
|
|
@ -359,400 +356,405 @@ presets:
|
|||
- url: "{ %bilateral_url(url) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url2) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url3) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url4) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url5) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url6) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url7) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url8) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url9) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url10) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url11) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url12) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url13) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url14) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url15) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url16) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url17) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url18) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url19) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url20) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url21) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url22) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url23) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url24) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url25) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url26) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url27) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url28) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url29) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url30) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url31) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url32) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url33) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url34) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url35) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url36) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url37) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url38) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url39) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url40) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url41) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url42) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url43) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url44) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url45) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url46) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url47) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url48) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url49) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url50) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url51) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url52) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url53) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url54) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url55) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url56) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url57) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url58) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url59) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url60) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url61) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url62) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url63) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url64) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url65) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url66) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url67) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url68) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url69) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url70) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url71) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url72) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url73) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url74) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url75) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url76) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url77) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url78) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url79) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url80) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url81) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url82) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url83) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url84) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url85) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url86) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url87) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url88) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url89) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url90) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url91) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url92) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url93) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url94) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url95) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url96) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url97) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url98) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url99) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
- url: "{ %bilateral_url(url100) }"
|
||||
download_reverse: True
|
||||
ytdl_options:
|
||||
playlistreverse: True
|
||||
playlist_items: "-1:0:-1"
|
||||
|
||||
_multi_url_bilateral:
|
||||
preset:
|
||||
- "_multi_url_bilateral_inner"
|
||||
- "_multi_url"
|
||||
|
|
@ -267,7 +267,6 @@ class TestPlaylist:
|
|||
preset_name="bilateral_test",
|
||||
preset_dict=playlist_bilateral_dict,
|
||||
)
|
||||
|
||||
transaction_log = playlist_subscription.download(dry_run=True)
|
||||
assert_transaction_log_matches(
|
||||
output_directory=output_directory,
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import os
|
|||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
REGENERATE_FIXTURES: bool = True
|
||||
REGENERATE_FIXTURES: bool = False
|
||||
|
||||
RESOURCE_PATH: Path = Path("tests") / "resources"
|
||||
_FILE_FIXTURE_PATH: Path = RESOURCE_PATH / "file_fixtures"
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ Files created:
|
|||
----------------------------------------
|
||||
{output_directory}
|
||||
.ytdl-sub-bilateral_test-download-archive.json
|
||||
fanart.jpg
|
||||
poster.jpg
|
||||
tvshow.nfo
|
||||
NFO tags:
|
||||
tvshow:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in a new issue