From fe83266e446afe27212aa49f13c18e80e9abf67b Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Fri, 29 Mar 2024 00:23:39 -0700 Subject: [PATCH] bilateral --- src/ytdl_sub/downloaders/url/downloader.py | 123 +++-- src/ytdl_sub/downloaders/url/validators.py | 28 +- .../entries/script/custom_functions.py | 50 +- .../prebuilt_presets/helpers/url.yaml | 500 +++++++----------- .../prebuilt_presets/tv_show/tv_show.yaml | 200 +++---- .../tv_show/tv_show_collection.yaml | 200 +++---- 6 files changed, 483 insertions(+), 618 deletions(-) diff --git a/src/ytdl_sub/downloaders/url/downloader.py b/src/ytdl_sub/downloaders/url/downloader.py index 473fecbb..1f61ed6b 100644 --- a/src/ytdl_sub/downloaders/url/downloader.py +++ b/src/ytdl_sub/downloaders/url/downloader.py @@ -232,9 +232,12 @@ 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 + } - @property - def download_ytdl_options(self) -> Dict: + def download_ytdl_options(self, url: Optional[str] = None) -> Dict: """ Returns ------- @@ -243,24 +246,26 @@ 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) .to_dict() ) - def metadata_ytdl_options(self, scrape_reverse: bool) -> Dict: + def metadata_ytdl_options(self, url: Optional[str] = None) -> Dict: """ Parameters ---------- - scrape_reverse - Whether to scrape in reverse order + url + To fetch the URL specific ytdl_options Returns ------- YTDL options dict for fetching metadata """ + return ( self._metadata_ytdl_options_builder.clone() .add(self.ytdl_option_defaults(), before=True) - .add({"playlistreverse": scrape_reverse} if scrape_reverse else None, before=True) + .add(self._collection_url_mapping[url].ytdl_options.dict if url else None, before=True) .to_dict() ) @@ -271,7 +276,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): ------- True if dry-run is enabled. False otherwise. """ - return self.download_ytdl_options.get("skip_download", False) + return self.download_ytdl_options().get("skip_download", False) @property def is_entry_thumbnails_enabled(self) -> bool: @@ -280,7 +285,12 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): ------- True if entry thumbnails should be downloaded. False otherwise. """ - 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 @@ -307,7 +317,7 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): clear_info_json_files Whether to delete info.json files after yield """ - archive_path = self.download_ytdl_options.get("download_archive", "") + archive_path = self.download_ytdl_options().get("download_archive", "") backup_archive_path = f"{archive_path}.backup" # If archive path exists, maintain download archive is enable @@ -342,7 +352,9 @@ 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, + ytdl_options_overrides=self.download_ytdl_options( + url=entry.get(v.ytdl_sub_input_url, str) + ), is_downloaded_fn=None if self.is_dry_run else entry.is_downloaded, is_thumbnail_downloaded_fn=None if (self.is_dry_run or not self.is_entry_thumbnails_enabled) @@ -358,27 +370,29 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): self, entries: List[Entry], download_reversed: bool ) -> Iterator[Entry]: # Iterate a list of entries, and delete the entries after yielding - indices = list(range(len(entries))) + entries_to_iter: List[Optional[Entry]] = entries + + indices = list(range(len(entries_to_iter))) if download_reversed: indices = reversed(indices) for idx in indices: self._url_state.entries_downloaded += 1 - if self._is_downloaded(entries[idx]): + if self._is_downloaded(entries_to_iter[idx]): download_logger.info( "Already downloaded entry %d/%d: %s", self._url_state.entries_downloaded, self._url_state.entries_total, - entries[idx].title, + entries_to_iter[idx].title, ) - del entries[idx] + entries_to_iter[idx] = None continue - yield entries[idx] - self._mark_downloaded(entries[idx]) + yield entries_to_iter[idx] + self._mark_downloaded(entries_to_iter[idx]) - del entries[idx] + del entries_to_iter[idx] def _iterate_parent_entry( self, parent: EntryParent, download_reversed: bool @@ -396,16 +410,15 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): yield entry_child def _download_url_metadata( - self, url: str, include_sibling_metadata: bool, scrape_reverse: bool + self, url: str, include_sibling_metadata: bool, ytdl_options_overrides: Dict ) -> Tuple[List[EntryParent], List[Entry]]: """ Downloads only info.json files and forms EntryParent trees """ - with self._separate_download_archives(): entry_dicts = YTDLP.extract_info_via_info_json( working_directory=self.working_directory, - ytdl_options_overrides=self.metadata_ytdl_options(scrape_reverse=scrape_reverse), + ytdl_options_overrides=ytdl_options_overrides, log_prefix_on_info_json_dl="Downloading metadata for", url=url, ) @@ -446,6 +459,43 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): ): yield orphan + def _download_metadata(self, url: str, is_bilateral: bool) -> Iterable[Entry]: + metadata_ytdl_options = self.metadata_ytdl_options(url=url) + download_reversed = ScriptUtils.bool_formatter_output( + self.overrides.apply_formatter(self._collection_url_mapping[url].download_reverse) + ) + if is_bilateral: + # If bilateral metadata scrape, inverse to download the other side + metadata_ytdl_options = dict( + metadata_ytdl_options, + **{"playlistreverse": not metadata_ytdl_options.get("playlistreverse", False)}, + ) + download_reversed = not download_reversed + + parents, orphan_entries = self._download_url_metadata( + url=url, + include_sibling_metadata=self._collection_url_mapping[url].include_sibling_metadata, + ytdl_options_overrides=metadata_ytdl_options, + ) + + # TODO: Encapsulate this logic into its own class + self._url_state = URLDownloadState( + entries_total=sum(parent.num_children() for parent in parents) + len(orphan_entries) + ) + + if is_bilateral: + download_logger.info("Beginning downloads for %s in the opposite direction", url) + else: + download_logger.info("Beginning downloads for %s", url) + + for entry in self._iterate_entries( + parents=parents, + 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 @@ -454,34 +504,15 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): if not (url := self.overrides.apply_formatter(collection_url.url)): continue - parents, orphan_entries = self._download_url_metadata( - url=url, - include_sibling_metadata=collection_url.include_sibling_metadata, - scrape_reverse=ScriptUtils.bool_formatter_output( - self.overrides.apply_formatter(collection_url.scrape_reverse) - ), - ) - - # TODO: Encapsulate this logic into its own class - self._url_state = URLDownloadState( - entries_total=sum(parent.num_children() for parent in parents) + len(orphan_entries) - ) - - download_logger.info( - "Beginning downloads for %s", self.overrides.apply_formatter(collection_url.url) - ) - for entry in self._iterate_entries( - parents=parents, - orphans=orphan_entries, - download_reversed=ScriptUtils.bool_formatter_output( - self.overrides.apply_formatter(collection_url.download_reverse) - ), - ): - entry.initialize_script(self.overrides).add( - {v.ytdl_sub_input_url: self.overrides.apply_formatter(collection_url.url)} - ) + for entry in self._download_metadata(url=url, is_bilateral=False): yield entry + if ScriptUtils.bool_formatter_output( + self.overrides.apply_formatter(collection_url.extract_bilaterally) + ): + for entry in self._download_metadata(url=url, is_bilateral=True): + yield entry + def download(self, entry: Entry) -> Optional[Entry]: """ Parameters diff --git a/src/ytdl_sub/downloaders/url/validators.py b/src/ytdl_sub/downloaders/url/validators.py index 38fc00ab..a324015b 100644 --- a/src/ytdl_sub/downloaders/url/validators.py +++ b/src/ytdl_sub/downloaders/url/validators.py @@ -4,6 +4,7 @@ from typing import Optional from typing import Set from ytdl_sub.config.plugin.plugin_operation import PluginOperation +from ytdl_sub.config.preset_options import YTDLOptions from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.script.parser import parse from ytdl_sub.validators.strict_dict_validator import StrictDictValidator @@ -50,7 +51,8 @@ class UrlValidator(StrictDictValidator): "source_thumbnails", "playlist_thumbnails", "download_reverse", - "scrape_reverse", + "extract_bilaterally", + "ytdl_options", "include_sibling_metadata", } @@ -81,8 +83,11 @@ class UrlValidator(StrictDictValidator): self._download_reverse = self._validate_key( key="download_reverse", validator=OverridesBooleanFormatterValidator, default="True" ) - self._scrape_reverse = self._validate_key( - key="scrape_reverse", validator=OverridesBooleanFormatterValidator, default="False" + self._extract_bilaterally = self._validate_key( + key="extract_bilaterally", validator=OverridesBooleanFormatterValidator, default="False" + ) + self._ytdl_options = self._validate_key( + key="ytdl_options", validator=YTDLOptions, default={} ) self._include_sibling_metadata = self._validate_key( key="include_sibling_metadata", validator=BoolValidator, default=False @@ -161,12 +166,21 @@ class UrlValidator(StrictDictValidator): return self._download_reverse @property - def scrape_reverse(self) -> OverridesBooleanFormatterValidator: + def extract_bilaterally(self) -> OverridesBooleanFormatterValidator: """ - Optional. Whether to scrape entry metadata in the reverse order. - Defaults to False. + Optional. If True, will extract metadata from both the beginning and end of the playlist. + This is for incrementally fetching new entries that may be added at either the beginning + or the end of a playlist. Defaults to False. """ - return self._scrape_reverse + return self._extract_bilaterally + + @property + def ytdl_options(self) -> YTDLOptions: + """ + Optional. ``ytdl_options`` that only apply to this URL. These take precedence + over the plugin ``ytdl_options``. + """ + return self._ytdl_options @property def include_sibling_metadata(self) -> bool: diff --git a/src/ytdl_sub/entries/script/custom_functions.py b/src/ytdl_sub/entries/script/custom_functions.py index 17150791..23d30381 100644 --- a/src/ytdl_sub/entries/script/custom_functions.py +++ b/src/ytdl_sub/entries/script/custom_functions.py @@ -1,10 +1,8 @@ import os import posixpath -from typing import List from yt_dlp.utils import sanitize_filename -from ytdl_sub.downloaders.ytdlp import YTDLP from ytdl_sub.script.functions import Functions from ytdl_sub.script.types.map import Map from ytdl_sub.script.types.resolvable import AnyArgument @@ -25,54 +23,16 @@ _days_in_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] class CustomFunctions: @staticmethod - def is_playlist_ordered_by_newest(url: String) -> Boolean: + def is_bilateral_playlist_url(url: String) -> Boolean: """ - Queries a playlist-based URL using yt-dlp to see if it is ordered from newest - (lower playlist number) to oldest. + Heuristic that returns True if the URL is known to be bilateral, meaning that entries can + be added to the beginning or end. """ # Top-level allow-list of notorious URLs that can be # ordered in either direction if "youtube.com/playlist" not in url.value: return Boolean(True) - - info_only_kwargs = { - "skip_download": True, - "writethumbnail": False, - "writeinfojson": False, - "ignoreerrors": True, - "extract_flat": "discard", - "playlist_items": "0:5", - } - try: - url_info = YTDLP.extract_info( - ytdl_options_overrides=info_only_kwargs, - url=url.value, - ) - - if ( - not isinstance(url_info, dict) - or not isinstance(url_info.get("entries"), list) - or len(url_info["entries"]) == 0 - ): - return Boolean(True) - - upload_dates: List[str] = [] - for entry in url_info["entries"]: - if entry.get("uploader_id") and entry.get("url"): - full_entry = YTDLP.extract_info( - ytdl_options_overrides=info_only_kwargs, url=entry.get("url") - ) - if isinstance(full_entry.get("upload_date"), str): - upload_dates.append(full_entry["upload_date"]) - - for idx in range(1, len(upload_dates)): - if upload_dates[idx - 1] < upload_dates[idx]: - return Boolean(False) - - return Boolean(True) - - except Exception: # pylint: disable=broad-except - return Boolean(True) + return Boolean(False) @staticmethod def legacy_bracket_safety(value: ReturnableArgument) -> ReturnableArgument: @@ -223,7 +183,7 @@ class CustomFunctions: Register Custom functions once and only once """ if not Functions.is_built_in("sanitize"): - Functions.register_function(CustomFunctions.is_playlist_ordered_by_newest) + Functions.register_function(CustomFunctions.is_bilateral_playlist_url) Functions.register_function(CustomFunctions.legacy_bracket_safety) Functions.register_function(CustomFunctions.truncate_filepath_if_too_long) Functions.register_function(CustomFunctions.to_native_filepath) diff --git a/src/ytdl_sub/prebuilt_presets/helpers/url.yaml b/src/ytdl_sub/prebuilt_presets/helpers/url.yaml index 48af0941..4221b69a 100644 --- a/src/ytdl_sub/prebuilt_presets/helpers/url.yaml +++ b/src/ytdl_sub/prebuilt_presets/helpers/url.yaml @@ -15,8 +15,7 @@ presets: _multi_url: download: - url: "{url}" - scrape_reverse: "{%not( url_ordered_by_newest )}" - download_reverse: "url_ordered_by_newest" + extract_bilaterally: "url_extract_bilaterally" playlist_thumbnails: - name: "{avatar_uncropped_thumbnail_file_name}" uid: "avatar_uncropped" @@ -28,302 +27,203 @@ presets: - name: "{banner_uncropped_thumbnail_file_name}" uid: "banner_uncropped" - url: "{url2}" - scrape_reverse: "{%not( url2_ordered_by_newest )}" - download_reverse: "url2_ordered_by_newest" + extract_bilaterally: "url2_extract_bilaterally" - url: "{url3}" - scrape_reverse: "{%not( url3_ordered_by_newest )}" - download_reverse: "url3_ordered_by_newest" + extract_bilaterally: "url3_extract_bilaterally" - url: "{url4}" - scrape_reverse: "{%not( url4_ordered_by_newest )}" - download_reverse: "url4_ordered_by_newest" + extract_bilaterally: "url4_extract_bilaterally" - url: "{url5}" - scrape_reverse: "{%not( url5_ordered_by_newest )}" - download_reverse: "url5_ordered_by_newest" + extract_bilaterally: "url5_extract_bilaterally" - url: "{url6}" - scrape_reverse: "{%not( url6_ordered_by_newest )}" - download_reverse: "url6_ordered_by_newest" + extract_bilaterally: "url6_extract_bilaterally" - url: "{url7}" - scrape_reverse: "{%not( url7_ordered_by_newest )}" - download_reverse: "url7_ordered_by_newest" + extract_bilaterally: "url7_extract_bilaterally" - url: "{url8}" - scrape_reverse: "{%not( url8_ordered_by_newest )}" - download_reverse: "url8_ordered_by_newest" + extract_bilaterally: "url8_extract_bilaterally" - url: "{url9}" - scrape_reverse: "{%not( url9_ordered_by_newest )}" - download_reverse: "url9_ordered_by_newest" + extract_bilaterally: "url9_extract_bilaterally" - url: "{url10}" - scrape_reverse: "{%not( url10_ordered_by_newest )}" - download_reverse: "url10_ordered_by_newest" + extract_bilaterally: "url10_extract_bilaterally" - url: "{url11}" - scrape_reverse: "{%not( url11_ordered_by_newest )}" - download_reverse: "url11_ordered_by_newest" + extract_bilaterally: "url11_extract_bilaterally" - url: "{url12}" - scrape_reverse: "{%not( url12_ordered_by_newest )}" - download_reverse: "url12_ordered_by_newest" + extract_bilaterally: "url12_extract_bilaterally" - url: "{url13}" - scrape_reverse: "{%not( url13_ordered_by_newest )}" - download_reverse: "url13_ordered_by_newest" + extract_bilaterally: "url13_extract_bilaterally" - url: "{url14}" - scrape_reverse: "{%not( url14_ordered_by_newest )}" - download_reverse: "url14_ordered_by_newest" + extract_bilaterally: "url14_extract_bilaterally" - url: "{url15}" - scrape_reverse: "{%not( url15_ordered_by_newest )}" - download_reverse: "url15_ordered_by_newest" + extract_bilaterally: "url15_extract_bilaterally" - url: "{url16}" - scrape_reverse: "{%not( url16_ordered_by_newest )}" - download_reverse: "url16_ordered_by_newest" + extract_bilaterally: "url16_extract_bilaterally" - url: "{url17}" - scrape_reverse: "{%not( url17_ordered_by_newest )}" - download_reverse: "url17_ordered_by_newest" + extract_bilaterally: "url17_extract_bilaterally" - url: "{url18}" - scrape_reverse: "{%not( url18_ordered_by_newest )}" - download_reverse: "url18_ordered_by_newest" + extract_bilaterally: "url18_extract_bilaterally" - url: "{url19}" - scrape_reverse: "{%not( url19_ordered_by_newest )}" - download_reverse: "url19_ordered_by_newest" + extract_bilaterally: "url19_extract_bilaterally" - url: "{url20}" - scrape_reverse: "{%not( url20_ordered_by_newest )}" - download_reverse: "url20_ordered_by_newest" + extract_bilaterally: "url20_extract_bilaterally" - url: "{url21}" - scrape_reverse: "{%not( url21_ordered_by_newest )}" - download_reverse: "url21_ordered_by_newest" + extract_bilaterally: "url21_extract_bilaterally" - url: "{url22}" - scrape_reverse: "{%not( url22_ordered_by_newest )}" - download_reverse: "url22_ordered_by_newest" + extract_bilaterally: "url22_extract_bilaterally" - url: "{url23}" - scrape_reverse: "{%not( url23_ordered_by_newest )}" - download_reverse: "url23_ordered_by_newest" + extract_bilaterally: "url23_extract_bilaterally" - url: "{url24}" - scrape_reverse: "{%not( url24_ordered_by_newest )}" - download_reverse: "url24_ordered_by_newest" + extract_bilaterally: "url24_extract_bilaterally" - url: "{url25}" - scrape_reverse: "{%not( url25_ordered_by_newest )}" - download_reverse: "url25_ordered_by_newest" + extract_bilaterally: "url25_extract_bilaterally" - url: "{url26}" - scrape_reverse: "{%not( url26_ordered_by_newest )}" - download_reverse: "url26_ordered_by_newest" + extract_bilaterally: "url26_extract_bilaterally" - url: "{url27}" - scrape_reverse: "{%not( url27_ordered_by_newest )}" - download_reverse: "url27_ordered_by_newest" + extract_bilaterally: "url27_extract_bilaterally" - url: "{url28}" - scrape_reverse: "{%not( url28_ordered_by_newest )}" - download_reverse: "url28_ordered_by_newest" + extract_bilaterally: "url28_extract_bilaterally" - url: "{url29}" - scrape_reverse: "{%not( url29_ordered_by_newest )}" - download_reverse: "url29_ordered_by_newest" + extract_bilaterally: "url29_extract_bilaterally" - url: "{url30}" - scrape_reverse: "{%not( url30_ordered_by_newest )}" - download_reverse: "url30_ordered_by_newest" + extract_bilaterally: "url30_extract_bilaterally" - url: "{url31}" - scrape_reverse: "{%not( url31_ordered_by_newest )}" - download_reverse: "url31_ordered_by_newest" + extract_bilaterally: "url31_extract_bilaterally" - url: "{url32}" - scrape_reverse: "{%not( url32_ordered_by_newest )}" - download_reverse: "url32_ordered_by_newest" + extract_bilaterally: "url32_extract_bilaterally" - url: "{url33}" - scrape_reverse: "{%not( url33_ordered_by_newest )}" - download_reverse: "url33_ordered_by_newest" + extract_bilaterally: "url33_extract_bilaterally" - url: "{url34}" - scrape_reverse: "{%not( url34_ordered_by_newest )}" - download_reverse: "url34_ordered_by_newest" + extract_bilaterally: "url34_extract_bilaterally" - url: "{url35}" - scrape_reverse: "{%not( url35_ordered_by_newest )}" - download_reverse: "url35_ordered_by_newest" + extract_bilaterally: "url35_extract_bilaterally" - url: "{url36}" - scrape_reverse: "{%not( url36_ordered_by_newest )}" - download_reverse: "url36_ordered_by_newest" + extract_bilaterally: "url36_extract_bilaterally" - url: "{url37}" - scrape_reverse: "{%not( url37_ordered_by_newest )}" - download_reverse: "url37_ordered_by_newest" + extract_bilaterally: "url37_extract_bilaterally" - url: "{url38}" - scrape_reverse: "{%not( url38_ordered_by_newest )}" - download_reverse: "url38_ordered_by_newest" + extract_bilaterally: "url38_extract_bilaterally" - url: "{url39}" - scrape_reverse: "{%not( url39_ordered_by_newest )}" - download_reverse: "url39_ordered_by_newest" + extract_bilaterally: "url39_extract_bilaterally" - url: "{url40}" - scrape_reverse: "{%not( url40_ordered_by_newest )}" - download_reverse: "url40_ordered_by_newest" + extract_bilaterally: "url40_extract_bilaterally" - url: "{url41}" - scrape_reverse: "{%not( url41_ordered_by_newest )}" - download_reverse: "url41_ordered_by_newest" + extract_bilaterally: "url41_extract_bilaterally" - url: "{url42}" - scrape_reverse: "{%not( url42_ordered_by_newest )}" - download_reverse: "url42_ordered_by_newest" + extract_bilaterally: "url42_extract_bilaterally" - url: "{url43}" - scrape_reverse: "{%not( url43_ordered_by_newest )}" - download_reverse: "url43_ordered_by_newest" + extract_bilaterally: "url43_extract_bilaterally" - url: "{url44}" - scrape_reverse: "{%not( url44_ordered_by_newest )}" - download_reverse: "url44_ordered_by_newest" + extract_bilaterally: "url44_extract_bilaterally" - url: "{url45}" - scrape_reverse: "{%not( url45_ordered_by_newest )}" - download_reverse: "url45_ordered_by_newest" + extract_bilaterally: "url45_extract_bilaterally" - url: "{url46}" - scrape_reverse: "{%not( url46_ordered_by_newest )}" - download_reverse: "url46_ordered_by_newest" + extract_bilaterally: "url46_extract_bilaterally" - url: "{url47}" - scrape_reverse: "{%not( url47_ordered_by_newest )}" - download_reverse: "url47_ordered_by_newest" + extract_bilaterally: "url47_extract_bilaterally" - url: "{url48}" - scrape_reverse: "{%not( url48_ordered_by_newest )}" - download_reverse: "url48_ordered_by_newest" + extract_bilaterally: "url48_extract_bilaterally" - url: "{url49}" - scrape_reverse: "{%not( url49_ordered_by_newest )}" - download_reverse: "url49_ordered_by_newest" + extract_bilaterally: "url49_extract_bilaterally" - url: "{url50}" - scrape_reverse: "{%not( url50_ordered_by_newest )}" - download_reverse: "url50_ordered_by_newest" + extract_bilaterally: "url50_extract_bilaterally" - url: "{url51}" - scrape_reverse: "{%not( url51_ordered_by_newest )}" - download_reverse: "url51_ordered_by_newest" + extract_bilaterally: "url51_extract_bilaterally" - url: "{url52}" - scrape_reverse: "{%not( url52_ordered_by_newest )}" - download_reverse: "url52_ordered_by_newest" + extract_bilaterally: "url52_extract_bilaterally" - url: "{url53}" - scrape_reverse: "{%not( url53_ordered_by_newest )}" - download_reverse: "url53_ordered_by_newest" + extract_bilaterally: "url53_extract_bilaterally" - url: "{url54}" - scrape_reverse: "{%not( url54_ordered_by_newest )}" - download_reverse: "url54_ordered_by_newest" + extract_bilaterally: "url54_extract_bilaterally" - url: "{url55}" - scrape_reverse: "{%not( url55_ordered_by_newest )}" - download_reverse: "url55_ordered_by_newest" + extract_bilaterally: "url55_extract_bilaterally" - url: "{url56}" - scrape_reverse: "{%not( url56_ordered_by_newest )}" - download_reverse: "url56_ordered_by_newest" + extract_bilaterally: "url56_extract_bilaterally" - url: "{url57}" - scrape_reverse: "{%not( url57_ordered_by_newest )}" - download_reverse: "url57_ordered_by_newest" + extract_bilaterally: "url57_extract_bilaterally" - url: "{url58}" - scrape_reverse: "{%not( url58_ordered_by_newest )}" - download_reverse: "url58_ordered_by_newest" + extract_bilaterally: "url58_extract_bilaterally" - url: "{url59}" - scrape_reverse: "{%not( url59_ordered_by_newest )}" - download_reverse: "url59_ordered_by_newest" + extract_bilaterally: "url59_extract_bilaterally" - url: "{url60}" - scrape_reverse: "{%not( url60_ordered_by_newest )}" - download_reverse: "url60_ordered_by_newest" + extract_bilaterally: "url60_extract_bilaterally" - url: "{url61}" - scrape_reverse: "{%not( url61_ordered_by_newest )}" - download_reverse: "url61_ordered_by_newest" + extract_bilaterally: "url61_extract_bilaterally" - url: "{url62}" - scrape_reverse: "{%not( url62_ordered_by_newest )}" - download_reverse: "url62_ordered_by_newest" + extract_bilaterally: "url62_extract_bilaterally" - url: "{url63}" - scrape_reverse: "{%not( url63_ordered_by_newest )}" - download_reverse: "url63_ordered_by_newest" + extract_bilaterally: "url63_extract_bilaterally" - url: "{url64}" - scrape_reverse: "{%not( url64_ordered_by_newest )}" - download_reverse: "url64_ordered_by_newest" + extract_bilaterally: "url64_extract_bilaterally" - url: "{url65}" - scrape_reverse: "{%not( url65_ordered_by_newest )}" - download_reverse: "url65_ordered_by_newest" + extract_bilaterally: "url65_extract_bilaterally" - url: "{url66}" - scrape_reverse: "{%not( url66_ordered_by_newest )}" - download_reverse: "url66_ordered_by_newest" + extract_bilaterally: "url66_extract_bilaterally" - url: "{url67}" - scrape_reverse: "{%not( url67_ordered_by_newest )}" - download_reverse: "url67_ordered_by_newest" + extract_bilaterally: "url67_extract_bilaterally" - url: "{url68}" - scrape_reverse: "{%not( url68_ordered_by_newest )}" - download_reverse: "url68_ordered_by_newest" + extract_bilaterally: "url68_extract_bilaterally" - url: "{url69}" - scrape_reverse: "{%not( url69_ordered_by_newest )}" - download_reverse: "url69_ordered_by_newest" + extract_bilaterally: "url69_extract_bilaterally" - url: "{url70}" - scrape_reverse: "{%not( url70_ordered_by_newest )}" - download_reverse: "url70_ordered_by_newest" + extract_bilaterally: "url70_extract_bilaterally" - url: "{url71}" - scrape_reverse: "{%not( url71_ordered_by_newest )}" - download_reverse: "url71_ordered_by_newest" + extract_bilaterally: "url71_extract_bilaterally" - url: "{url72}" - scrape_reverse: "{%not( url72_ordered_by_newest )}" - download_reverse: "url72_ordered_by_newest" + extract_bilaterally: "url72_extract_bilaterally" - url: "{url73}" - scrape_reverse: "{%not( url73_ordered_by_newest )}" - download_reverse: "url73_ordered_by_newest" + extract_bilaterally: "url73_extract_bilaterally" - url: "{url74}" - scrape_reverse: "{%not( url74_ordered_by_newest )}" - download_reverse: "url74_ordered_by_newest" + extract_bilaterally: "url74_extract_bilaterally" - url: "{url75}" - scrape_reverse: "{%not( url75_ordered_by_newest )}" - download_reverse: "url75_ordered_by_newest" + extract_bilaterally: "url75_extract_bilaterally" - url: "{url76}" - scrape_reverse: "{%not( url76_ordered_by_newest )}" - download_reverse: "url76_ordered_by_newest" + extract_bilaterally: "url76_extract_bilaterally" - url: "{url77}" - scrape_reverse: "{%not( url77_ordered_by_newest )}" - download_reverse: "url77_ordered_by_newest" + extract_bilaterally: "url77_extract_bilaterally" - url: "{url78}" - scrape_reverse: "{%not( url78_ordered_by_newest )}" - download_reverse: "url78_ordered_by_newest" + extract_bilaterally: "url78_extract_bilaterally" - url: "{url79}" - scrape_reverse: "{%not( url79_ordered_by_newest )}" - download_reverse: "url79_ordered_by_newest" + extract_bilaterally: "url79_extract_bilaterally" - url: "{url80}" - scrape_reverse: "{%not( url80_ordered_by_newest )}" - download_reverse: "url80_ordered_by_newest" + extract_bilaterally: "url80_extract_bilaterally" - url: "{url81}" - scrape_reverse: "{%not( url81_ordered_by_newest )}" - download_reverse: "url81_ordered_by_newest" + extract_bilaterally: "url81_extract_bilaterally" - url: "{url82}" - scrape_reverse: "{%not( url82_ordered_by_newest )}" - download_reverse: "url82_ordered_by_newest" + extract_bilaterally: "url82_extract_bilaterally" - url: "{url83}" - scrape_reverse: "{%not( url83_ordered_by_newest )}" - download_reverse: "url83_ordered_by_newest" + extract_bilaterally: "url83_extract_bilaterally" - url: "{url84}" - scrape_reverse: "{%not( url84_ordered_by_newest )}" - download_reverse: "url84_ordered_by_newest" + extract_bilaterally: "url84_extract_bilaterally" - url: "{url85}" - scrape_reverse: "{%not( url85_ordered_by_newest )}" - download_reverse: "url85_ordered_by_newest" + extract_bilaterally: "url85_extract_bilaterally" - url: "{url86}" - scrape_reverse: "{%not( url86_ordered_by_newest )}" - download_reverse: "url86_ordered_by_newest" + extract_bilaterally: "url86_extract_bilaterally" - url: "{url87}" - scrape_reverse: "{%not( url87_ordered_by_newest )}" - download_reverse: "url87_ordered_by_newest" + extract_bilaterally: "url87_extract_bilaterally" - url: "{url88}" - scrape_reverse: "{%not( url88_ordered_by_newest )}" - download_reverse: "url88_ordered_by_newest" + extract_bilaterally: "url88_extract_bilaterally" - url: "{url89}" - scrape_reverse: "{%not( url89_ordered_by_newest )}" - download_reverse: "url89_ordered_by_newest" + extract_bilaterally: "url89_extract_bilaterally" - url: "{url90}" - scrape_reverse: "{%not( url90_ordered_by_newest )}" - download_reverse: "url90_ordered_by_newest" + extract_bilaterally: "url90_extract_bilaterally" - url: "{url91}" - scrape_reverse: "{%not( url91_ordered_by_newest )}" - download_reverse: "url91_ordered_by_newest" + extract_bilaterally: "url91_extract_bilaterally" - url: "{url92}" - scrape_reverse: "{%not( url92_ordered_by_newest )}" - download_reverse: "url92_ordered_by_newest" + extract_bilaterally: "url92_extract_bilaterally" - url: "{url93}" - scrape_reverse: "{%not( url93_ordered_by_newest )}" - download_reverse: "url93_ordered_by_newest" + extract_bilaterally: "url93_extract_bilaterally" - url: "{url94}" - scrape_reverse: "{%not( url94_ordered_by_newest )}" - download_reverse: "url94_ordered_by_newest" + extract_bilaterally: "url94_extract_bilaterally" - url: "{url95}" - scrape_reverse: "{%not( url95_ordered_by_newest )}" - download_reverse: "url95_ordered_by_newest" + extract_bilaterally: "url95_extract_bilaterally" - url: "{url96}" - scrape_reverse: "{%not( url96_ordered_by_newest )}" - download_reverse: "url96_ordered_by_newest" + extract_bilaterally: "url96_extract_bilaterally" - url: "{url97}" - scrape_reverse: "{%not( url97_ordered_by_newest )}" - download_reverse: "url97_ordered_by_newest" + extract_bilaterally: "url97_extract_bilaterally" - url: "{url98}" - scrape_reverse: "{%not( url98_ordered_by_newest )}" - download_reverse: "url98_ordered_by_newest" + extract_bilaterally: "url98_extract_bilaterally" - url: "{url99}" - scrape_reverse: "{%not( url99_ordered_by_newest )}" - download_reverse: "url99_ordered_by_newest" + extract_bilaterally: "url99_extract_bilaterally" - url: "{url100}" - scrape_reverse: "{%not( url100_ordered_by_newest )}" - download_reverse: "url100_ordered_by_newest" + extract_bilaterally: "url100_extract_bilaterally" overrides: avatar_uncropped_thumbnail_file_name: "" @@ -532,104 +432,104 @@ presets: url100: "{subscription_value_100}" # Default behavior is to assume all URLs are ordered by newest - url_ordered_by_newest: "{ %bool(True) }" - url2_ordered_by_newest: "{ %bool(True) }" - url3_ordered_by_newest: "{ %bool(True) }" - url4_ordered_by_newest: "{ %bool(True) }" - url5_ordered_by_newest: "{ %bool(True) }" - url6_ordered_by_newest: "{ %bool(True) }" - url7_ordered_by_newest: "{ %bool(True) }" - url8_ordered_by_newest: "{ %bool(True) }" - url9_ordered_by_newest: "{ %bool(True) }" - url10_ordered_by_newest: "{ %bool(True) }" - url11_ordered_by_newest: "{ %bool(True) }" - url12_ordered_by_newest: "{ %bool(True) }" - url13_ordered_by_newest: "{ %bool(True) }" - url14_ordered_by_newest: "{ %bool(True) }" - url15_ordered_by_newest: "{ %bool(True) }" - url16_ordered_by_newest: "{ %bool(True) }" - url17_ordered_by_newest: "{ %bool(True) }" - url18_ordered_by_newest: "{ %bool(True) }" - url19_ordered_by_newest: "{ %bool(True) }" - url20_ordered_by_newest: "{ %bool(True) }" - url21_ordered_by_newest: "{ %bool(True) }" - url22_ordered_by_newest: "{ %bool(True) }" - url23_ordered_by_newest: "{ %bool(True) }" - url24_ordered_by_newest: "{ %bool(True) }" - url25_ordered_by_newest: "{ %bool(True) }" - url26_ordered_by_newest: "{ %bool(True) }" - url27_ordered_by_newest: "{ %bool(True) }" - url28_ordered_by_newest: "{ %bool(True) }" - url29_ordered_by_newest: "{ %bool(True) }" - url30_ordered_by_newest: "{ %bool(True) }" - url31_ordered_by_newest: "{ %bool(True) }" - url32_ordered_by_newest: "{ %bool(True) }" - url33_ordered_by_newest: "{ %bool(True) }" - url34_ordered_by_newest: "{ %bool(True) }" - url35_ordered_by_newest: "{ %bool(True) }" - url36_ordered_by_newest: "{ %bool(True) }" - url37_ordered_by_newest: "{ %bool(True) }" - url38_ordered_by_newest: "{ %bool(True) }" - url39_ordered_by_newest: "{ %bool(True) }" - url40_ordered_by_newest: "{ %bool(True) }" - url41_ordered_by_newest: "{ %bool(True) }" - url42_ordered_by_newest: "{ %bool(True) }" - url43_ordered_by_newest: "{ %bool(True) }" - url44_ordered_by_newest: "{ %bool(True) }" - url45_ordered_by_newest: "{ %bool(True) }" - url46_ordered_by_newest: "{ %bool(True) }" - url47_ordered_by_newest: "{ %bool(True) }" - url48_ordered_by_newest: "{ %bool(True) }" - url49_ordered_by_newest: "{ %bool(True) }" - url50_ordered_by_newest: "{ %bool(True) }" - url51_ordered_by_newest: "{ %bool(True) }" - url52_ordered_by_newest: "{ %bool(True) }" - url53_ordered_by_newest: "{ %bool(True) }" - url54_ordered_by_newest: "{ %bool(True) }" - url55_ordered_by_newest: "{ %bool(True) }" - url56_ordered_by_newest: "{ %bool(True) }" - url57_ordered_by_newest: "{ %bool(True) }" - url58_ordered_by_newest: "{ %bool(True) }" - url59_ordered_by_newest: "{ %bool(True) }" - url60_ordered_by_newest: "{ %bool(True) }" - url61_ordered_by_newest: "{ %bool(True) }" - url62_ordered_by_newest: "{ %bool(True) }" - url63_ordered_by_newest: "{ %bool(True) }" - url64_ordered_by_newest: "{ %bool(True) }" - url65_ordered_by_newest: "{ %bool(True) }" - url66_ordered_by_newest: "{ %bool(True) }" - url67_ordered_by_newest: "{ %bool(True) }" - url68_ordered_by_newest: "{ %bool(True) }" - url69_ordered_by_newest: "{ %bool(True) }" - url70_ordered_by_newest: "{ %bool(True) }" - url71_ordered_by_newest: "{ %bool(True) }" - url72_ordered_by_newest: "{ %bool(True) }" - url73_ordered_by_newest: "{ %bool(True) }" - url74_ordered_by_newest: "{ %bool(True) }" - url75_ordered_by_newest: "{ %bool(True) }" - url76_ordered_by_newest: "{ %bool(True) }" - url77_ordered_by_newest: "{ %bool(True) }" - url78_ordered_by_newest: "{ %bool(True) }" - url79_ordered_by_newest: "{ %bool(True) }" - url80_ordered_by_newest: "{ %bool(True) }" - url81_ordered_by_newest: "{ %bool(True) }" - url82_ordered_by_newest: "{ %bool(True) }" - url83_ordered_by_newest: "{ %bool(True) }" - url84_ordered_by_newest: "{ %bool(True) }" - url85_ordered_by_newest: "{ %bool(True) }" - url86_ordered_by_newest: "{ %bool(True) }" - url87_ordered_by_newest: "{ %bool(True) }" - url88_ordered_by_newest: "{ %bool(True) }" - url89_ordered_by_newest: "{ %bool(True) }" - url90_ordered_by_newest: "{ %bool(True) }" - url91_ordered_by_newest: "{ %bool(True) }" - url92_ordered_by_newest: "{ %bool(True) }" - url93_ordered_by_newest: "{ %bool(True) }" - url94_ordered_by_newest: "{ %bool(True) }" - url95_ordered_by_newest: "{ %bool(True) }" - url96_ordered_by_newest: "{ %bool(True) }" - url97_ordered_by_newest: "{ %bool(True) }" - url98_ordered_by_newest: "{ %bool(True) }" - url99_ordered_by_newest: "{ %bool(True) }" - url100_ordered_by_newest: "{ %bool(True) }" + url_extract_bilaterally: False + url2_extract_bilaterally: False + url3_extract_bilaterally: False + url4_extract_bilaterally: False + url5_extract_bilaterally: False + url6_extract_bilaterally: False + url7_extract_bilaterally: False + url8_extract_bilaterally: False + url9_extract_bilaterally: False + url10_extract_bilaterally: False + url11_extract_bilaterally: False + url12_extract_bilaterally: False + url13_extract_bilaterally: False + url14_extract_bilaterally: False + url15_extract_bilaterally: False + url16_extract_bilaterally: False + url17_extract_bilaterally: False + url18_extract_bilaterally: False + url19_extract_bilaterally: False + url20_extract_bilaterally: False + url21_extract_bilaterally: False + url22_extract_bilaterally: False + url23_extract_bilaterally: False + url24_extract_bilaterally: False + url25_extract_bilaterally: False + url26_extract_bilaterally: False + url27_extract_bilaterally: False + url28_extract_bilaterally: False + url29_extract_bilaterally: False + url30_extract_bilaterally: False + url31_extract_bilaterally: False + url32_extract_bilaterally: False + url33_extract_bilaterally: False + url34_extract_bilaterally: False + url35_extract_bilaterally: False + url36_extract_bilaterally: False + url37_extract_bilaterally: False + url38_extract_bilaterally: False + url39_extract_bilaterally: False + url40_extract_bilaterally: False + url41_extract_bilaterally: False + url42_extract_bilaterally: False + url43_extract_bilaterally: False + url44_extract_bilaterally: False + url45_extract_bilaterally: False + url46_extract_bilaterally: False + url47_extract_bilaterally: False + url48_extract_bilaterally: False + url49_extract_bilaterally: False + url50_extract_bilaterally: False + url51_extract_bilaterally: False + url52_extract_bilaterally: False + url53_extract_bilaterally: False + url54_extract_bilaterally: False + url55_extract_bilaterally: False + url56_extract_bilaterally: False + url57_extract_bilaterally: False + url58_extract_bilaterally: False + url59_extract_bilaterally: False + url60_extract_bilaterally: False + url61_extract_bilaterally: False + url62_extract_bilaterally: False + url63_extract_bilaterally: False + url64_extract_bilaterally: False + url65_extract_bilaterally: False + url66_extract_bilaterally: False + url67_extract_bilaterally: False + url68_extract_bilaterally: False + url69_extract_bilaterally: False + url70_extract_bilaterally: False + url71_extract_bilaterally: False + url72_extract_bilaterally: False + url73_extract_bilaterally: False + url74_extract_bilaterally: False + url75_extract_bilaterally: False + url76_extract_bilaterally: False + url77_extract_bilaterally: False + url78_extract_bilaterally: False + url79_extract_bilaterally: False + url80_extract_bilaterally: False + url81_extract_bilaterally: False + url82_extract_bilaterally: False + url83_extract_bilaterally: False + url84_extract_bilaterally: False + url85_extract_bilaterally: False + url86_extract_bilaterally: False + url87_extract_bilaterally: False + url88_extract_bilaterally: False + url89_extract_bilaterally: False + url90_extract_bilaterally: False + url91_extract_bilaterally: False + url92_extract_bilaterally: False + url93_extract_bilaterally: False + url94_extract_bilaterally: False + url95_extract_bilaterally: False + url96_extract_bilaterally: False + url97_extract_bilaterally: False + url98_extract_bilaterally: False + url99_extract_bilaterally: False + url100_extract_bilaterally: False \ No newline at end of file diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml index dd9cf5e8..e569c04e 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml @@ -40,106 +40,106 @@ presets: # Check each URL to ensure ordering matches ytdl-sub's expectations # of being ordered by newest - url_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url) }" - url2_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url2) }" - url3_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url3) }" - url4_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url4) }" - url5_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url5) }" - url6_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url6) }" - url7_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url7) }" - url8_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url8) }" - url9_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url9) }" - url10_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url10) }" - url11_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url11) }" - url12_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url12) }" - url13_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url13) }" - url14_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url14) }" - url15_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url15) }" - url16_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url16) }" - url17_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url17) }" - url18_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url18) }" - url19_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url19) }" - url20_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url20) }" - url21_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url21) }" - url22_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url22) }" - url23_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url23) }" - url24_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url24) }" - url25_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url25) }" - url26_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url26) }" - url27_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url27) }" - url28_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url28) }" - url29_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url29) }" - url30_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url30) }" - url31_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url31) }" - url32_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url32) }" - url33_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url33) }" - url34_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url34) }" - url35_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url35) }" - url36_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url36) }" - url37_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url37) }" - url38_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url38) }" - url39_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url39) }" - url40_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url40) }" - url41_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url41) }" - url42_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url42) }" - url43_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url43) }" - url44_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url44) }" - url45_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url45) }" - url46_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url46) }" - url47_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url47) }" - url48_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url48) }" - url49_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url49) }" - url50_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url50) }" - url51_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url51) }" - url52_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url52) }" - url53_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url53) }" - url54_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url54) }" - url55_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url55) }" - url56_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url56) }" - url57_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url57) }" - url58_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url58) }" - url59_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url59) }" - url60_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url60) }" - url61_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url61) }" - url62_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url62) }" - url63_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url63) }" - url64_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url64) }" - url65_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url65) }" - url66_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url66) }" - url67_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url67) }" - url68_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url68) }" - url69_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url69) }" - url70_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url70) }" - url71_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url71) }" - url72_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url72) }" - url73_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url73) }" - url74_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url74) }" - url75_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url75) }" - url76_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url76) }" - url77_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url77) }" - url78_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url78) }" - url79_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url79) }" - url80_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url80) }" - url81_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url81) }" - url82_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url82) }" - url83_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url83) }" - url84_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url84) }" - url85_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url85) }" - url86_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url86) }" - url87_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url87) }" - url88_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url88) }" - url89_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url89) }" - url90_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url90) }" - url91_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url91) }" - url92_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url92) }" - url93_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url93) }" - url94_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url94) }" - url95_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url95) }" - url96_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url96) }" - url97_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url97) }" - url98_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url98) }" - url99_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url99) }" - url100_ordered_by_newest: "{ %is_playlist_ordered_by_newest(url100) }" + url_extract_bilaterally: "{ %is_bilateral_playlist_url(url) }" + url2_extract_bilaterally: "{ %is_bilateral_playlist_url(url2) }" + url3_extract_bilaterally: "{ %is_bilateral_playlist_url(url3) }" + url4_extract_bilaterally: "{ %is_bilateral_playlist_url(url4) }" + url5_extract_bilaterally: "{ %is_bilateral_playlist_url(url5) }" + url6_extract_bilaterally: "{ %is_bilateral_playlist_url(url6) }" + url7_extract_bilaterally: "{ %is_bilateral_playlist_url(url7) }" + url8_extract_bilaterally: "{ %is_bilateral_playlist_url(url8) }" + url9_extract_bilaterally: "{ %is_bilateral_playlist_url(url9) }" + url10_extract_bilaterally: "{ %is_bilateral_playlist_url(url10) }" + url11_extract_bilaterally: "{ %is_bilateral_playlist_url(url11) }" + url12_extract_bilaterally: "{ %is_bilateral_playlist_url(url12) }" + url13_extract_bilaterally: "{ %is_bilateral_playlist_url(url13) }" + url14_extract_bilaterally: "{ %is_bilateral_playlist_url(url14) }" + url15_extract_bilaterally: "{ %is_bilateral_playlist_url(url15) }" + url16_extract_bilaterally: "{ %is_bilateral_playlist_url(url16) }" + url17_extract_bilaterally: "{ %is_bilateral_playlist_url(url17) }" + url18_extract_bilaterally: "{ %is_bilateral_playlist_url(url18) }" + url19_extract_bilaterally: "{ %is_bilateral_playlist_url(url19) }" + url20_extract_bilaterally: "{ %is_bilateral_playlist_url(url20) }" + url21_extract_bilaterally: "{ %is_bilateral_playlist_url(url21) }" + url22_extract_bilaterally: "{ %is_bilateral_playlist_url(url22) }" + url23_extract_bilaterally: "{ %is_bilateral_playlist_url(url23) }" + url24_extract_bilaterally: "{ %is_bilateral_playlist_url(url24) }" + url25_extract_bilaterally: "{ %is_bilateral_playlist_url(url25) }" + url26_extract_bilaterally: "{ %is_bilateral_playlist_url(url26) }" + url27_extract_bilaterally: "{ %is_bilateral_playlist_url(url27) }" + url28_extract_bilaterally: "{ %is_bilateral_playlist_url(url28) }" + url29_extract_bilaterally: "{ %is_bilateral_playlist_url(url29) }" + url30_extract_bilaterally: "{ %is_bilateral_playlist_url(url30) }" + url31_extract_bilaterally: "{ %is_bilateral_playlist_url(url31) }" + url32_extract_bilaterally: "{ %is_bilateral_playlist_url(url32) }" + url33_extract_bilaterally: "{ %is_bilateral_playlist_url(url33) }" + url34_extract_bilaterally: "{ %is_bilateral_playlist_url(url34) }" + url35_extract_bilaterally: "{ %is_bilateral_playlist_url(url35) }" + url36_extract_bilaterally: "{ %is_bilateral_playlist_url(url36) }" + url37_extract_bilaterally: "{ %is_bilateral_playlist_url(url37) }" + url38_extract_bilaterally: "{ %is_bilateral_playlist_url(url38) }" + url39_extract_bilaterally: "{ %is_bilateral_playlist_url(url39) }" + url40_extract_bilaterally: "{ %is_bilateral_playlist_url(url40) }" + url41_extract_bilaterally: "{ %is_bilateral_playlist_url(url41) }" + url42_extract_bilaterally: "{ %is_bilateral_playlist_url(url42) }" + url43_extract_bilaterally: "{ %is_bilateral_playlist_url(url43) }" + url44_extract_bilaterally: "{ %is_bilateral_playlist_url(url44) }" + url45_extract_bilaterally: "{ %is_bilateral_playlist_url(url45) }" + url46_extract_bilaterally: "{ %is_bilateral_playlist_url(url46) }" + url47_extract_bilaterally: "{ %is_bilateral_playlist_url(url47) }" + url48_extract_bilaterally: "{ %is_bilateral_playlist_url(url48) }" + url49_extract_bilaterally: "{ %is_bilateral_playlist_url(url49) }" + url50_extract_bilaterally: "{ %is_bilateral_playlist_url(url50) }" + url51_extract_bilaterally: "{ %is_bilateral_playlist_url(url51) }" + url52_extract_bilaterally: "{ %is_bilateral_playlist_url(url52) }" + url53_extract_bilaterally: "{ %is_bilateral_playlist_url(url53) }" + url54_extract_bilaterally: "{ %is_bilateral_playlist_url(url54) }" + url55_extract_bilaterally: "{ %is_bilateral_playlist_url(url55) }" + url56_extract_bilaterally: "{ %is_bilateral_playlist_url(url56) }" + url57_extract_bilaterally: "{ %is_bilateral_playlist_url(url57) }" + url58_extract_bilaterally: "{ %is_bilateral_playlist_url(url58) }" + url59_extract_bilaterally: "{ %is_bilateral_playlist_url(url59) }" + url60_extract_bilaterally: "{ %is_bilateral_playlist_url(url60) }" + url61_extract_bilaterally: "{ %is_bilateral_playlist_url(url61) }" + url62_extract_bilaterally: "{ %is_bilateral_playlist_url(url62) }" + url63_extract_bilaterally: "{ %is_bilateral_playlist_url(url63) }" + url64_extract_bilaterally: "{ %is_bilateral_playlist_url(url64) }" + url65_extract_bilaterally: "{ %is_bilateral_playlist_url(url65) }" + url66_extract_bilaterally: "{ %is_bilateral_playlist_url(url66) }" + url67_extract_bilaterally: "{ %is_bilateral_playlist_url(url67) }" + url68_extract_bilaterally: "{ %is_bilateral_playlist_url(url68) }" + url69_extract_bilaterally: "{ %is_bilateral_playlist_url(url69) }" + url70_extract_bilaterally: "{ %is_bilateral_playlist_url(url70) }" + url71_extract_bilaterally: "{ %is_bilateral_playlist_url(url71) }" + url72_extract_bilaterally: "{ %is_bilateral_playlist_url(url72) }" + url73_extract_bilaterally: "{ %is_bilateral_playlist_url(url73) }" + url74_extract_bilaterally: "{ %is_bilateral_playlist_url(url74) }" + url75_extract_bilaterally: "{ %is_bilateral_playlist_url(url75) }" + url76_extract_bilaterally: "{ %is_bilateral_playlist_url(url76) }" + url77_extract_bilaterally: "{ %is_bilateral_playlist_url(url77) }" + url78_extract_bilaterally: "{ %is_bilateral_playlist_url(url78) }" + url79_extract_bilaterally: "{ %is_bilateral_playlist_url(url79) }" + url80_extract_bilaterally: "{ %is_bilateral_playlist_url(url80) }" + url81_extract_bilaterally: "{ %is_bilateral_playlist_url(url81) }" + url82_extract_bilaterally: "{ %is_bilateral_playlist_url(url82) }" + url83_extract_bilaterally: "{ %is_bilateral_playlist_url(url83) }" + url84_extract_bilaterally: "{ %is_bilateral_playlist_url(url84) }" + url85_extract_bilaterally: "{ %is_bilateral_playlist_url(url85) }" + url86_extract_bilaterally: "{ %is_bilateral_playlist_url(url86) }" + url87_extract_bilaterally: "{ %is_bilateral_playlist_url(url87) }" + url88_extract_bilaterally: "{ %is_bilateral_playlist_url(url88) }" + url89_extract_bilaterally: "{ %is_bilateral_playlist_url(url89) }" + url90_extract_bilaterally: "{ %is_bilateral_playlist_url(url90) }" + url91_extract_bilaterally: "{ %is_bilateral_playlist_url(url91) }" + url92_extract_bilaterally: "{ %is_bilateral_playlist_url(url92) }" + url93_extract_bilaterally: "{ %is_bilateral_playlist_url(url93) }" + url94_extract_bilaterally: "{ %is_bilateral_playlist_url(url94) }" + url95_extract_bilaterally: "{ %is_bilateral_playlist_url(url95) }" + url96_extract_bilaterally: "{ %is_bilateral_playlist_url(url96) }" + url97_extract_bilaterally: "{ %is_bilateral_playlist_url(url97) }" + url98_extract_bilaterally: "{ %is_bilateral_playlist_url(url98) }" + url99_extract_bilaterally: "{ %is_bilateral_playlist_url(url99) }" + url100_extract_bilaterally: "{ %is_bilateral_playlist_url(url100) }" #################################################################################################### diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml index da38009c..d3bafc69 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_collection.yaml @@ -9,124 +9,124 @@ presets: season_number_padded: "{collection_season_number_padded}" collection_season_1_url: "" collection_season_1_name: "Season 1" - collection_season_1_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_1_url) }" + collection_season_1_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_1_url) }" collection_season_2_url: "" collection_season_2_name: "Season 2" - collection_season_2_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_2_url) }" + collection_season_2_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_2_url) }" collection_season_3_url: "" collection_season_3_name: "Season 3" - collection_season_3_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_3_url) }" + collection_season_3_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_3_url) }" collection_season_4_url: "" collection_season_4_name: "Season 4" - collection_season_4_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_4_url) }" + collection_season_4_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_4_url) }" collection_season_5_url: "" collection_season_5_name: "Season 5" - collection_season_5_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_5_url) }" + collection_season_5_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_5_url) }" collection_season_6_url: "" collection_season_6_name: "Season 6" - collection_season_6_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_6_url) }" + collection_season_6_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_6_url) }" collection_season_7_url: "" collection_season_7_name: "Season 7" - collection_season_7_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_7_url) }" + collection_season_7_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_7_url) }" collection_season_8_url: "" collection_season_8_name: "Season 8" - collection_season_8_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_8_url) }" + collection_season_8_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_8_url) }" collection_season_9_url: "" collection_season_9_name: "Season 9" - collection_season_9_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_9_url) }" + collection_season_9_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_9_url) }" collection_season_10_url: "" collection_season_10_name: "Season 10" - collection_season_10_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_10_url) }" + collection_season_10_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_10_url) }" collection_season_11_url: "" collection_season_11_name: "Season 11" - collection_season_11_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_11_url) }" + collection_season_11_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_11_url) }" collection_season_12_url: "" collection_season_12_name: "Season 12" - collection_season_12_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_12_url) }" + collection_season_12_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_12_url) }" collection_season_13_url: "" collection_season_13_name: "Season 13" - collection_season_13_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_13_url) }" + collection_season_13_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_13_url) }" collection_season_14_url: "" collection_season_14_name: "Season 14" - collection_season_14_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_14_url) }" + collection_season_14_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_14_url) }" collection_season_15_url: "" collection_season_15_name: "Season 15" - collection_season_15_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_15_url) }" + collection_season_15_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_15_url) }" collection_season_16_url: "" collection_season_16_name: "Season 16" - collection_season_16_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_16_url) }" + collection_season_16_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_16_url) }" collection_season_17_url: "" collection_season_17_name: "Season 17" - collection_season_17_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_17_url) }" + collection_season_17_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_17_url) }" collection_season_18_url: "" collection_season_18_name: "Season 18" - collection_season_18_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_18_url) }" + collection_season_18_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_18_url) }" collection_season_19_url: "" collection_season_19_name: "Season 19" - collection_season_19_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_19_url) }" + collection_season_19_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_19_url) }" collection_season_20_url: "" collection_season_20_name: "Season 20" - collection_season_20_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_20_url) }" + collection_season_20_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_20_url) }" collection_season_21_url: "" collection_season_21_name: "Season 21" - collection_season_21_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_21_url) }" + collection_season_21_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_21_url) }" collection_season_22_url: "" collection_season_22_name: "Season 22" - collection_season_22_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_22_url) }" + collection_season_22_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_22_url) }" collection_season_23_url: "" collection_season_23_name: "Season 23" - collection_season_23_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_23_url) }" + collection_season_23_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_23_url) }" collection_season_24_url: "" collection_season_24_name: "Season 24" - collection_season_24_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_24_url) }" + collection_season_24_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_24_url) }" collection_season_25_url: "" collection_season_25_name: "Season 25" - collection_season_25_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_25_url) }" + collection_season_25_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_25_url) }" collection_season_26_url: "" collection_season_26_name: "Season 26" - collection_season_26_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_26_url) }" + collection_season_26_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_26_url) }" collection_season_27_url: "" collection_season_27_name: "Season 27" - collection_season_27_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_27_url) }" + collection_season_27_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_27_url) }" collection_season_28_url: "" collection_season_28_name: "Season 28" - collection_season_28_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_28_url) }" + collection_season_28_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_28_url) }" collection_season_29_url: "" collection_season_29_name: "Season 29" - collection_season_29_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_29_url) }" + collection_season_29_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_29_url) }" collection_season_30_url: "" collection_season_30_name: "Season 30" - collection_season_30_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_30_url) }" + collection_season_30_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_30_url) }" collection_season_31_url: "" collection_season_31_name: "Season 31" - collection_season_31_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_31_url) }" + collection_season_31_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_31_url) }" collection_season_32_url: "" collection_season_32_name: "Season 32" - collection_season_32_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_32_url) }" + collection_season_32_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_32_url) }" collection_season_33_url: "" collection_season_33_name: "Season 33" - collection_season_33_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_33_url) }" + collection_season_33_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_33_url) }" collection_season_34_url: "" collection_season_34_name: "Season 34" - collection_season_34_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_34_url) }" + collection_season_34_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_34_url) }" collection_season_35_url: "" collection_season_35_name: "Season 35" - collection_season_35_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_35_url) }" + collection_season_35_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_35_url) }" collection_season_36_url: "" collection_season_36_name: "Season 36" - collection_season_36_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_36_url) }" + collection_season_36_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_36_url) }" collection_season_37_url: "" collection_season_37_name: "Season 37" - collection_season_37_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_37_url) }" + collection_season_37_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_37_url) }" collection_season_38_url: "" collection_season_38_name: "Season 38" - collection_season_38_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_38_url) }" + collection_season_38_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_38_url) }" collection_season_39_url: "" collection_season_39_name: "Season 39" - collection_season_39_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_39_url) }" + collection_season_39_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_39_url) }" collection_season_40_url: "" collection_season_40_name: "Season 40" - collection_season_40_ordered_by_newest: "{ %is_playlist_ordered_by_newest(collection_season_40_url) }" + collection_season_40_extract_bilaterally: "{ %is_bilateral_playlist_url(collection_season_40_url) }" kodi_tv_show_collection: preset: @@ -166,8 +166,7 @@ presets: uid: "avatar_uncropped" - name: "{tv_show_fanart_file_name}" uid: "banner_uncropped" - scrape_reverse: "{%not( collection_season_1_ordered_by_newest )}" - download_reverse: "collection_season_1_ordered_by_newest" + extract_bilaterally: "collection_season_1_extract_bilaterally" output_directory_nfo_tags: tags: @@ -185,8 +184,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_2_ordered_by_newest )}" - download_reverse: "collection_season_2_ordered_by_newest" + extract_bilaterally: "collection_season_2_extract_bilaterally" output_directory_nfo_tags: tags: @@ -204,8 +202,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_3_ordered_by_newest )}" - download_reverse: "collection_season_3_ordered_by_newest" + extract_bilaterally: "collection_season_3_extract_bilaterally" output_directory_nfo_tags: tags: @@ -223,8 +220,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_4_ordered_by_newest )}" - download_reverse: "collection_season_4_ordered_by_newest" + extract_bilaterally: "collection_season_4_extract_bilaterally" output_directory_nfo_tags: tags: @@ -242,8 +238,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_5_ordered_by_newest )}" - download_reverse: "collection_season_5_ordered_by_newest" + extract_bilaterally: "collection_season_5_extract_bilaterally" output_directory_nfo_tags: tags: @@ -261,8 +256,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_6_ordered_by_newest )}" - download_reverse: "collection_season_6_ordered_by_newest" + extract_bilaterally: "collection_season_6_extract_bilaterally" output_directory_nfo_tags: tags: @@ -280,8 +274,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_7_ordered_by_newest )}" - download_reverse: "collection_season_7_ordered_by_newest" + extract_bilaterally: "collection_season_7_extract_bilaterally" output_directory_nfo_tags: tags: @@ -299,8 +292,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_8_ordered_by_newest )}" - download_reverse: "collection_season_8_ordered_by_newest" + extract_bilaterally: "collection_season_8_extract_bilaterally" output_directory_nfo_tags: tags: @@ -318,8 +310,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_9_ordered_by_newest )}" - download_reverse: "collection_season_9_ordered_by_newest" + extract_bilaterally: "collection_season_9_extract_bilaterally" output_directory_nfo_tags: tags: @@ -337,8 +328,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_10_ordered_by_newest )}" - download_reverse: "collection_season_10_ordered_by_newest" + extract_bilaterally: "collection_season_10_extract_bilaterally" output_directory_nfo_tags: tags: @@ -356,8 +346,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_11_ordered_by_newest )}" - download_reverse: "collection_season_11_ordered_by_newest" + extract_bilaterally: "collection_season_11_extract_bilaterally" output_directory_nfo_tags: tags: @@ -375,8 +364,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_12_ordered_by_newest )}" - download_reverse: "collection_season_12_ordered_by_newest" + extract_bilaterally: "collection_season_12_extract_bilaterally" output_directory_nfo_tags: tags: @@ -394,8 +382,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_13_ordered_by_newest )}" - download_reverse: "collection_season_13_ordered_by_newest" + extract_bilaterally: "collection_season_13_extract_bilaterally" output_directory_nfo_tags: tags: @@ -413,8 +400,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_14_ordered_by_newest )}" - download_reverse: "collection_season_14_ordered_by_newest" + extract_bilaterally: "collection_season_14_extract_bilaterally" output_directory_nfo_tags: tags: @@ -432,8 +418,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_15_ordered_by_newest )}" - download_reverse: "collection_season_15_ordered_by_newest" + extract_bilaterally: "collection_season_15_extract_bilaterally" output_directory_nfo_tags: tags: @@ -451,8 +436,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_16_ordered_by_newest )}" - download_reverse: "collection_season_16_ordered_by_newest" + extract_bilaterally: "collection_season_16_extract_bilaterally" output_directory_nfo_tags: tags: @@ -470,8 +454,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_17_ordered_by_newest )}" - download_reverse: "collection_season_17_ordered_by_newest" + extract_bilaterally: "collection_season_17_extract_bilaterally" output_directory_nfo_tags: tags: @@ -489,8 +472,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_18_ordered_by_newest )}" - download_reverse: "collection_season_18_ordered_by_newest" + extract_bilaterally: "collection_season_18_extract_bilaterally" output_directory_nfo_tags: tags: @@ -508,8 +490,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_19_ordered_by_newest )}" - download_reverse: "collection_season_19_ordered_by_newest" + extract_bilaterally: "collection_season_19_extract_bilaterally" output_directory_nfo_tags: tags: @@ -527,8 +508,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_20_ordered_by_newest )}" - download_reverse: "collection_season_20_ordered_by_newest" + extract_bilaterally: "collection_season_20_extract_bilaterally" output_directory_nfo_tags: tags: @@ -546,8 +526,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_21_ordered_by_newest )}" - download_reverse: "collection_season_21_ordered_by_newest" + extract_bilaterally: "collection_season_21_extract_bilaterally" output_directory_nfo_tags: tags: @@ -565,8 +544,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_22_ordered_by_newest )}" - download_reverse: "collection_season_22_ordered_by_newest" + extract_bilaterally: "collection_season_22_extract_bilaterally" output_directory_nfo_tags: tags: @@ -584,8 +562,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_23_ordered_by_newest )}" - download_reverse: "collection_season_23_ordered_by_newest" + extract_bilaterally: "collection_season_23_extract_bilaterally" output_directory_nfo_tags: tags: @@ -603,8 +580,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_24_ordered_by_newest )}" - download_reverse: "collection_season_24_ordered_by_newest" + extract_bilaterally: "collection_season_24_extract_bilaterally" output_directory_nfo_tags: tags: @@ -622,8 +598,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_25_ordered_by_newest )}" - download_reverse: "collection_season_25_ordered_by_newest" + extract_bilaterally: "collection_season_25_extract_bilaterally" output_directory_nfo_tags: tags: @@ -641,8 +616,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_26_ordered_by_newest )}" - download_reverse: "collection_season_26_ordered_by_newest" + extract_bilaterally: "collection_season_26_extract_bilaterally" output_directory_nfo_tags: tags: @@ -660,8 +634,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_27_ordered_by_newest )}" - download_reverse: "collection_season_27_ordered_by_newest" + extract_bilaterally: "collection_season_27_extract_bilaterally" output_directory_nfo_tags: tags: @@ -679,8 +652,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_28_ordered_by_newest )}" - download_reverse: "collection_season_28_ordered_by_newest" + extract_bilaterally: "collection_season_28_extract_bilaterally" output_directory_nfo_tags: tags: @@ -698,8 +670,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_29_ordered_by_newest )}" - download_reverse: "collection_season_29_ordered_by_newest" + extract_bilaterally: "collection_season_29_extract_bilaterally" output_directory_nfo_tags: tags: @@ -717,8 +688,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_30_ordered_by_newest )}" - download_reverse: "collection_season_30_ordered_by_newest" + extract_bilaterally: "collection_season_30_extract_bilaterally" output_directory_nfo_tags: tags: @@ -736,8 +706,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_31_ordered_by_newest )}" - download_reverse: "collection_season_31_ordered_by_newest" + extract_bilaterally: "collection_season_31_extract_bilaterally" output_directory_nfo_tags: tags: @@ -755,8 +724,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_32_ordered_by_newest )}" - download_reverse: "collection_season_32_ordered_by_newest" + extract_bilaterally: "collection_season_32_extract_bilaterally" output_directory_nfo_tags: tags: @@ -774,8 +742,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_33_ordered_by_newest )}" - download_reverse: "collection_season_33_ordered_by_newest" + extract_bilaterally: "collection_season_33_extract_bilaterally" output_directory_nfo_tags: tags: @@ -793,8 +760,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_34_ordered_by_newest )}" - download_reverse: "collection_season_34_ordered_by_newest" + extract_bilaterally: "collection_season_34_extract_bilaterally" output_directory_nfo_tags: tags: @@ -812,8 +778,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_35_ordered_by_newest )}" - download_reverse: "collection_season_35_ordered_by_newest" + extract_bilaterally: "collection_season_35_extract_bilaterally" output_directory_nfo_tags: tags: @@ -831,8 +796,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_36_ordered_by_newest )}" - download_reverse: "collection_season_36_ordered_by_newest" + extract_bilaterally: "collection_season_36_extract_bilaterally" output_directory_nfo_tags: tags: @@ -850,8 +814,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_37_ordered_by_newest )}" - download_reverse: "collection_season_37_ordered_by_newest" + extract_bilaterally: "collection_season_37_extract_bilaterally" output_directory_nfo_tags: tags: @@ -869,8 +832,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_38_ordered_by_newest )}" - download_reverse: "collection_season_38_ordered_by_newest" + extract_bilaterally: "collection_season_38_extract_bilaterally" output_directory_nfo_tags: tags: @@ -888,8 +850,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_39_ordered_by_newest )}" - download_reverse: "collection_season_39_ordered_by_newest" + extract_bilaterally: "collection_season_39_extract_bilaterally" output_directory_nfo_tags: tags: @@ -907,8 +868,7 @@ presets: playlist_thumbnails: - name: "{season_poster_file_name}" uid: "latest_entry" - scrape_reverse: "{%not( collection_season_40_ordered_by_newest )}" - download_reverse: "collection_season_40_ordered_by_newest" + extract_bilaterally: "collection_season_40_extract_bilaterally" output_directory_nfo_tags: tags: