From d7bb8d21f13b61d28381367247c98d330568d73f Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 30 Mar 2024 00:52:42 -0700 Subject: [PATCH] playlist bilateral working :o --- src/ytdl_sub/downloaders/url/downloader.py | 74 ++---- .../entries/script/variable_definitions.py | 8 + .../prebuilt_presets/helpers/url.yaml | 210 +++++++++--------- tests/e2e/youtube/test_playlist.py | 1 - tests/resources.py | 2 +- .../youtube/test_playlist_bilateral_p1.txt | 2 + .../youtube/test_playlist_bilateral_p2.txt | 167 +++++++++++++- 7 files changed, 307 insertions(+), 157 deletions(-) diff --git a/src/ytdl_sub/downloaders/url/downloader.py b/src/ytdl_sub/downloaders/url/downloader.py index a076657d..7c7f4e93 100644 --- a/src/ytdl_sub/downloaders/url/downloader.py +++ b/src/ytdl_sub/downloaders/url/downloader.py @@ -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]: diff --git a/src/ytdl_sub/entries/script/variable_definitions.py b/src/ytdl_sub/entries/script/variable_definitions.py index a24f0aa7..a29d469c 100644 --- a/src/ytdl_sub/entries/script/variable_definitions.py +++ b/src/ytdl_sub/entries/script/variable_definitions.py @@ -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: """ diff --git a/src/ytdl_sub/prebuilt_presets/helpers/url.yaml b/src/ytdl_sub/prebuilt_presets/helpers/url.yaml index f5813ca8..b39fc746 100644 --- a/src/ytdl_sub/prebuilt_presets/helpers/url.yaml +++ b/src/ytdl_sub/prebuilt_presets/helpers/url.yaml @@ -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 \ No newline at end of file + playlist_items: "-1:0:-1" + + _multi_url_bilateral: + preset: + - "_multi_url_bilateral_inner" + - "_multi_url" \ No newline at end of file diff --git a/tests/e2e/youtube/test_playlist.py b/tests/e2e/youtube/test_playlist.py index 171f5bdf..7f237526 100644 --- a/tests/e2e/youtube/test_playlist.py +++ b/tests/e2e/youtube/test_playlist.py @@ -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, diff --git a/tests/resources.py b/tests/resources.py index bb9808fd..8a426c9e 100644 --- a/tests/resources.py +++ b/tests/resources.py @@ -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" diff --git a/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p1.txt b/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p1.txt index 243f7c1d..5da51f85 100644 --- a/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p1.txt +++ b/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p1.txt @@ -2,6 +2,8 @@ Files created: ---------------------------------------- {output_directory} .ytdl-sub-bilateral_test-download-archive.json + fanart.jpg + poster.jpg tvshow.nfo NFO tags: tvshow: diff --git a/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p2.txt b/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p2.txt index 7192b6c7..d8a85aba 100644 --- a/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p2.txt +++ b/tests/resources/transaction_log_summaries/youtube/test_playlist_bilateral_p2.txt @@ -1 +1,166 @@ -No new, modified, or removed files in '{output_directory}' \ No newline at end of file +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 \ No newline at end of file