From d3295cef86ec4367996d1a258283f32549c9ee76 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Mon, 18 Nov 2024 00:22:20 -0800 Subject: [PATCH 01/48] [BUGFIX] Do not perform nested scripting on file path outputs (#1123) Fixes a bug where curly braces in file-names causes scripting to think its a variable that does not exist --- src/ytdl_sub/utils/file_path.py | 6 +++++ .../validators/file_path_validators.py | 24 ++++--------------- tests/e2e/test_debug_repro.py | 5 ++-- .../validators/test_file_path_validators.py | 10 ++++---- 4 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/ytdl_sub/utils/file_path.py b/src/ytdl_sub/utils/file_path.py index af8246f1..ff50c991 100644 --- a/src/ytdl_sub/utils/file_path.py +++ b/src/ytdl_sub/utils/file_path.py @@ -1,4 +1,5 @@ import os +import posixpath from pathlib import Path from typing import Tuple @@ -59,3 +60,8 @@ class FilePathTruncater: return str(Path(file_directory) / cls._truncate_file_name(file_name)) return str(file_path) + + @classmethod + def to_native_filepath(cls, file_path: str) -> str: + """Ensures file paths use the correct separator""" + return os.path.expanduser(file_path.replace(posixpath.sep, os.sep)) diff --git a/src/ytdl_sub/validators/file_path_validators.py b/src/ytdl_sub/validators/file_path_validators.py index c255ed1a..f5a69f61 100644 --- a/src/ytdl_sub/validators/file_path_validators.py +++ b/src/ytdl_sub/validators/file_path_validators.py @@ -2,7 +2,7 @@ import os from pathlib import Path from typing import Any -from ytdl_sub.script.script import Script +from ytdl_sub.utils.file_path import FilePathTruncater from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.validators.validators import StringValidator @@ -45,15 +45,8 @@ class StringFormatterFileNameValidator(StringFormatterValidator): _expected_value_type_name = "filepath" def post_process(self, resolved: str) -> str: - return ( - Script( - { - "tmp_var_1": resolved, - "tmp_var_2": "{%to_native_filepath(%truncate_filepath_if_too_long(tmp_var_1))}", - } - ) - .resolve() - .get_str("tmp_var_2") + return FilePathTruncater.to_native_filepath( + FilePathTruncater.maybe_truncate_file_path(resolved) ) @@ -61,13 +54,6 @@ class OverridesStringFormatterFilePathValidator(OverridesStringFormatterValidato _expected_value_type_name = "static filepath" def post_process(self, resolved: str) -> str: - return ( - Script( - { - "tmp_var_1": resolved, - "tmp_var_2": "{%to_native_filepath(%truncate_filepath_if_too_long(tmp_var_1))}", - } - ) - .resolve() - .get_str("tmp_var_2") + return FilePathTruncater.to_native_filepath( + FilePathTruncater.maybe_truncate_file_path(resolved) ) diff --git a/tests/e2e/test_debug_repro.py b/tests/e2e/test_debug_repro.py index b96f530b..8587dd5c 100644 --- a/tests/e2e/test_debug_repro.py +++ b/tests/e2e/test_debug_repro.py @@ -1,4 +1,3 @@ -import json from typing import Dict import pytest @@ -44,13 +43,13 @@ class TestReproduce: def test_debug_log_repro( self, default_config, - repro_preset_dict, + debug_log_rerpo, output_directory, ): sub = Subscription.from_dict( config=default_config, preset_name="repro", - preset_dict=repro_preset_dict, + preset_dict=debug_log_rerpo, ) transaction_log = sub.download(dry_run=False) diff --git a/tests/unit/validators/test_file_path_validators.py b/tests/unit/validators/test_file_path_validators.py index 7ff62143..467f7b80 100644 --- a/tests/unit/validators/test_file_path_validators.py +++ b/tests/unit/validators/test_file_path_validators.py @@ -54,19 +54,17 @@ class TestStringFormatterFilePathValidator: if "thumb" not in ext: # do not put . in front of -thumb ext = f".{ext}" # pytest args with . in the beginning act weird - base_file_name = "s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: LG Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?" + base_file_name = "s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: {LG} Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?" with tempfile.TemporaryDirectory() as temp_dir: file_path = str(Path(temp_dir) / f"{base_file_name}{ext}") - formatter = StringFormatterFileNameValidator(name="test", value=str(file_path)) - truncated_file_path = formatter.post_process( - Script({"file_name": formatter.format_string}).resolve().get_str("file_name") - ) + formatter = StringFormatterFileNameValidator(name="test", value="") + truncated_file_path = formatter.post_process(file_path) assert truncated_file_path == str( Path(temp_dir) - / f"s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: LG Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?{ext}" + / f"s2023.e031701 - 𝗪𝗔𝗥𝗡𝗜𝗡𝗚: {{LG}} Secretly Overhaul This OLED Feature on C3 & G3… Should You Buy C2 Instead?{ext}" ) # Ensure it can actually open the file From a6341971ffb2ea08c8b675d99dfced3c659f4af6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 18:06:52 -0800 Subject: [PATCH 02/48] [DEV] Update pytest-rerunfailures requirement from ~=14.0 to >=14,<16 (#1125) Updates the requirements on [pytest-rerunfailures](https://github.com/pytest-dev/pytest-rerunfailures) to permit the latest version. - [Changelog](https://github.com/pytest-dev/pytest-rerunfailures/blob/master/CHANGES.rst) - [Commits](https://github.com/pytest-dev/pytest-rerunfailures/compare/14.0...15.0) --- updated-dependencies: - dependency-name: pytest-rerunfailures dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index dd14f164..b18d7378 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ where = ["src"] test = [ "coverage[toml]>=6.3,<8.0", "pytest>=7.2,<9.0", - "pytest-rerunfailures~=14.0", + "pytest-rerunfailures>=14,<16", ] lint = [ "black==24.10.0", From 8c3f8528ad87d196f4d5cde8fb99f63e4dc78abd Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 24 Nov 2024 15:28:36 -0800 Subject: [PATCH 03/48] [BACKEND] More media quality presets + docs (#1127) Adds common media quality prebuilt presets and documentation on how to use them --- docs/source/prebuilt_presets/helpers.rst | 31 +---------------- docs/source/prebuilt_presets/index.rst | 29 +++++++++++++--- .../source/prebuilt_presets/media_quality.rst | 29 ++++++++++++++++ .../helpers/media_quality.yaml | 34 ++++++++++++++++++- 4 files changed, 88 insertions(+), 35 deletions(-) create mode 100644 docs/source/prebuilt_presets/media_quality.rst diff --git a/docs/source/prebuilt_presets/helpers.rst b/docs/source/prebuilt_presets/helpers.rst index a4b141c6..7f70c243 100644 --- a/docs/source/prebuilt_presets/helpers.rst +++ b/docs/source/prebuilt_presets/helpers.rst @@ -4,21 +4,7 @@ Helper Presets .. hint:: - Apply presets to your subscriptions using pipes: - - .. code-block:: yaml - :caption: Pipes can separate presets and values to apply them to all subscriptions below them. - - Plex TV Show by Date | best_video_quality: - - = Documentaries | chunk_initial_download: - "NOVA PBS": "https://www.youtube.com/@novapbs" - "National Geographic": "https://www.youtube.com/@NatGeo" - - = Documentaries: - "Cosmos - What If": "https://www.youtube.com/playlist?list=PLZdXRHYAVxTJno6oFF9nLGuwXNGYHmE8U" - -Common presets are not usable by themselves- setting one of these as the sole preset of your subscription and attempting to download will not work. But you can add these presets to quickly modify an existing preset to better suit your needs. + See how to apply helper presets :doc:`here ` Only Recent ----------- @@ -42,21 +28,6 @@ upload date is outside of the range, or you hit max files, older videos will be To prevent deletion of files, use the preset ``Only Recent Archive`` instead. -Best A/V Quality ----------------- - -Add the following preset to download the best available video and audio quality, and remux it into an MP4 container: - -``best_video_quality`` - - -Max 1080p Video ---------------- - -Add the following preset to download the best available audio and video quality, with the video not greater than 1080p, and remux it into an MP4 container: - -``max_1080p`` - Filter Keywords --------------- diff --git a/docs/source/prebuilt_presets/index.rst b/docs/source/prebuilt_presets/index.rst index 744428ce..bb95ac0c 100644 --- a/docs/source/prebuilt_presets/index.rst +++ b/docs/source/prebuilt_presets/index.rst @@ -3,13 +3,34 @@ Prebuilt Presets ================ ``ytdl-sub`` offers a number of built-in presets using best practices for formatting -media in various players. For advanced users, you can review the prebuilt preset +media in various players. + +.. hint:: + + Apply multiple presets to your subscriptions using pipes. Pipes can define multiple presets and values + on the same line to apply to all subscriptions nested below them. + + .. code-block:: yaml + :caption: Applies Max Video Quality preset to all TV shows, and Chunk Downloads preset to some + + Plex TV Show by Date | Max Video Quality: + + = Documentaries | Chunk Downloads: + "NOVA PBS": "https://www.youtube.com/@novapbs" + "National Geographic": "https://www.youtube.com/@NatGeo" + + = Documentaries: + "Cosmos - What If": "https://www.youtube.com/playlist?list=PLZdXRHYAVxTJno6oFF9nLGuwXNGYHmE8U" + + +For advanced users, you can review the prebuilt preset definitions :doc:`here `. .. toctree:: :titlesonly: - - helpers + tv_shows music - music_videos \ No newline at end of file + music_videos + media_quality + helpers \ No newline at end of file diff --git a/docs/source/prebuilt_presets/media_quality.rst b/docs/source/prebuilt_presets/media_quality.rst new file mode 100644 index 00000000..ceb92479 --- /dev/null +++ b/docs/source/prebuilt_presets/media_quality.rst @@ -0,0 +1,29 @@ +====================== +Media Quality Presets +====================== + +.. hint:: + + See how to apply media quality presets :doc:`here ` + +Video +----- +The following presets set video quality specifications to yt-dlp. + +- ``Max Video Quality`` +- ``Max 2160p`` +- ``Max 1440p`` +- ``Max 1080p`` +- ``Max 720p`` +- ``Max 480p`` + +Audio +----- +The following presets set audio quality specifications to yt-dlp. +These assume you are only extracting audio (no video). + +- ``Max Audio Quality``, format is determined by the source +- ``Max MP3 Quality`` +- ``Max Opus Quality`` +- ``MP3 320k`` +- ``MP3 128k`` diff --git a/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml b/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml index a4c35dc9..78b99ca4 100644 --- a/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml +++ b/src/ytdl_sub/prebuilt_presets/helpers/media_quality.yaml @@ -13,6 +13,10 @@ presets: preset: - best_video_quality + "Max Video Quality": + preset: + - best_video_quality + ############################################################################# # Max 2160p @@ -55,4 +59,32 @@ presets: "Max 480p": format: "(bv*[height<=480]+bestaudio/best[height<=480])" ytdl_options: - merge_output_format: "mp4" \ No newline at end of file + merge_output_format: "mp4" + + ############################################################################# + # Audio Quality Presets + + "Max Audio Quality": + audio_extract: + codec: "best" + quality: 0 + + "Max MP3 Quality": + audio_extract: + codec: "mp3" + quality: 0 + + "Max Opus Quality": + audio_extract: + codec: "opus" + quality: 0 + + "MP3 320k": + audio_extract: + codec: "mp3" + quality: 320 + + "MP3 128k": + audio_extract: + codec: "mp3" + quality: 128 From 53d84d8c1e2bb73403e7cbe5c713e3017b3e9e48 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Tue, 26 Nov 2024 08:20:42 -0800 Subject: [PATCH 04/48] [FEATURE] Toggleable keyword evaluation behavior (#1130) With the `Filter Keywords` prebuilt preset, can now set keyword evaluation to be either `ANY` or `ALL`. More info here: https://ytdl-sub.readthedocs.io/en/latest/prebuilt_presets/helpers.html#filter-keywords --- .../scripting/scripting_functions.rst | 7 ++ docs/source/prebuilt_presets/helpers.rst | 17 ++- .../prebuilt_presets/helpers/filtering.yaml | 34 ++++-- .../script/functions/string_functions.py | 14 +++ .../prebuilt_presets/test_filter_keywords.py | 100 +++++++++++++++++- .../script/functions/test_string_functions.py | 8 ++ 6 files changed, 166 insertions(+), 14 deletions(-) diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index a12b0ebd..cc42c52c 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -646,6 +646,13 @@ contains :description: Returns True if ``contains`` is in ``string``. False otherwise. +contains_all +~~~~~~~~~~~~ +:spec: ``contains_all(string: String, contains_array: Array) -> Boolean`` + +:description: + Returns true if all elements in ``contains_array`` are in ``string``. False otherwise. + contains_any ~~~~~~~~~~~~ :spec: ``contains_any(string: String, contains_array: Array) -> Boolean`` diff --git a/docs/source/prebuilt_presets/helpers.rst b/docs/source/prebuilt_presets/helpers.rst index 7f70c243..e8e37c31 100644 --- a/docs/source/prebuilt_presets/helpers.rst +++ b/docs/source/prebuilt_presets/helpers.rst @@ -33,12 +33,14 @@ Filter Keywords ``Filter Keywords`` can include or exclude media with any of the listed keywords. Both keywords and title/description are lower-cased before filtering. +Default behavior for Keyword evaluation is ANY, meaning the filter will succeed if any of the keywords are present. This can be set to ANY or ALL using the respective ``_eval`` variable. + Supports the following override variables: -* ``title_include_keywords`` -* ``title_exclude_keywords`` -* ``description_include_keywords`` -* ``description_exclude_keywords`` +* ``title_include_keywords``, ``title_include_eval`` +* ``title_exclude_keywords``, ``title_exclude_eval`` +* ``description_include_keywords``, ``title_exclude_eval`` +* ``description_exclude_keywords``, ``title_exclude_eval`` .. tip:: @@ -61,6 +63,13 @@ Supports the following override variables: title_include_keywords: - "To Catch a Smuggler" + = Sports: + "~Maple Leafs Highlights": + url: "https://www.youtube.com/@NHL" + title_include_eval: "ALL" + title_include_keywords: + - "maple leafs" + - "highlights" Chunk Downloads --------------- diff --git a/src/ytdl_sub/prebuilt_presets/helpers/filtering.yaml b/src/ytdl_sub/prebuilt_presets/helpers/filtering.yaml index b964cc8c..4d99e93e 100644 --- a/src/ytdl_sub/prebuilt_presets/helpers/filtering.yaml +++ b/src/ytdl_sub/prebuilt_presets/helpers/filtering.yaml @@ -12,6 +12,11 @@ presets: description_include_keywords: "{ [] }" description_exclude_keywords: "{ [] }" + title_include_eval: "ANY" + title_exclude_eval: "ANY" + description_include_eval: "ANY" + description_exclude_eval: "ANY" + "%ensure_string": >- { %assert_then( @@ -32,21 +37,36 @@ presets: ) } + # $0 - var to evaluate + # $1 - keyword list + # $2 - eval type + "%contains_keywords_inner": >- + { + %elif( + %eq(%ensure_string($2), 'any'), + %contains_any( $0, $1 ), + %eq(%ensure_string($2), 'all'), + %contains_all( $0, $1 ), + %throw('Keyword eval must be either ANY or ALL') + ) + } + # $0 - var to evaluate # $1 - keyword list # $2 - variable name for error messages - # $3 - default return if keyword list is empty + # $3 - keyword eval + # $4 - default return if keyword list is empty "%contains_keywords": >- { %if( %bool( $1 ), - %contains_any( %lower($0), %ensure_lower_array($1, $2) ), - $3 + %contains_keywords_inner( %lower($0), %ensure_lower_array($1, $2), $3 ), + $4 ) } filter_exclude: - - "{ %not( %contains_keywords(title, title_include_keywords, 'title_include_keywords', true) ) }" - - "{ %not( %contains_keywords(description, description_include_keywords, 'description_include_keywords', true) ) }" - - "{ %contains_keywords(title, title_exclude_keywords, 'title_exclude_keywords', false) }" - - "{ %contains_keywords(description, description_exclude_keywords, 'description_exclude_keywords',false) }" \ No newline at end of file + - "{ %not( %contains_keywords(title, title_include_keywords, 'title_include_keywords', title_include_eval, true) ) }" + - "{ %not( %contains_keywords(description, description_include_keywords, 'description_include_keywords', description_include_eval, true) ) }" + - "{ %contains_keywords(title, title_exclude_keywords, 'title_exclude_keywords', title_exclude_eval, false) }" + - "{ %contains_keywords(description, description_exclude_keywords, 'description_exclude_keywords', description_exclude_eval, false) }" \ No newline at end of file diff --git a/src/ytdl_sub/script/functions/string_functions.py b/src/ytdl_sub/script/functions/string_functions.py index c2977db0..e9af7a54 100644 --- a/src/ytdl_sub/script/functions/string_functions.py +++ b/src/ytdl_sub/script/functions/string_functions.py @@ -40,6 +40,20 @@ class StringFunctions: ) ) + @staticmethod + def contains_all(string: String, contains_array: Array) -> Boolean: + """ + :description: + Returns true if all elements in ``contains_array`` are in ``string``. False otherwise. + """ + return Boolean( + all( + str(val) in string.value + for val in contains_array.value + if isinstance(val, (String, Integer, Boolean, Float)) + ) + ) + @staticmethod def slice(string: String, start: Integer, end: Optional[Integer] = None) -> String: """ diff --git a/tests/integration/prebuilt_presets/test_filter_keywords.py b/tests/integration/prebuilt_presets/test_filter_keywords.py index 41761b03..733f27b6 100644 --- a/tests/integration/prebuilt_presets/test_filter_keywords.py +++ b/tests/integration/prebuilt_presets/test_filter_keywords.py @@ -1,11 +1,8 @@ -import re - import pytest from expected_transaction_log import assert_transaction_log_matches from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError from ytdl_sub.subscriptions.subscription import Subscription -from ytdl_sub.utils.exceptions import ValidationException @pytest.fixture @@ -77,6 +74,39 @@ class TestFilterKeywords: transaction_log_summary_file_name=f"integration/prebuilt_presets/title_filter_keywords_{filter_mode}.txt", ) + @pytest.mark.parametrize("filter_mode", ["include", "exclude"]) + def test_title_all( + self, + config, + filter_subscription_dict, + output_directory, + subscription_name, + mock_download_collection_entries, + filter_mode: str, + ): + filter_subscription_dict["overrides"][f"title_{filter_mode}_eval"] = "all" + filter_subscription_dict["overrides"][f"title_{filter_mode}_keywords"] = [ + "MOCK", + "ENTRY", + "20-3", + ] + subscription = Subscription.from_dict( + config=config, + preset_name=subscription_name, + preset_dict=filter_subscription_dict, + ) + + with mock_download_collection_entries( + is_youtube_channel=False, num_urls=1, is_dry_run=True + ): + transaction_log = subscription.download(dry_run=True) + + assert_transaction_log_matches( + output_directory=output_directory, + transaction_log=transaction_log, + transaction_log_summary_file_name=f"integration/prebuilt_presets/title_filter_keywords_{filter_mode}.txt", + ) + @pytest.mark.parametrize("filter_mode", ["include", "exclude"]) def test_description( self, @@ -108,6 +138,38 @@ class TestFilterKeywords: transaction_log_summary_file_name=f"integration/prebuilt_presets/description_filter_keywords_{filter_mode}.txt", ) + @pytest.mark.parametrize("filter_mode", ["include", "exclude"]) + def test_description_all( + self, + config, + filter_subscription_dict, + output_directory, + subscription_name, + mock_download_collection_entries, + filter_mode: str, + ): + filter_subscription_dict["overrides"][f"description_{filter_mode}_eval"] = "ALL" + filter_subscription_dict["overrides"][f"description_{filter_mode}_keywords"] = [ + "descr", + "iption", + ] + subscription = Subscription.from_dict( + config=config, + preset_name=subscription_name, + preset_dict=filter_subscription_dict, + ) + + with mock_download_collection_entries( + is_youtube_channel=False, num_urls=1, is_dry_run=True + ): + transaction_log = subscription.download(dry_run=True) + + assert_transaction_log_matches( + output_directory=output_directory, + transaction_log=transaction_log, + transaction_log_summary_file_name=f"integration/prebuilt_presets/description_filter_keywords_{filter_mode}.txt", + ) + @pytest.mark.parametrize( "keyword_variable", [ @@ -169,3 +231,35 @@ class TestFilterKeywords: pytest.raises(UserThrownRuntimeError, match="filter keywords must be strings"), ): _ = subscription.download(dry_run=True) + + @pytest.mark.parametrize( + "keyword_variable", + [ + "title_include", + "title_exclude", + "description_include", + "description_exclude", + ], + ) + def test_error_not_correct_eval( + self, + config, + filter_subscription_dict, + output_directory, + subscription_name, + mock_download_collection_entries, + keyword_variable, + ): + filter_subscription_dict["overrides"][f"{keyword_variable}_keywords"] = ["hmm"] + filter_subscription_dict["overrides"][f"{keyword_variable}_eval"] = "LOL" + subscription = Subscription.from_dict( + config=config, + preset_name=subscription_name, + preset_dict=filter_subscription_dict, + ) + + with ( + mock_download_collection_entries(is_youtube_channel=False, num_urls=1, is_dry_run=True), + pytest.raises(UserThrownRuntimeError, match="Keyword eval must be either ANY or ALL"), + ): + _ = subscription.download(dry_run=True) diff --git a/tests/unit/script/functions/test_string_functions.py b/tests/unit/script/functions/test_string_functions.py index a5a2961d..f5c85741 100644 --- a/tests/unit/script/functions/test_string_functions.py +++ b/tests/unit/script/functions/test_string_functions.py @@ -126,6 +126,14 @@ class TestNumericFunctions: output = single_variable_output(f"{{%contains_any('a brown dog', {value})}}") assert output == expected_output + @pytest.mark.parametrize( + "value, expected_output", + [("['a', 'b', 'c']", False), ("['nope', [], {}]", False), ("['a', 'dog']", True)], + ) + def test_contains_all(self, value, expected_output): + output = single_variable_output(f"{{%contains_all('a brown dog', {value})}}") + assert output == expected_output + @pytest.mark.parametrize( "input_string, split, max_split, expected_output", [ From 3bf31a5e079c432725fa6a5612176a5ce3b0f488 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 23:18:33 -0800 Subject: [PATCH 05/48] [DEV] Bump pylint from 3.3.1 to 3.3.2 (#1132) Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.1 to 3.3.2. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.1...v3.3.2) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b18d7378..da745545 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.10.0", "isort==5.13.2", - "pylint==3.3.1", + "pylint==3.3.2", ] docs = [ "sphinx>=7,<9", From d83523ffe539a3958a429f284d8da5bb1b061a04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 23:18:49 -0800 Subject: [PATCH 06/48] [DEV] Update twine requirement from ~=5.0 to >=5,<7 (#1133) Updates the requirements on [twine](https://github.com/pypa/twine) to permit the latest version. - [Release notes](https://github.com/pypa/twine/releases) - [Changelog](https://github.com/pypa/twine/blob/main/docs/changelog.rst) - [Commits](https://github.com/pypa/twine/compare/5.0.0...6.0.1) --- updated-dependencies: - dependency-name: twine dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index da745545..6117cd5d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,7 +60,7 @@ docs = [ ] build = [ "build~=1.2", - "twine~=5.0", + "twine>=5,<7", "pyinstaller~=6.5", ] [project.scripts] From d84310a13cdea3259e2450fa6b12a5aa818231e4 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Tue, 3 Dec 2024 18:16:51 -0800 Subject: [PATCH 07/48] [BACKEND] Update yt-dlp to 2024.12.3 (#1135) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6117cd5d..6a917d19 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2024.11.4", + "yt-dlp[default]==2024.12.3", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From d06ad079162c9e108779d3ffed96fd22e39d1525 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Dec 2024 08:50:58 -0800 Subject: [PATCH 08/48] [BACKEND] Bump yt-dlp[default] from 2024.12.3 to 2024.12.6 (#1136) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2024.12.3 to 2024.12.6. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2024.12.03...2024.12.06) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6a917d19..63f9279d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2024.12.3", + "yt-dlp[default]==2024.12.6", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From ebe99083616c7b3ec3a1490b1c3c789c625c77cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 21:35:00 -0800 Subject: [PATCH 09/48] Bump yt-dlp[default] from 2024.12.6 to 2024.12.13 (#1138) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2024.12.6 to 2024.12.13. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2024.12.06...2024.12.13) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 63f9279d..8ad1494a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2024.12.6", + "yt-dlp[default]==2024.12.13", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 07d810171d88fa8ab07644716dca266ce5210b27 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 21 Dec 2024 09:13:09 -0800 Subject: [PATCH 10/48] [DOCS] Rewrite getting started guide (#1129) --- docs/source/config_reference/index.rst | 2 +- .../config_reference/subscription_yaml.rst | 121 +++++++++++ .../config_reference/subscriptions_yaml.rst | 114 ----------- docs/source/deprecation_notices.rst | 2 +- .../advanced_configuration.rst | 56 ------ .../getting_started/automating_downloads.rst | 4 +- .../guides/getting_started/examples.rst | 15 -- .../guides/getting_started/first_config.rst | 190 +++++++++++++++++- .../guides/getting_started/first_download.rst | 50 +++-- .../guides/getting_started/first_sub.rst | 39 ++-- docs/source/guides/getting_started/index.rst | 91 ++------- 11 files changed, 386 insertions(+), 298 deletions(-) create mode 100644 docs/source/config_reference/subscription_yaml.rst delete mode 100644 docs/source/config_reference/subscriptions_yaml.rst delete mode 100644 docs/source/guides/getting_started/advanced_configuration.rst delete mode 100644 docs/source/guides/getting_started/examples.rst diff --git a/docs/source/config_reference/index.rst b/docs/source/config_reference/index.rst index daea6857..0fe2f88c 100644 --- a/docs/source/config_reference/index.rst +++ b/docs/source/config_reference/index.rst @@ -6,7 +6,7 @@ This section contains direct references to the code of ``ytdl-sub`` and informat .. toctree:: config_yaml - subscriptions_yaml + subscription_yaml plugins scripting/index prebuilt_presets/index \ No newline at end of file diff --git a/docs/source/config_reference/subscription_yaml.rst b/docs/source/config_reference/subscription_yaml.rst new file mode 100644 index 00000000..0505d7bb --- /dev/null +++ b/docs/source/config_reference/subscription_yaml.rst @@ -0,0 +1,121 @@ +================== +Subscription File +================== + +A subscription file is designed to both define and organize many things +to download in condensed YAML. + +.. hint:: + + Read the :ref:`getting started guide ` + first before reviewing this section. + +File Preset +----------- +Many examples show ``__preset__`` at the top. This is known as the *subscription file preset*. +It is where a single :ref:`preset ` +can be defined that gets applied to each subscription within the file. + +This is a good place to apply file-wide variables such as ``tv_show_directory`` or +supply a cookies file path. + +.. code-block:: yaml + + __preset__: + overrides: + tv_show_directory: "/tv_shows" + + ytdl_options: + cookiefile: "/config/cookie.txt" + + +Layout +------ +A subscription file is comprised of YAML keys and values. Keys can be either + +- a preset +- an override value +- a subscription name + +Take the following example: + +.. code-block:: yaml + + Jellyfin TV Show by Date: + = News: + "Breaking News": "https://www.youtube.com/@SomeBreakingNews" + "BBC News": "https://www.youtube.com/@BBCNews" + +All three types of keys are used for the following: + +- ``Jellyfin TV Show by Date`` - a prebuilt preset +- ``= News`` - an override value for genre +- ``Breaking News``, ``BBC News`` - The subscription names + +The bottom-most keys, or leaf keys, should always be the subscription name. +It is good practice to put subscription names in quotes to differentiate +between preset names and subscription names. + +Values should always be the subscription itself. The simplest form is +just the URL. Further sections will show more exotic examples that go beyond +a single URL. + + +Inheritance +----------- +A subscription inherits every key above it. In the above example, +both ``Breaking News`` and ``BBC News`` inherits the ``Jellyfin TV Show by Date`` +preset and the ``= News`` override value. + +.. note:: + + There are no limits or boundaries on how one structures + their presets. This flexibility is intended for subscription authors + to organize their downloads as they see fit. + +Multi Keys +---------- +Subscription keys support pipe syntax, or ``|``, which allows multiple +keys to be defined on a single line. The following is equivalent to the above +example: + +.. code-block:: yaml + + Jellyfin TV Show by Date | = News: + "Breaking News": "https://www.youtube.com/@SomeBreakingNews" + "BBC News": "https://www.youtube.com/@BBCNews" + +Override Mode +------------- +Often times, it is convenient to set multiple override values for +a single subscription. We can put a preset in *override mode* by +using tilda syntax, or ``~``. + +Suppose we want to apply the :ref:`Only Recent ` +preset to the above examples. But for ``BBC News`` specifically, we want to +set the date range to be different than the default ``2months`` value to +``2weeks``. + +We can change it as follows: + +.. code-block:: yaml + + Jellyfin TV Show by Date + = News | Only Recent: + "Breaking News": "https://www.youtube.com/@SomeBreakingNews" + "~BBC News": + url: "https://www.youtube.com/@BBCNews" + only_recent_date_range: "2weeks" + +.. important:: + + When using override mode, we need to set the ``url`` + variable since we are no longer using the simplified + *subscription_value*. For more info on how this works, + read about :ref:`subscription variables `. + +Map Mode +-------- +Map mode is for highly advanced presets that benefit +from a more complex subscription definition. TODO: Show music video +example here. diff --git a/docs/source/config_reference/subscriptions_yaml.rst b/docs/source/config_reference/subscriptions_yaml.rst deleted file mode 100644 index 508fbc82..00000000 --- a/docs/source/config_reference/subscriptions_yaml.rst +++ /dev/null @@ -1,114 +0,0 @@ -================== -Subscriptions File -================== - -The ``subscriptions.yaml`` file is where we use :ref:`config_reference/config_yaml:presets` -to define a ``subscription``: something we want to recurrently download, such as a specific -channel or playlist. - -The only difference between a ``subscription`` and ``preset`` is that the subscription -must have all required variables defined to perform a download. - -Below is an example that downloads a YouTube playlist: - -.. code-block:: yaml - :caption: config.yaml - - presets: - playlist_preset_ex: - download: "{url}" - output_options: - output_directory: "{output_directory}/{playlist_name}" - file_name: "{playlist_name}.{title}.{ext}" - overrides: - output_directory: "/path/to/ytdl-sub-videos" - -.. code-block:: yaml - :caption: subscription.yaml - - my_subscription_name: - preset: "playlist_preset_ex" - overrides: - playlist_name: "diy-playlist" - url: "https://youtube.com/playlist?list=UCsvn_Po0SmunchJYtttWpOxMg" - -Our preset ``playlist_preset_ex`` defines three -custom variables: ``{output_directory}``, ``{playlist_name}``, and ``{url}``. The subscription sets -the ``parent preset`` to ``playlist_preset_ex``, and must define the variables ``{playlist_name}`` -and ``{url}`` since the preset did not. - -Beautifying Subscriptions -------------------------- -Subscriptions support using presets as keys, and using keys to set override variables as values. -For example: - -.. code-block:: yaml - :caption: subscription.yaml - - TV Show Full Archive: - = News: - "Breaking News": "https://www.youtube.com/@SomeBreakingNews" - - TV Show Only Recent: - = Tech | TV-Y: - "Two Minute Papers": "https://www.youtube.com/@TwoMinutePapers" - -Will create two subscriptions named "Breaking News" and "Two Minute Papers", equivalent to: - -.. code-block:: yaml - - "Breaking News": - preset: - - "TV Show Full Archive" - - overrides: - subscription_indent_1: "News" - subscription_name: "Breaking News" - subscription_value: "https://www.youtube.com/@SomeBreakingNews" - - "Two Minute Papers": - preset: - - "TV Show Only Recent" - - overrides: - subscription_indent_1: "Tech" - subscription_indent_2: "TV-Y" - subscription_name: "Two Minute Papers" - subscription_value: "https://www.youtube.com/@TwoMinutePapers" - -You can provide as many parent presets in the form of ``keys``, and subscription indents as ``= keys``. -This can drastically simplify subscription definitions by setting things like so in your -parent preset: - -.. code-block:: yaml - - presets: - "TV Show Preset": - overrides: - subscription_indent_1: "default-genre" - subscription_indent_2: "default-content-rating" - - tv_show_name: "{subscription_name}" - url: "{subscription_value}" - genre: "{subscription_indent_1}" - content_rating: "{subscription_indent_2}" - -File Preset ------------ - -You can apply a preset to all subscriptions in the ``subscription.yaml`` file -by using the file-wide ``__preset__``: - -.. code-block:: yaml - :caption: subscription.yaml - - __preset__: - preset: "playlist_preset_ex" - - my_subscription_name: - overrides: - url: "https://youtube.com/playlist?list=UCsvn_Po0SmunchJYtttWpOxMg" - playlist_name: "diy-playlist" - -This ``subscription.yaml`` is equivalent to the one above it because all -subscriptions automatically set ``__preset__`` as a ``parent preset``. diff --git a/docs/source/deprecation_notices.rst b/docs/source/deprecation_notices.rst index fc238128..4c5b6a37 100644 --- a/docs/source/deprecation_notices.rst +++ b/docs/source/deprecation_notices.rst @@ -46,7 +46,7 @@ Oct 2023 subscription preset and value ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The use of ``__value__`` will go away in Dec 2023 in favor of the method found in -:ref:`config_reference/subscriptions_yaml:beautifying subscriptions`. ``__preset__`` will still be supported for the time being. +:ref:`config_reference/subscription_yaml:Subscription File`. ``__preset__`` will still be supported for the time being. July 2023 --------- diff --git a/docs/source/guides/getting_started/advanced_configuration.rst b/docs/source/guides/getting_started/advanced_configuration.rst deleted file mode 100644 index 7ab05e31..00000000 --- a/docs/source/guides/getting_started/advanced_configuration.rst +++ /dev/null @@ -1,56 +0,0 @@ -Advanced Configuration -====================== - -If the :doc:`prebuilt presets ` aren't suitable for your needs, you may want to set up an advanced configuration. - -Layout of a Config file ------------------------ - -The layout of the ``config.yaml`` file is relatively straightforward: - -.. code-block:: yaml - - presets: - - preset_name: - plugin1: - plugin1_option1: value1 - -This creates a preset named ``preset_name``, which contains the made-up -:doc:`plugin ` ``plugin1``. Under each plugin are its settings. -A preset can contain multiple plugins. - -Preset Inheritance ------------------- - -You can modularize your presets via preset inheritance. For example, - -.. code-block:: yaml - - presets: - - TV Show: - preset: - - "Jellyfin TV Show by Date" - - overrides: - tv_show_directory: "/ytdl_sub_tv_shows" - - TV Show Only Recent: - preset: - - "TV Show" - - "Only Recent" - - overrides: - only_recent_date_range: "3weeks" - -This creates two presets: - -* ``TV Show`` - * Inherits the :doc:`prebuilt ` ``Jellyfin TV Show by Date`` preset - * Sets the output tv show directory -* ``TV Show Only Recent`` - * Inherits the ``TV Show`` preset made above it and the ``Only Recent`` prebuilt preset - * Sets only_recent preset to only keep the last 3 weeks worth of videos - -Inheritance makes it easy to extend existing presets to include logic for your specific needs. diff --git a/docs/source/guides/getting_started/automating_downloads.rst b/docs/source/guides/getting_started/automating_downloads.rst index 5cea7cc8..e1e1441d 100644 --- a/docs/source/guides/getting_started/automating_downloads.rst +++ b/docs/source/guides/getting_started/automating_downloads.rst @@ -1,7 +1,9 @@ Automating Downloads ==================== -One of the key capabilities of ``ytdl-sub`` is how well it runs without user input, but to take advantage of this you must set up scheduling to execute the commands at some interval. How you set up this scheduling depends on which version of ``ytdl-sub`` you downloaded. +One of the key capabilities of ``ytdl-sub`` automating new downloads. +To take advantage of this, you must set up scheduling to execute the commands at some interval. +How you set up this scheduling depends on which version of ``ytdl-sub`` you downloaded. :ref:`Guide for Docker and Unraid Containers ` diff --git a/docs/source/guides/getting_started/examples.rst b/docs/source/guides/getting_started/examples.rst deleted file mode 100644 index 7045ef7b..00000000 --- a/docs/source/guides/getting_started/examples.rst +++ /dev/null @@ -1,15 +0,0 @@ -===================== -Using Example Configs -===================== -Copy and paste the examples into local yaml files, modify the -``working_directory`` and ``output_directory`` with your desired paths, -and perform a dry-run using - -.. code-block:: bash - - ytdl-sub \ - --dry-run \ - --config path/to/config.yaml \ - sub path/to/subscriptions.yaml - -This will simulate what a download will look like. \ No newline at end of file diff --git a/docs/source/guides/getting_started/first_config.rst b/docs/source/guides/getting_started/first_config.rst index a1bfbef8..4b80a18b 100644 --- a/docs/source/guides/getting_started/first_config.rst +++ b/docs/source/guides/getting_started/first_config.rst @@ -1,33 +1,203 @@ Basic Configuration =================== -Your first configuration will look pretty simple: +A configuration file serves two purposes: + +1. Set advanced functionality that is not specifiable in a subscription file, such as working directory location. These + are set underneath ``configuration``. +2. Create custom presets, which can drastically simplify your subscription file. These are defined underneath ``presets``. + Presets are intended to be applicable and reusable across multiple subscriptions. + +Below is a common configuration: .. code-block:: yaml :linenos: configuration: - working_directory: '.ytdl-sub-downloads' + working_directory: '/mnt/ssd/.ytdl-sub-downloads' presets: TV Show: preset: - "Jellyfin TV Show by Date" - - "Only Recent" + - "Max 1080p" + + embed_thumbnail: True + + throttle_protection: + sleep_per_download_s: + min: 2.2 + max: 10.8 + sleep_per_subscription_s: + min: 9.0 + max: 14.1 + max_downloads_per_subscription: + min: 10 + max: 36 overrides: tv_show_directory: "/ytdl_sub_tv_shows" + TV Show Only Recent: + preset: + - "TV Show" + - "Only Recent" -The first two lines in this ``config.yaml`` file are the ``configuration``, and define the ``working_directory``, which is described near the bottom of :ref:`this section ` +Configuration Section +--------------------- + +The :ref:`configuration ` section sets options for ytdl-sub execution. + +.. code-block:: yaml + :lineno-start: 1 + + configuration: + working_directory: '/mnt/ssd/.ytdl-sub-downloads' + +Preset Section +-------------- + +Underneath ``presets``, we define two custom presets with the names ``TV Show`` and ``TV Show Only Recent``. + +.. code-block:: yaml + + presets: + TV Show: + ... + TV Show Only Recent: + ... + +The indentation example above shows how to define multiple presets. + +Custom Preset Definition +------------------------ + +Before we break down the above ``TV Show`` preset, lets first outline a preset layout: + +.. code-block:: yaml + + Preset Name: + preset: + ... + + plugin(s): + ... + + overrides: + ... + +Presets can contain three important things: + +1. ``preset`` section, which can inherit `prebuilt presets ` + or other presets defined in your config. +2. `Plugin definitions ` +3. `overrides `, which can override inherited preset variables + +Presets do not have to define all of these, as we'll see in the ``TV Show Only Recent`` preset. + +Inheriting Presets +~~~~~~~~~~~~~~~~~~ + +.. code-block:: yaml + :lineno-start: 5 + + TV Show: + preset: + - "Jellyfin TV Show by Date" + - "Max 1080p" + +The following snippet shows that the ``TV Show`` preset will inherit all properties +of the prebuilt presets ``Jellyfin TV Show by Date`` and ``Max 1080p`` in that order. + +Order matters for preset inheritance. Bottom-most presets will override ones above them. + +It is highly advisable to use `prebuilt presets ` as +a starting point for custom preset building, as they do the work of preset building to ensure things show as expected +in their respective media players. Read on to see how to override prebuilt preset specifics such as title. + +Defining Plugins +~~~~~~~~~~~~~~~~ + +.. code-block:: yaml + :lineno-start: 10 + + embed_thumbnail: True + + throttle_protection: + sleep_per_download_s: + min: 2.2 + max: 10.8 + sleep_per_subscription_s: + min: 9.0 + max: 14.1 + max_downloads_per_subscription: + min: 10 + max: 36 + +Our ``TV Show`` sets two plugins, `throttle_protection ` and +`embed_thumbnail `. Each plugin's documentation shows the respective +fields that they support. + +If an inherited preset defines the same plugin, the custom preset will use 'merge-and-append' strategy to +combine their definitions. What this means is: + +1. If the field is a map (i.e. has sub-params like ``sleep_per_download_s`` above) or array, it will try to merge them +2. If both the inherited preset and custom preset set the same exact field and value (i.e. ``embed_thumbnail``) + the custom preset will overwrite it -Line 4 begins the definition of your custom ``presets``, with line 5 being the name of your first custom ``preset``. +Setting Override Variables +~~~~~~~~~~~~~~~~~~~~~~~~~~ -Lines 7 and 8 tell ``ytdl-sub`` which :doc:`/prebuilt_presets/index` to expand on; these ``presets`` already indicate that the downloaded files should be: +.. code-block:: yaml + :lineno-start: 23 -- in a format usable by, and with metadata accessible to, Jellyfin -- sorted by upload date, and -- only uploaded in the last 2 months (and will also delete any files in the media library which were uploaded over 2 months ago) + overrides: + tv_show_directory: "/ytdl_sub_tv_shows" -Line 11 is an override variable, ``tv_show_directory``, that tells ``ytdl-sub`` where to save your downloaded files once they've been processed, also known as the ``output_directory``. In this case, the downloaded files will be saved to the ``youtube`` folder in the root ``tv_shows`` directory. \ No newline at end of file +All override variables reside underneath the `overrides ` section. + +It is important to remember that individual subscriptions can override specific override variables. +When defining variables in a preset, it is best practice to define them with the intention that + +1. All subscriptions will use its value them +2. Use them as placeholders to perform other logic, then have subscriptions or child presets + define their specific value + +For simplicity, we'll focus on (1) for now. The above snippet sets the ``tv_show_directory`` +variable to a file path. This variable name is specific to the prebuilt TV show presets. + +See the `prebuilt preset reference ` section is where we +The first :ref:`__preset__ ` section is where we can set modifications that apply to every subscription in this file. +This snippet specifically adds two :ref:`override ` variables, +which are used by the presets below. + +.. note:: + It is tempting to put any override underneath ``overrides``. Keep in mind that this section + is solely for variable defining. Other :ref:`plugins ` need to be + set at the same indentation level as ``overrides``, not within it. + + ------------------------------------- .. code-block:: yaml @@ -73,6 +82,8 @@ subscriptions to look like TV shows in the Jellyfin media player (can be changed one of the presets outlined in the comment above). Setting it as a YAML key implies that all subscriptions underneath it will *inherit* this preset. +This preset expects the variable ``tv_show_directory`` to be set, which we do above. + ------------------------------------- .. code-block:: yaml @@ -82,17 +93,13 @@ subscriptions underneath it will *inherit* this preset. = Documentaries: Line 12 sets the key to ``= Documentaries``. When keys are prefixed with ``=``, it means we are -setting the -:ref:`subscription indent variable `. -For TV Show presets, the first subscription indent variable maps to the TV show's genre. -Setting subscription indent variables as a key implies all subscriptions underneath it will -have this variable set. +setting the genre. This value will get written to the respective metadata tags for both TV show +and music presets. -To better understand what variables are used in prebuilt presets, refer to the -:ref:`prebuilt preset reference `. -Here you will see the underlying variables used in prebuilt presets that can be overwritten. -We already overwrote a few of the variables in the ``__preset__`` section above to define our -output directory. +Behind the scenes, this sets the override variable ``subscription_indent_1``. Further documentation +can be found here for +:ref:`subscription syntax ` and +:ref:`subscription variables `. ------------------------------------- @@ -104,8 +111,10 @@ output directory. "NOVA PBS": "https://www.youtube.com/@novapbs" Line 13 is where we define our first subscription. We set the subscription name to ``NOVA PBS``, -and the subscription value to ``https://www.youtube.com/@novapbs``. Referring to the -:ref:`TV show preset reference `, +and the subscription value to ``https://www.youtube.com/@novapbs``. + +To see how presets ingest subscription definitions, refer to the +:ref:`preset references `, we can see that ``{subscription_name}`` is used to set the ``tv_show_name`` variable. ------------------------------------- diff --git a/docs/source/guides/getting_started/index.rst b/docs/source/guides/getting_started/index.rst index 3aa856bc..c86ed757 100644 --- a/docs/source/guides/getting_started/index.rst +++ b/docs/source/guides/getting_started/index.rst @@ -1,25 +1,15 @@ Getting Started =============== -Now that you've completed your install of ``ytdl-sub``, it's time to get started. This is a 3-step process: - -- Create your configuration file (if the :doc:`/prebuilt_presets/index` don't fit your needs) -- Create your subscription file -- Automate starting YTDL-Sub - Prerequisite Knowledge ---------------------- -.. _navigate directories: https://en.wikipedia.org/wiki/Cd_(command) -.. _YAML syntax: https://yaml.org/spec/1.2.2/#chapter-2-language-overview - - In order to use ``ytdl-sub`` in any of the forms listed in these docs, you will need some basic knowledge. Be sure that you: - ☑ Can `navigate directories`_ in a command line interface (or CLI) + ☑ Can navigate directories in a command line interface (or CLI) - ☑ Have a basic understanding of `YAML syntax`_ + ☑ Have a basic understanding of YAML syntax If you plan on using the headless image of ``ytdl-sub``, you: ☑ Can use ``nano`` or ``vim`` to edit OR @@ -29,76 +19,39 @@ If you plan on using the headless image of ``ytdl-sub``, you: Additional useful (but not required) knowledge: ☑ Understanding how :yt-dlp:`\ ` works -Overview --------- -``ytdl-sub`` uses two types of YAML files: +Terminology +----------- -subscriptions.yaml -~~~~~~~~~~~~~~~~~~ -Defines ``subscriptions``, which specify the media we want to recurrently download, like YouTube -channels and playlists, SoundCloud artists, or any -:yt-dlp:`yt-dlp supported site `. ``subscriptions`` use ``presets`` -to define how ``ytdl-sub`` should handle downloading, processing, and saving them. +Must-know terminology: -``ytdl-sub`` comes packaged with many -:ref:`prebuilt presets ` -that will play nicely with well-known media players. +- ``subscription``: URL(s) that you want to download with specific metadata requirements. +- ``preset``: A media profile comprised of YAML configuration that can specify anything from metadata layout, media quality, or any feature of ytdl-sub, to apply to subscriptions. A preset can inherit other presets. +- ``prebuilt preset``: Presets that are included in ytdl-sub. These do most of the work defining plugins, overrides, etc in order to make downloads ready for player consumption. +- ``override``: Verb describing the act of overriding something in a preset. For example, the TV Show presets practically expect you to *override* the URL variable to tell ytdl-sub where to download from. +- ``override variables``: User-defined variables that are intended to *override* something. +- ``subscription file``: The file to specify all of your subscriptions and some override variables. -config.yaml -~~~~~~~~~~~ -To customize ``ytdl-sub`` to beyond the prebuilt presets, you will need a ``config.yaml`` file. This -file is where custom ``presets`` can be defined to orchestrate ``ytdl-sub`` to your very specific needs. +Intermediate terminology: -Running ytdl-sub -~~~~~~~~~~~~~~~~ -To invoke ``ytdl-sub`` to download subscriptions, use the following command: +- ``plugin``: Modular logic to apply to a subscription. To use a plugin, it must be defined in a preset. +- ``config file``: An optional file where you can define custom presets and other advanced configuration. +- ``yt-dlp``: The underlying application that handles downloading for ytdl-sub. -.. tab-set-code:: +Advanced terminology: - .. code-block:: shell - - ytdl-sub sub subscriptions.yaml - - .. code-block:: powershell - - ytdl-sub.exe sub subscriptions.yaml - -``ytdl-sub`` initially downloads all files to a defined ``working_directory``. This is a temporary -storage spot for metadata and media files so that errors during processing- if they occur- don't -affect your existing media library. Once all file processing is complete, your media files are -moved to the ``output_directory``. +- ``entry variables``: Variables that derive from a downloaded yt-dlp entry (media). +- ``static variables``: Variables that do not have a dependency to entry variables. +- ``scripting``: Syntax that allows the use of entry variables, static variables, and functions in override variables. Ready to Start? --------------- - -Now that you have installed ``ytdl-sub``, checked your skills, and gotten a bit of background on how ``ytdl-sub`` functions, read through the articles below to get started: - -:doc:`Step 1: Initial Subscriptions ` - -:doc:`Step 2: Your First Download ` - -:doc:`Step 3: Automating Downloads ` - -Want to go a step further? - -If you want to use atypical paths or specific configuration options, check out :doc:`Basic Configuration ` - -For tips on creating your own presets when the prebuilt presets aren't cutting it, check out :doc:`Advanced Configuration ` - -Other docs that may be of use: - -:doc:`/prebuilt_presets/index` - -:doc:`examples` +Now that you've completed your install of ``ytdl-sub``, it's time to get started. +It is recommended to go through the below sections in order to fully grasp ytdl-sub. .. toctree:: - :hidden: - :caption: Getting Started Guide - :maxdepth: 1 + :maxdepth: 2 first_sub first_download automating_downloads first_config - advanced_configuration - examples \ No newline at end of file From 74c7152cb1faf2b632631889e667cff14161b800 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 21 Dec 2024 09:33:00 -0800 Subject: [PATCH 11/48] [DOCS] Fix references (#1140) --- .../guides/getting_started/first_config.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/source/guides/getting_started/first_config.rst b/docs/source/guides/getting_started/first_config.rst index 4b80a18b..63685116 100644 --- a/docs/source/guides/getting_started/first_config.rst +++ b/docs/source/guides/getting_started/first_config.rst @@ -88,10 +88,10 @@ Before we break down the above ``TV Show`` preset, lets first outline a preset l Presets can contain three important things: -1. ``preset`` section, which can inherit `prebuilt presets ` +1. ``preset`` section, which can inherit :ref:`prebuilt presets ` or other presets defined in your config. -2. `Plugin definitions ` -3. `overrides `, which can override inherited preset variables +2. :ref:`Plugin definitions ` +3. :ref:`overrides `, which can override inherited preset variables Presets do not have to define all of these, as we'll see in the ``TV Show Only Recent`` preset. @@ -111,7 +111,7 @@ of the prebuilt presets ``Jellyfin TV Show by Date`` and ``Max 1080p`` in that o Order matters for preset inheritance. Bottom-most presets will override ones above them. -It is highly advisable to use `prebuilt presets ` as +It is highly advisable to use :ref:`prebuilt presets ` as a starting point for custom preset building, as they do the work of preset building to ensure things show as expected in their respective media players. Read on to see how to override prebuilt preset specifics such as title. @@ -134,8 +134,8 @@ Defining Plugins min: 10 max: 36 -Our ``TV Show`` sets two plugins, `throttle_protection ` and -`embed_thumbnail `. Each plugin's documentation shows the respective +Our ``TV Show`` sets two plugins, :ref:`throttle_protection ` and +:ref:`embed_thumbnail `. Each plugin's documentation shows the respective fields that they support. If an inherited preset defines the same plugin, the custom preset will use 'merge-and-append' strategy to @@ -155,7 +155,7 @@ Setting Override Variables overrides: tv_show_directory: "/ytdl_sub_tv_shows" -All override variables reside underneath the `overrides ` section. +All override variables reside underneath the :ref:`overrides ` section. It is important to remember that individual subscriptions can override specific override variables. When defining variables in a preset, it is best practice to define them with the intention that @@ -167,7 +167,7 @@ When defining variables in a preset, it is best practice to define them with the For simplicity, we'll focus on (1) for now. The above snippet sets the ``tv_show_directory`` variable to a file path. This variable name is specific to the prebuilt TV show presets. -See the `prebuilt preset reference ` to see all available variables that are overridable. From e0441b540599a71ff591592cf602fcec236f8dfa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:39:23 -0800 Subject: [PATCH 12/48] Bump yt-dlp[default] from 2024.12.13 to 2024.12.23 (#1144) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2024.12.13 to 2024.12.23. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2024.12.13...2024.12.23) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8ad1494a..187f05d1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2024.12.13", + "yt-dlp[default]==2024.12.23", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 57c5d3c80070b33fe0481c6caf6a0d59516b538e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Dec 2024 19:39:47 -0800 Subject: [PATCH 13/48] [DEV] Bump pylint from 3.3.2 to 3.3.3 (#1145) Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.2 to 3.3.3. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.2...v3.3.3) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 187f05d1..7c533752 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.10.0", "isort==5.13.2", - "pylint==3.3.2", + "pylint==3.3.3", ] docs = [ "sphinx>=7,<9", From d3ac54deaef51e3529ea955d004097891ccdbb85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 14:43:23 -0800 Subject: [PATCH 14/48] Bump yt-dlp[default] from 2024.12.23 to 2025.1.12 (#1158) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2024.12.23 to 2025.1.12. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2024.12.23...2025.01.12) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7c533752..d806a7cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2024.12.23", + "yt-dlp[default]==2025.1.12", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From f1db01bf2f8360381793aa3ce2a8a4aedd866ed5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2025 00:16:44 -0800 Subject: [PATCH 15/48] Bump yt-dlp[default] from 2025.1.12 to 2025.1.15 (#1162) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.1.12 to 2025.1.15. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.01.12...2025.01.15) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d806a7cd..046e6b06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.1.12", + "yt-dlp[default]==2025.1.15", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 2b1e74bc8ed89a3746e12fafa9da6bbd37e8985d Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 26 Jan 2025 21:07:54 -0800 Subject: [PATCH 16/48] [DOCKER] Export SSL certs (#1163) Fixes a common issue with downloading channel thumbnails and fanart. --- docker/Dockerfile | 4 +++- docker/Dockerfile.gui | 6 ++++-- docker/Dockerfile.ubuntu | 6 ++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index e9015270..bcc213e6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -3,8 +3,10 @@ FROM ghcr.io/linuxserver/baseimage-alpine:edge ############################################################################### # YTDL-SUB INSTALL -# Needed for phantomjs +# For phantomjs ENV OPENSSL_CONF="/etc/ssl" +# For downloading thumbnails +ENV SSL_CERT_DIR="/etc/ssl/certs/" COPY root/ / RUN mkdir -p /config && \ diff --git a/docker/Dockerfile.gui b/docker/Dockerfile.gui index bd745f0e..0b095a27 100644 --- a/docker/Dockerfile.gui +++ b/docker/Dockerfile.gui @@ -1,7 +1,9 @@ FROM lscr.io/linuxserver/code-server:4.18.0-ls181 -# Needed for phantomjs -ENV OPENSSL_CONF=/etc/ssl +# For phantomjs +ENV OPENSSL_CONF="/etc/ssl" +# For downloading thumbnails +ENV SSL_CERT_DIR="/etc/ssl/certs/" ############################################################################### # YTDL-SUB INSTALL diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu index 798e07a3..bef0f137 100644 --- a/docker/Dockerfile.ubuntu +++ b/docker/Dockerfile.ubuntu @@ -3,8 +3,10 @@ FROM ghcr.io/linuxserver/baseimage-ubuntu:jammy # https://askubuntu.com/questions/972516/debian-frontend-environment-variable ARG DEBIAN_FRONTEND=noninteractive -# Needed for phantomjs -ENV OPENSSL_CONF=/etc/ssl +# For phantomjs +ENV OPENSSL_CONF="/etc/ssl" +# For downloading thumbnails +ENV SSL_CERT_DIR="/etc/ssl/certs/" ############################################################################### # YTDL-SUB INSTALL From d25cde5122531f3f33588b41a24dd59a4b1139b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jan 2025 21:33:35 -0800 Subject: [PATCH 17/48] Bump yt-dlp[default] from 2025.1.15 to 2025.1.26 (#1164) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.1.15 to 2025.1.26. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.01.15...2025.01.26) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 046e6b06..5ddd4916 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.1.15", + "yt-dlp[default]==2025.1.26", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From cd58cfe13f404bbfe8d863458f09e86cec5bdaac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 12:05:19 -0800 Subject: [PATCH 18/48] [DEV] Bump pylint from 3.3.3 to 3.3.4 (#1165) Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.3 to 3.3.4. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.3...v3.3.4) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5ddd4916..f7c38964 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.10.0", "isort==5.13.2", - "pylint==3.3.3", + "pylint==3.3.4", ] docs = [ "sphinx>=7,<9", From 8d992cbcab067356b0a2d32662d77eeb8878cbef Mon Sep 17 00:00:00 2001 From: Sammy Chang <20074034+schang1146@users.noreply.github.com> Date: Fri, 31 Jan 2025 08:42:15 -0800 Subject: [PATCH 19/48] [DOCS] Add note to restart Docker container (#1168) --- docs/source/guides/getting_started/automating_downloads.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/source/guides/getting_started/automating_downloads.rst b/docs/source/guides/getting_started/automating_downloads.rst index e1e1441d..9608a7b1 100644 --- a/docs/source/guides/getting_started/automating_downloads.rst +++ b/docs/source/guides/getting_started/automating_downloads.rst @@ -52,6 +52,9 @@ Docker and Unraid This will run the script every 6 hours. To run every hour, change ``*/6`` to ``*/1``, or to run once a day, change the same value to the hour (in 24hr format) that you want it to run at. See the `cron tab manpage`_ for more options. + .. attention:: + The Docker container needs to be restarted for changes to take effect. Run `crontab -e` after to verify settings are correct. + .. tab-item:: Headless Image .. _LinuxServer's Universal Cron mod: https://github.com/linuxserver/docker-mods/tree/universal-cron @@ -117,6 +120,9 @@ Docker and Unraid echo " 0 */6 * * * /config/run_cron" >> /config/crontabs/abc This will run the script every 6 hours. To run every hour, change ``*/6`` to ``*/1``, or to run once a day, change the same value to the hour (in 24hr format) that you want it to run at. See the `cron tab manpage`_ for more options. + + .. attention:: + The Docker container needs to be restarted for changes to take effect. Run `crontab -e` after to verify settings are correct. .. _linux-setup: From 35402438a551c23f60bba4de0b751aad5d9b30ad Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Wed, 5 Feb 2025 10:53:07 -0800 Subject: [PATCH 20/48] [BACKEND] Use upload-artifact@v4 (#1173) * [BACKEND] Use upload-artifact@v4 * download too --- .github/workflows/release.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 219f32c3..f050ec64 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -95,7 +95,7 @@ jobs: mv dist/ytdl-sub /opt/builds/ytdl-sub_${{ matrix.arch }} - name: Upload build - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ytdl-sub_${{ matrix.arch }} path: /opt/builds/ytdl-sub_${{ matrix.arch }} @@ -124,7 +124,7 @@ jobs: .\dist\ytdl-sub.exe -h - name: Upload build - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ytdl-sub_exe path: .\dist\ytdl-sub.exe @@ -145,19 +145,19 @@ jobs: echo '${{ needs.version.outputs.init_contents }}' > src/ytdl_sub/__init__.py - name: Restore exe build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ytdl-sub_exe path: /opt/builds - name: Restore aarch64 build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ytdl-sub_aarch64 path: /opt/builds - name: Restore x86_64 build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ytdl-sub_x86_64 path: /opt/builds From 279ab4a5667c9f71492c6ca963cf65d8788afa9b Mon Sep 17 00:00:00 2001 From: marvin8 Date: Mon, 17 Feb 2025 13:49:05 +1000 Subject: [PATCH 21/48] Make total delete videos in Total Stats be negative (#1175) --- src/ytdl_sub/cli/output_summary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ytdl_sub/cli/output_summary.py b/src/ytdl_sub/cli/output_summary.py index 61cf2317..69cf3217 100644 --- a/src/ytdl_sub/cli/output_summary.py +++ b/src/ytdl_sub/cli/output_summary.py @@ -99,7 +99,7 @@ def output_summary(subscriptions: List[Subscription]) -> None: f"{total_subs_str:<{width_sub_name}} " f"{_color_int(total_added):>{width_num_entries_added}} " f"{_color_int(total_modified):>{width_num_entries_modified}} " - f"{_color_int(total_removed):>{width_num_entries_removed}} " + f"{_color_int(total_removed * -1):>{width_num_entries_removed}} " f"{total_entries:>{width_num_entries}} " f"{total_errors_str}" ) From 0ebcfb6a570a3d36db828a1ffb777b136de352a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:41:48 -0800 Subject: [PATCH 22/48] Bump yt-dlp[default] from 2025.1.26 to 2025.2.19 (#1178) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.1.26 to 2025.2.19. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.01.26...2025.02.19) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f7c38964..1de69102 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.1.26", + "yt-dlp[default]==2025.2.19", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From bb2bc49a49ebbeca81b8f77d2e3668a527c1773b Mon Sep 17 00:00:00 2001 From: Tyler Dakin Date: Fri, 21 Feb 2025 11:34:46 -0500 Subject: [PATCH 23/48] Support duplicate chapter timestamps by merging (#1179) Co-authored-by: Tyler Dakin --- src/ytdl_sub/utils/chapters.py | 9 ++++++++- tests/unit/utils/test_chapters.py | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/ytdl_sub/utils/chapters.py b/src/ytdl_sub/utils/chapters.py index 9ccfa2c0..bdd52f34 100644 --- a/src/ytdl_sub/utils/chapters.py +++ b/src/ytdl_sub/utils/chapters.py @@ -220,10 +220,17 @@ class Chapters: # Timestamp captured, store it if match := Timestamp.TIMESTAMP_REGEX.search(line): timestamp_str = match.group(1) - timestamps.append(Timestamp.from_str(timestamp_str)) # Remove timestamp and surrounding whitespace from it title_str = re.sub(f"\\s*{re.escape(timestamp_str)}\\s*", " ", line).strip() + + timestamp = Timestamp.from_str(timestamp_str) + if timestamps and (timestamps[-1].timestamp_sec == timestamp.timestamp_sec): + # duplicate timestamp... combine into one chapter + titles[-1] += " // " + title_str + continue + timestamps.append(timestamp) + titles.append(title_str) # If more than 3 timestamps were parsed, return it diff --git a/tests/unit/utils/test_chapters.py b/tests/unit/utils/test_chapters.py index 0f7e753b..f695a4d0 100644 --- a/tests/unit/utils/test_chapters.py +++ b/tests/unit/utils/test_chapters.py @@ -86,6 +86,21 @@ def chapter_description_3() -> str: """ +@pytest.fixture +def chapter_duplicate_timecodes() -> str: + return """01. 00:00 Ocean +02:41 Dreams +02:41 Nightmares +05:16 Future Tales +08:50 Mind Travelling +11:05 Love Supreme +14:17 Reflections +14:17 Reflections VIP +16:32 Moonlight Fading +19:40 Between Two Worlds +""" + + class TestChapters: def test_chapters_from_str_1(self, chapter_description_1): chapters = Chapters.from_string(chapter_description_1) @@ -104,3 +119,8 @@ class TestChapters: chapters.titles[8] == "(Nightcore) Electro-Light & Jordan Kelvin James - Wait For You (feat. Anna Yvette)" ) + + def test_chapters_from_str_with_duplicate_timecodes(self, chapter_duplicate_timecodes): + chapters = Chapters.from_string(chapter_duplicate_timecodes) + assert len(chapters) == 8 + assert chapters.titles[5] == "Reflections // Reflections VIP" From 51c134a0364f573233ba8b7ce4f8ae151be3e786 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 15 Mar 2025 15:47:03 -0700 Subject: [PATCH 24/48] [DOCKER] Simplify cron (#1184) Drastically simplifies setting up cron within ytdl-sub. Below is the documentation which is available in readthedocs, and a section on how to migrate from the old way to this. ## New Cron Documentation Cron is preconfigured in every ytdl-sub docker container. Enable by adding the following ENV variables to your docker setup. ``` services: ytdl-sub: environment: - CRON_SCHEDULE="0 */6 * * *" - CRON_RUN_ON_START=false ``` - CRON_SCHEDULE follows the standard [cron scheduling syntax](https://crontab.guru/#0_*/6_*_*_*). The above value will run the script once every 6 hours. - CRON_RUN_ON_START toggles whether to run your cron script on container start. The cron script will reside in the main directory with the file name `cron`. Cron logs should show when viewing the Docker logs. ## Migrating Existing Cron Setup Containers' cron files will remain intact until you add the `CRON_SCHEDULE` variable. Once you add that with your preferred schedule, it will write that value to /config/crontabs/abc and create a new file `cron` within your working directory. Simply copy everything from your existing `run_cron` script into `cron`. If you have the ENV variable `DOCKER_MODS` in your docker-compose, remove it. It is now included by default. Not removing this will prevent cron logs from showing in your docker container logs. --- docker/Dockerfile | 8 +- docker/Dockerfile.gui | 12 +- docker/Dockerfile.ubuntu | 8 +- docker/root/custom-cont-init.d/defaults | 69 ++++++++++ docker/root/custom-cont-init.d/defaults-gui | 23 ---- .../root/custom-cont-init.d/defaults-headless | 20 --- docker/root/defaults/cron | 4 + .../s6-overlay/s6-rc.d/init-adduser/branding | 15 +++ .../s6-overlay/s6-rc.d/init-adduser/test.txt | 1 + docker/testing/docker-compose.yml | 26 ++++ .../getting_started/automating_downloads.rst | 118 +++--------------- docs/source/guides/install/docker.rst | 1 - 12 files changed, 150 insertions(+), 155 deletions(-) create mode 100644 docker/root/custom-cont-init.d/defaults delete mode 100644 docker/root/custom-cont-init.d/defaults-gui delete mode 100644 docker/root/custom-cont-init.d/defaults-headless create mode 100644 docker/root/defaults/cron create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-adduser/branding create mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt diff --git a/docker/Dockerfile b/docker/Dockerfile index bcc213e6..2fa290e5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -57,6 +57,12 @@ RUN mkdir -p /config && \ # CONTAINER CONFIGS ENV EDITOR="nano" \ -HOME="/config" +HOME="/config" \ +DOCKER_MODS=linuxserver/mods:universal-stdout-logs|linuxserver/mods:universal-cron \ +DEFAULT_WORKSPACE=/config \ +CRON_SCRIPT="/config/cron" \ +CRON_WRAPPER_SCRIPT="/config/.cron_wrapper" \ +LOGS_TO_STDOUT=/config/.cron.log \ +LSIO_FIRST_PARTY=false VOLUME /config \ No newline at end of file diff --git a/docker/Dockerfile.gui b/docker/Dockerfile.gui index 0b095a27..68752b17 100644 --- a/docker/Dockerfile.gui +++ b/docker/Dockerfile.gui @@ -79,11 +79,13 @@ RUN mkdir -p /config && \ ############################################################################### # CONTAINER CONFIGS - -ENV YTDL_SUB_TYPE="gui" \ -EDITOR="nano" \ +ENV EDITOR="nano" \ HOME="/config" \ -DOCKER_MODS=linuxserver/mods:universal-cron \ -DEFAULT_WORKSPACE=/config/ytdl-sub-configs +DOCKER_MODS=linuxserver/mods:universal-stdout-logs|linuxserver/mods:universal-cron \ +DEFAULT_WORKSPACE=/config/ytdl-sub-configs \ +CRON_SCRIPT="/config/ytdl-sub-configs/cron" \ +CRON_WRAPPER_SCRIPT="/config/ytdl-sub-configs/.cron_wrapper" \ +LOGS_TO_STDOUT=/config/ytdl-sub-configs/.cron.log \ +LSIO_FIRST_PARTY=false VOLUME /config \ No newline at end of file diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu index bef0f137..4f17af97 100644 --- a/docker/Dockerfile.ubuntu +++ b/docker/Dockerfile.ubuntu @@ -83,6 +83,12 @@ RUN mkdir -p /config && \ # CONTAINER CONFIGS ENV EDITOR="nano" \ -HOME="/config" +HOME="/config" \ +DOCKER_MODS=linuxserver/mods:universal-stdout-logs|linuxserver/mods:universal-cron \ +DEFAULT_WORKSPACE=/config \ +CRON_SCRIPT="/config/cron" \ +CRON_WRAPPER_SCRIPT="/config/.cron_wrapper" \ +LOGS_TO_STDOUT=/config/.cron.log \ +LSIO_FIRST_PARTY=false VOLUME /config \ No newline at end of file diff --git a/docker/root/custom-cont-init.d/defaults b/docker/root/custom-cont-init.d/defaults new file mode 100644 index 00000000..3926dd4b --- /dev/null +++ b/docker/root/custom-cont-init.d/defaults @@ -0,0 +1,69 @@ +#!/usr/bin/with-contenv bash + +echo "Starting ytdl-sub..." + +# copy config +[[ ! -e "$DEFAULT_WORKSPACE/config.yaml" ]] && \ + mkdir -p "$DEFAULT_WORKSPACE" && \ + cp /defaults/config.yaml "$DEFAULT_WORKSPACE/config.yaml" +[[ ! -e "$DEFAULT_WORKSPACE/subscriptions.yaml" ]] && \ + mkdir -p "$DEFAULT_WORKSPACE" && \ + cp /defaults/subscriptions.yaml "$DEFAULT_WORKSPACE/subscriptions.yaml" +[[ ! -d "$DEFAULT_WORKSPACE/examples" ]] && \ + mkdir -p "$DEFAULT_WORKSPACE/examples" && \ + cp -r /defaults/examples/* "$DEFAULT_WORKSPACE/examples" + +[[ ! -e "/config/.bashrc" ]] && \ + echo "alias ls='ls --color=auto'" > /config/.bashrc && \ + echo "cd ." >> /config/.bashrc + +# permissions +chown -R ${PUID:-abc}:${PGID:-abc} \ + /config + +# set up cron +if [ "$CRON_SCHEDULE" != "" ] ; then + [[ ! -e "$CRON_SCRIPT" ]] && \ + cp /defaults/cron "$CRON_SCRIPT" + + # create cron script wrapper + echo '#!/bin/bash' > "$CRON_WRAPPER_SCRIPT" + echo "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> "$CRON_WRAPPER_SCRIPT" + echo "cd \"$DEFAULT_WORKSPACE\"" >> "$CRON_WRAPPER_SCRIPT" + echo ". \"$CRON_SCRIPT\" | tee -a \"$LOGS_TO_STDOUT\"" >> "$CRON_WRAPPER_SCRIPT" + chmod +x "$CRON_WRAPPER_SCRIPT" + chown abc:abc "$CRON_WRAPPER_SCRIPT" + + # Set the crontab file to the schedule, cleanly + CRON_SCHEDULE_CLEAN="${CRON_SCHEDULE//\"/}" + CRON_SCHEDULE_CLEAN="${CRON_SCHEDULE_CLEAN//\'/}" + + echo "# min hour day month weekday command" > /config/crontabs/abc + echo "$CRON_SCHEDULE_CLEAN $DEFAULT_WORKSPACE/.cron_wrapper" >> /config/crontabs/abc + + chmod +x "$CRON_SCRIPT" + chown abc:abc "$CRON_SCRIPT" + + crontab -u abc /config/crontabs/abc + + CRON_SUCCESS=$? + if [ $CRON_SUCCESS -eq 0 ] ; then + echo "Cron enabled with schedule $CRON_SCHEDULE_CLEAN" + + if [ "$CRON_RUN_ON_START" = true ] ; then + echo "Running cron script on start" + . "$CRON_WRAPPER_SCRIPT" + fi + else + echo "Error in CRON_SCHEDULE definition, disabling cron." + exit 1 + fi +else + echo "CRON_SCHEDULE not specified, disabling cron." + echo "# min hour day month weekday command" > /config/crontabs/abc + echo "" >> /config/crontabs/abc +fi + +# always create cron log file, after cron runs +# on start to not tail it again +echo "" > "$LOGS_TO_STDOUT" diff --git a/docker/root/custom-cont-init.d/defaults-gui b/docker/root/custom-cont-init.d/defaults-gui deleted file mode 100644 index 01affd47..00000000 --- a/docker/root/custom-cont-init.d/defaults-gui +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/with-contenv bash - -# Exit if not gui -if [ "$YTDL_SUB_TYPE" != "gui" ] ; then - exit 0 -fi - -echo "Checking ytdl-sub-gui defaults..." - -# copy config -[[ ! -e /config/ytdl-sub-configs/config.yaml ]] && \ - mkdir -p /config/ytdl-sub-configs && \ - cp /defaults/config.yaml /config/ytdl-sub-configs/config.yaml -[[ ! -e /config/ytdl-sub-configs/subscriptions.yaml ]] && \ - mkdir -p /config/ytdl-sub-configs && \ - cp /defaults/subscriptions.yaml /config/ytdl-sub-configs/subscriptions.yaml -[[ ! -d /config/ytdl-sub-configs/examples ]] && \ - mkdir -p /config/ytdl-sub-configs/examples && \ - cp /defaults/examples/* /config/ytdl-sub-configs/examples - -# permissions -chown -R ${PUID:-abc}:${PGID:-abc} \ - /config diff --git a/docker/root/custom-cont-init.d/defaults-headless b/docker/root/custom-cont-init.d/defaults-headless deleted file mode 100644 index 8d5d632b..00000000 --- a/docker/root/custom-cont-init.d/defaults-headless +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/with-contenv bash - -# Exit if gui -if [ "$YTDL_SUB_TYPE" == "gui" ] ; then - exit 0 -fi - -echo "Checking ytdl-sub defaults..." - -# copy config -[[ ! -e /config/config.yaml ]] && \ - cp /defaults/config.yaml /config/config.yaml -[[ ! -e /config/subscriptions.yaml ]] && \ - cp /defaults/subscriptions.yaml /config/subscriptions.yaml -[[ ! -d /config/examples ]] && \ - cp -R /defaults/examples /config/ - -# permissions -chown -R ${PUID:-abc}:${PGID:-abc} \ - /config \ No newline at end of file diff --git a/docker/root/defaults/cron b/docker/root/defaults/cron new file mode 100644 index 00000000..6fdbea71 --- /dev/null +++ b/docker/root/defaults/cron @@ -0,0 +1,4 @@ +echo "Beginning cron job..." + +# Place your ytdl-sub command(s) here. +# This script is executed in the same relative path as this file. \ No newline at end of file diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/branding b/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/branding new file mode 100644 index 00000000..0aaa4244 --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/branding @@ -0,0 +1,15 @@ +―――――――――――――――――――――――――――――――――――― +██╗ ██╗████████╗██████╗ ██╗ +╚██╗ ██╔╝╚══██╔══╝██╔══██╗██║ + ╚████╔╝ ██║ ██║ ██║██║ + ╚██╔╝ ██║ ██║ ██║██║ + ██║ ██║ ██████╔╝███████╗ + ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ + + ███████╗██╗ ██╗██████╗ + ██╔════╝██║ ██║██╔══██╗ + ███████╗██║ ██║██████╔╝ + ╚════██║██║ ██║██╔══██╗ + ███████║╚██████╔╝██████╔╝ + ╚══════╝ ╚═════╝ ╚═════╝ +―――――――――――――――――――――――――――――――――――― \ No newline at end of file diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt b/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt new file mode 100644 index 00000000..32f95c0d --- /dev/null +++ b/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt @@ -0,0 +1 @@ +hi \ No newline at end of file diff --git a/docker/testing/docker-compose.yml b/docker/testing/docker-compose.yml index 1a8797b9..432d0098 100644 --- a/docker/testing/docker-compose.yml +++ b/docker/testing/docker-compose.yml @@ -6,8 +6,34 @@ services: - PUID=1000 - PGID=1000 - TZ=America/Los_Angeles + - CRON_SCHEDULE="*/1 * * * *" + - CRON_RUN_ON_START=true volumes: - ./volumes/ytdl-sub-gui:/config ports: - 8443:8443 restart: unless-stopped + ytdl-sub: + image: ytdl-sub:local + container_name: ytdl-sub + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Los_Angeles + - CRON_SCHEDULE="*/1 * * * *" + - CRON_RUN_ON_START=true + volumes: + - ./volumes/ytdl-sub:/config + restart: unless-stopped + ytdl-sub-ubuntu: + image: ytdl-sub-ubuntu:local + container_name: ytdl-sub-ubuntu + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Los_Angeles + - CRON_SCHEDULE="*/1 * * * *" + - CRON_RUN_ON_START=true + volumes: + - ./volumes/ytdl-sub:/config + restart: unless-stopped diff --git a/docs/source/guides/getting_started/automating_downloads.rst b/docs/source/guides/getting_started/automating_downloads.rst index 9608a7b1..392c8ebb 100644 --- a/docs/source/guides/getting_started/automating_downloads.rst +++ b/docs/source/guides/getting_started/automating_downloads.rst @@ -1,133 +1,43 @@ Automating Downloads ==================== -One of the key capabilities of ``ytdl-sub`` automating new downloads. -To take advantage of this, you must set up scheduling to execute the commands at some interval. -How you set up this scheduling depends on which version of ``ytdl-sub`` you downloaded. - - :ref:`Guide for Docker and Unraid Containers ` :ref:`Guide for Linux ` :ref:`Guide for Windows ` -.. _cron tab manpage: https://man7.org/linux/man-pages/man5/crontab.5.html#EXAMPLE_CRON_FILE +.. _cron scheduling syntax: https://crontab.guru/#0_*/6_*_*_* .. _docker-unraid-setup: Docker and Unraid ----------------- -.. tab-set:: - - .. tab-item:: GUI Image - - The script that will execute automatically is located at ``/config/ytdl-sub-configs/run_cron``. +Cron is preconfigured in every ytdl-sub docker container. Enable by adding the following +ENV variables to your docker setup. - Access your container at http://localhost:8443/, then in the GUI terminal run these commands: +.. code-block:: yaml - .. code-block:: shell + services: + ytdl-sub: + environment: + - CRON_SCHEDULE="0 */6 * * *" + - CRON_RUN_ON_START=false - echo '#!/bin/bash' > /config/ytdl-sub-configs/run_cron - echo "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> /config/ytdl-sub-configs/run_cron - echo "echo 'Cron started, running ytdl-sub...'" >> /config/ytdl-sub-configs/run_cron - echo "cd /config/ytdl-sub-configs" >> /config/ytdl-sub-configs/run_cron - echo "ytdl-sub --config=config.yaml sub subscriptions.yaml" >> /config/ytdl-sub-configs/run_cron - chmod +x /config/ytdl-sub-configs/run_cron - chown abc:abc /config/ytdl-sub-configs/run_cron - You can test the newly created script by running: +- ``CRON_SCHEDULE`` follows the standard `cron scheduling syntax`_. The above value will run the script once every 6 hours. +- ``CRON_RUN_ON_START`` toggles whether to run your cron script on container start. - .. code-block:: shell +The cron script will reside in the main directory with the file name ``cron``. +Cron logs should show when viewing the Docker logs. - /config/ytdl-sub-configs/run_cron - - To create the cron definition, run the following command: - - .. code-block:: shell - - echo "# min hour day month weekday command" > /config/crontabs/abc - echo " 0 */6 * * * /config/ytdl-sub-configs/run_cron" >> /config/crontabs/abc - - This will run the script every 6 hours. To run every hour, change ``*/6`` to ``*/1``, or to run once a day, change the same value to the hour (in 24hr format) that you want it to run at. See the `cron tab manpage`_ for more options. - - .. attention:: - The Docker container needs to be restarted for changes to take effect. Run `crontab -e` after to verify settings are correct. - - .. tab-item:: Headless Image - - .. _LinuxServer's Universal Cron mod: https://github.com/linuxserver/docker-mods/tree/universal-cron - - The first step is to ensure you have `LinuxServer's Universal Cron mod`_ enabled via the environment variable. For the GUI image, this is already included (no need to add it). - - .. code-block:: yaml - - services: - ytdl-sub: - image: ghcr.io/jmbannon/ytdl-sub:latest - container_name: ytdl-sub - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Los_Angeles - - DOCKER_MODS=linuxserver/mods:universal-cron # <-- Make sure you have this! - volumes: - # ensure directories have user permissions - - :/config - - :/tv_shows - restart: unless-stopped - - This line will tell your container to install and enable cron on start. - - If you had to add this line, you will need to restart your container. - - .. code-block:: shell - - docker compose restart - - The script that will execute automatically is located at ``/config/run_cron``. - - Access your container from the terminal by running: - - .. code-block:: shell - - docker exec -itu abc ytdl-sub /bin/bash - - then in the terminal run these commands: - - .. code-block:: shell - - echo '#!/bin/bash' > /config/run_cron - echo "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> /config/run_cron - echo "echo 'Cron started, running ytdl-sub...'" >> /config/run_cron - echo "cd /config" >> /config/run_cron - echo "ytdl-sub --config=config.yaml sub subscriptions.yaml" >> /config/run_cron - chmod +x /config/run_cron - chown abc:abc /config/run_cron - - You can test the newly created script by running: - - .. code-block:: - - /config/run_cron - - To create the cron definition, run the following command: - - .. code-block:: shell - - echo "# min hour day month weekday command" > /config/crontabs/abc - echo " 0 */6 * * * /config/run_cron" >> /config/crontabs/abc - - This will run the script every 6 hours. To run every hour, change ``*/6`` to ``*/1``, or to run once a day, change the same value to the hour (in 24hr format) that you want it to run at. See the `cron tab manpage`_ for more options. - - .. attention:: - The Docker container needs to be restarted for changes to take effect. Run `crontab -e` after to verify settings are correct. .. _linux-setup: Linux ----- +Must configure crontab manually, like so: .. code-block:: shell diff --git a/docs/source/guides/install/docker.rst b/docs/source/guides/install/docker.rst index bf9b04c4..c2faa84a 100644 --- a/docs/source/guides/install/docker.rst +++ b/docs/source/guides/install/docker.rst @@ -79,7 +79,6 @@ Docker Compose is an easy "set it and forget it" install method. Follow the inst - PUID=1000 - PGID=1000 - TZ=America/Los_Angeles - - DOCKER_MODS=linuxserver/mods:universal-cron volumes: - :/config - :/tv_shows # optional From 1264f0c6568800e7e9075b8010b8ae2039370f15 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 15 Mar 2025 21:58:51 -0700 Subject: [PATCH 25/48] [DOCKER] Update Ubuntu-based images (#1185) - Update Ubuntu-based images to use Python 3.12 - Move hidden files from GUI image's main dir - Update github workflows to use python 3.12 - Update fixtures - Minor doc fixes --- .github/workflows/ci-windows.yaml | 8 +-- .github/workflows/ci.yaml | 22 +++---- .github/workflows/package-gui.yaml | 10 +-- .github/workflows/package-ubuntu.yaml | 10 +-- .github/workflows/package.yaml | 10 +-- .github/workflows/release.yaml | 20 +++--- docker/Dockerfile.gui | 10 ++- docker/Dockerfile.ubuntu | 6 +- docker/root/custom-cont-init.d/defaults | 2 +- .../s6-overlay/s6-rc.d/init-adduser/test.txt | 1 - .../getting_started/automating_downloads.rst | 6 +- tests/e2e/presets/test_soundcloud.py | 19 ++++++ .../dl/test_cli_dl_command.json | 8 +-- .../chapters/test_chapters_from_comments.json | 8 +-- .../file_convert/custom_ffmpeg_args.json | 8 +-- .../output_options/empty_info_json_thumb.json | 8 +-- .../output_options/post_migration.json | 8 +-- .../plugins/output_options/pre_migration.json | 8 +-- .../output_options/test_missing_thumb.json | 8 +-- .../test_soundcloud_discography.json | 26 ++++---- .../is_yt_1_migrated.json | 8 +-- .../is_yt_1.json | 8 +-- .../s_1/is_yt_1_migrated.json | 8 +-- .../s_2/is_yt_1_migrated.json | 16 ++--- .../s_1/is_yt_1.json | 8 +-- .../s_2/is_yt_1.json | 16 ++--- .../is_yt_1.json | 8 +-- .../is_yt_1_migrated.json | 8 +-- .../is_yt_1.json | 8 +-- .../is_yt_1.json | 8 +-- .../is_yt_1.json | 8 +-- .../s_1/is_yt_1.json | 8 +-- .../s_2/is_yt_1.json | 16 ++--- .../s_1/is_yt_1.json | 8 +-- .../s_1/is_yt_1_migrated.json | 8 +-- .../s_2/is_yt_1.json | 16 ++--- .../s_2/is_yt_1_migrated.json | 16 ++--- .../s_1/is_yt_1.json | 8 +-- .../s_2/is_yt_1.json | 16 ++--- .../s_1/is_yt_1.json | 8 +-- .../s_2/is_yt_1.json | 16 ++--- .../unit/music/YouTube Full Albums.json | 64 +++++++++---------- .../multi_url_False.json | 8 +-- .../multi_url_True.json | 10 +-- .../music_videos/Jellyfin Music Videos.json | 8 +-- .../multi_url_False.json | 8 +-- .../multi_url_True.json | 10 +-- .../unit/music_videos/Kodi Music Videos.json | 8 +-- .../multi_url_False.json | 8 +-- .../multi_url_True.json | 10 +-- .../unit/music_videos/Plex Music Videos.json | 8 +-- .../is_yt_1_migrated.json | 8 +-- .../is_yt_1.json | 8 +-- .../s_1/is_yt_1_migrated.json | 8 +-- .../s_2/is_yt_1_migrated.json | 16 ++--- .../s_1/is_yt_1.json | 8 +-- .../s_2/is_yt_1.json | 16 ++--- 57 files changed, 325 insertions(+), 311 deletions(-) delete mode 100644 docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt diff --git a/.github/workflows/ci-windows.yaml b/.github/workflows/ci-windows.yaml index 42d45131..a9bab42f 100644 --- a/.github/workflows/ci-windows.yaml +++ b/.github/workflows/ci-windows.yaml @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run unit tests with coverage run: | @@ -42,7 +42,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run integration tests with coverage run: | @@ -66,7 +66,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run prebuilt preset integration tests with coverage run: | @@ -89,7 +89,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run e2e tests with coverage run: | diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 84a53f94..2b830d83 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -9,7 +9,7 @@ on: - master jobs: test-lint: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: read @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run linters run: | @@ -27,7 +27,7 @@ jobs: make check_lint test-unit: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: read @@ -37,7 +37,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run unit tests with coverage run: | @@ -53,7 +53,7 @@ jobs: key: ${{github.sha}}-coverage-unit test-integration: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: read @@ -63,7 +63,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run integration tests with coverage run: | @@ -79,7 +79,7 @@ jobs: key: ${{github.sha}}-coverage-integration test-integration-prebuilt-presets: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: read @@ -89,7 +89,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run prebuilt preset integration tests with coverage run: | @@ -105,7 +105,7 @@ jobs: key: ${{github.sha}}-coverage-integration-prebuilt-presets test-e2e: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: read @@ -115,7 +115,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Run e2e tests with coverage run: | @@ -125,7 +125,7 @@ jobs: coverage run -m pytest tests/e2e && coverage xml -o /opt/coverage/e2e/coverage.xml codecov-upload: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ test-unit, test-integration, diff --git a/.github/workflows/package-gui.yaml b/.github/workflows/package-gui.yaml index 0b9ac86c..3054d5fb 100644 --- a/.github/workflows/package-gui.yaml +++ b/.github/workflows/package-gui.yaml @@ -63,10 +63,10 @@ jobs: echo 'init_contents=__pypi_version__ = "${{ env.PYPI_VERSION }}";__local_version__ = "${{ env.LOCAL_VERSION }}"' >> "$GITHUB_OUTPUT" build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: matrix: - python-version: [ "3.10" ] + python-version: [ "3.12" ] permissions: contents: read @@ -92,7 +92,7 @@ jobs: # Build ARM64 container, only on master branch to save time testing package-arm64: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ build ] @@ -141,7 +141,7 @@ jobs: # Build AMD64 container package-amd64: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ build ] @@ -186,7 +186,7 @@ jobs: # On master branch, build the docker manifest file from the cached # docker builds and push to the registry deploy: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ version, build, diff --git a/.github/workflows/package-ubuntu.yaml b/.github/workflows/package-ubuntu.yaml index 40d4e0fc..798c9926 100644 --- a/.github/workflows/package-ubuntu.yaml +++ b/.github/workflows/package-ubuntu.yaml @@ -63,10 +63,10 @@ jobs: echo 'init_contents=__pypi_version__ = "${{ env.PYPI_VERSION }}";__local_version__ = "${{ env.LOCAL_VERSION }}"' >> "$GITHUB_OUTPUT" build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: matrix: - python-version: [ "3.10" ] + python-version: [ "3.12" ] permissions: contents: read @@ -92,7 +92,7 @@ jobs: # Build ARM64 container, only on master branch to save time testing package-arm64: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ build ] @@ -141,7 +141,7 @@ jobs: # Build AMD64 container package-amd64: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ build ] @@ -186,7 +186,7 @@ jobs: # On master branch, build the docker manifest file from the cached # docker builds and push to the registry deploy: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ version, build, diff --git a/.github/workflows/package.yaml b/.github/workflows/package.yaml index 53d9da7a..7b60437f 100644 --- a/.github/workflows/package.yaml +++ b/.github/workflows/package.yaml @@ -63,10 +63,10 @@ jobs: echo 'init_contents=__pypi_version__ = "${{ env.PYPI_VERSION }}";__local_version__ = "${{ env.LOCAL_VERSION }}"' >> "$GITHUB_OUTPUT" build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest strategy: matrix: - python-version: [ "3.10" ] + python-version: [ "3.12" ] permissions: contents: read @@ -92,7 +92,7 @@ jobs: # Build ARM64 container, only on master branch to save time testing package-arm64: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ build ] @@ -136,7 +136,7 @@ jobs: # Build AMD64 container package-amd64: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ build ] @@ -180,7 +180,7 @@ jobs: # On master branch, build the docker manifest file from the cached # docker builds and push to the registry deploy: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: [ version, build, diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f050ec64..0cee01c1 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -76,17 +76,17 @@ jobs: dnf install -y epel-release tar wget make gcc openssl-devel bzip2-devel libffi-devel zlib-devel - name: Install Python run: | - wget https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tar.xz - tar -xf Python-3.10.10.tar.xz - cd Python-3.10.10 && ./configure --with-ensurepip=install --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib" + wget https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tar.xz + tar -xf Python-3.12.9.tar.xz + cd Python-3.12.9 && ./configure --with-ensurepip=install --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib" make -j 8 make altinstall - python3.10 --version - python3.10 -m ensurepip --upgrade + python3.12 --version + python3.12 -m ensurepip --upgrade - name: Build Package run: | - python3.10 -m pip install -e . - python3.10 -m pip install pyinstaller + python3.12 -m pip install -e . + python3.12 -m pip install pyinstaller # Build executable pyinstaller ytdl-sub.spec mkdir -p /opt/builds @@ -112,7 +112,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.12" - name: Write version to init file run: | echo '${{ needs.version.outputs.init_contents }}'> src/ytdl_sub/__init__.py @@ -193,13 +193,13 @@ jobs: name: pypi-publish needs: - version - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: - python-version: '3.10' + python-version: '3.12' - name: Write version to init file run: | echo '${{ needs.version.outputs.init_contents }}' > src/ytdl_sub/__init__.py diff --git a/docker/Dockerfile.gui b/docker/Dockerfile.gui index 68752b17..9425c7ec 100644 --- a/docker/Dockerfile.gui +++ b/docker/Dockerfile.gui @@ -1,4 +1,4 @@ -FROM lscr.io/linuxserver/code-server:4.18.0-ls181 +FROM lscr.io/linuxserver/code-server:4.98.2 # For phantomjs ENV OPENSSL_CONF="/etc/ssl" @@ -22,7 +22,6 @@ RUN mkdir -p /config && \ g++ \ nano \ make \ - python3.10-dev \ python3-pip \ fontconfig \ xz-utils \ @@ -61,7 +60,7 @@ RUN mkdir -p /config && \ phantomjs --version ; \ fi && \ # Install ytdl-sub, ensure it is installed properly - pip install --no-cache-dir ytdl_sub-*.whl && \ + pip install --no-cache-dir --break-system-packages ytdl_sub-*.whl && \ ytdl-sub -h && \ # Delete unneeded packages after install rm ytdl_sub-*.whl && \ @@ -70,7 +69,6 @@ RUN mkdir -p /config && \ make \ xz-utils \ bzip2 \ - python3.10-dev \ python3-venv && \ apt-get autoremove -y && \ apt-get purge -y --auto-remove && \ @@ -84,8 +82,8 @@ HOME="/config" \ DOCKER_MODS=linuxserver/mods:universal-stdout-logs|linuxserver/mods:universal-cron \ DEFAULT_WORKSPACE=/config/ytdl-sub-configs \ CRON_SCRIPT="/config/ytdl-sub-configs/cron" \ -CRON_WRAPPER_SCRIPT="/config/ytdl-sub-configs/.cron_wrapper" \ -LOGS_TO_STDOUT=/config/ytdl-sub-configs/.cron.log \ +CRON_WRAPPER_SCRIPT="/config/.cron_wrapper" \ +LOGS_TO_STDOUT=/config/.cron.log \ LSIO_FIRST_PARTY=false VOLUME /config \ No newline at end of file diff --git a/docker/Dockerfile.ubuntu b/docker/Dockerfile.ubuntu index 4f17af97..6036249f 100644 --- a/docker/Dockerfile.ubuntu +++ b/docker/Dockerfile.ubuntu @@ -1,4 +1,4 @@ -FROM ghcr.io/linuxserver/baseimage-ubuntu:jammy +FROM ghcr.io/linuxserver/baseimage-ubuntu:noble # https://askubuntu.com/questions/972516/debian-frontend-environment-variable ARG DEBIAN_FRONTEND=noninteractive @@ -25,7 +25,6 @@ RUN mkdir -p /config && \ g++ \ nano \ make \ - python3.10-dev \ python3-pip \ fontconfig \ xz-utils \ @@ -64,7 +63,7 @@ RUN mkdir -p /config && \ phantomjs --version ; \ fi && \ # Install ytdl-sub, ensure it is installed properly - pip install --no-cache-dir ytdl_sub-*.whl && \ + pip install --no-cache-dir --break-system-packages ytdl_sub-*.whl && \ ytdl-sub -h && \ # Delete unneeded packages after install rm ytdl_sub-*.whl && \ @@ -73,7 +72,6 @@ RUN mkdir -p /config && \ make \ xz-utils \ bzip2 \ - python3.10-dev \ python3-venv && \ apt-get autoremove -y && \ apt-get purge -y --auto-remove && \ diff --git a/docker/root/custom-cont-init.d/defaults b/docker/root/custom-cont-init.d/defaults index 3926dd4b..e07ed6a8 100644 --- a/docker/root/custom-cont-init.d/defaults +++ b/docker/root/custom-cont-init.d/defaults @@ -39,7 +39,7 @@ if [ "$CRON_SCHEDULE" != "" ] ; then CRON_SCHEDULE_CLEAN="${CRON_SCHEDULE_CLEAN//\'/}" echo "# min hour day month weekday command" > /config/crontabs/abc - echo "$CRON_SCHEDULE_CLEAN $DEFAULT_WORKSPACE/.cron_wrapper" >> /config/crontabs/abc + echo "$CRON_SCHEDULE_CLEAN $CRON_WRAPPER_SCRIPT" >> /config/crontabs/abc chmod +x "$CRON_SCRIPT" chown abc:abc "$CRON_SCRIPT" diff --git a/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt b/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt deleted file mode 100644 index 32f95c0d..00000000 --- a/docker/root/etc/s6-overlay/s6-rc.d/init-adduser/test.txt +++ /dev/null @@ -1 +0,0 @@ -hi \ No newline at end of file diff --git a/docs/source/guides/getting_started/automating_downloads.rst b/docs/source/guides/getting_started/automating_downloads.rst index 392c8ebb..a4a668be 100644 --- a/docs/source/guides/getting_started/automating_downloads.rst +++ b/docs/source/guides/getting_started/automating_downloads.rst @@ -22,12 +22,12 @@ ENV variables to your docker setup. services: ytdl-sub: environment: - - CRON_SCHEDULE="0 */6 * * *" - - CRON_RUN_ON_START=false + - CRON_SCHEDULE="0 */6 * * *" + - CRON_RUN_ON_START=false - ``CRON_SCHEDULE`` follows the standard `cron scheduling syntax`_. The above value will run the script once every 6 hours. -- ``CRON_RUN_ON_START`` toggles whether to run your cron script on container start. +- ``CRON_RUN_ON_START`` toggles whether to run your cron script on container start in addition to the cron schedule. The cron script will reside in the main directory with the file name ``cron``. Cron logs should show when viewing the Docker logs. diff --git a/tests/e2e/presets/test_soundcloud.py b/tests/e2e/presets/test_soundcloud.py index 8e7f5345..9dbe6481 100644 --- a/tests/e2e/presets/test_soundcloud.py +++ b/tests/e2e/presets/test_soundcloud.py @@ -1,3 +1,5 @@ +from typing import List + import pytest from conftest import assert_logs from expected_download import assert_expected_downloads @@ -34,6 +36,21 @@ class TestSoundcloudDiscography: output_directory, dry_run, ): + ignored_mp3s: List[str] = [ + "j_b/[2021] Baby Santana's Dorian Groove/01 - Baby Santana's Dorian Groove.mp3", + "j_b/[2021] Purple Clouds/01 - Purple Clouds.mp3", + "j_b/[2022] Acoustic Treats/01 - 20160426 184214.mp3", + "j_b/[2022] Acoustic Treats/02 - 20160502 123150.mp3", + "j_b/[2022] Acoustic Treats/03 - 20160504 143832.mp3", + "j_b/[2022] Acoustic Treats/04 - 20160601 221234.mp3", + "j_b/[2022] Acoustic Treats/05 - 20160601 222440.mp3", + "j_b/[2022] Acoustic Treats/06 - 20170604 190236.mp3", + "j_b/[2022] Acoustic Treats/07 - 20170612 193646.mp3", + "j_b/[2022] Acoustic Treats/08 - 20170628 215206.mp3", + "j_b/[2022] Acoustic Treats/09 - Finding Home.mp3", + "j_b/[2022] Acoustic Treats/10 - Shallow Water WIP.mp3", + "j_b/[2022] Acoustic Treats/11 - Untold History.mp3", + ] discography_subscription = Subscription.from_dict( preset_dict=subscription_dict, preset_name="j_b", @@ -49,6 +66,7 @@ class TestSoundcloudDiscography: output_directory=output_directory, dry_run=dry_run, expected_download_summary_file_name="soundcloud/test_soundcloud_discography.json", + ignore_md5_hashes_for=ignored_mp3s, ) # Ensure another invocation will hit ExistingVideoReached @@ -65,4 +83,5 @@ class TestSoundcloudDiscography: output_directory=output_directory, dry_run=dry_run, expected_download_summary_file_name="soundcloud/test_soundcloud_discography.json", + ignore_md5_hashes_for=ignored_mp3s, ) diff --git a/tests/resources/expected_downloads_summaries/dl/test_cli_dl_command.json b/tests/resources/expected_downloads_summaries/dl/test_cli_dl_command.json index ab305abf..01e2ccbe 100644 --- a/tests/resources/expected_downloads_summaries/dl/test_cli_dl_command.json +++ b/tests/resources/expected_downloads_summaries/dl/test_cli_dl_command.json @@ -2,18 +2,18 @@ ".ytdl-sub-subscription_test-download-archive.json": "76e202bd03ceef93daaffffee2cfa193", "JMC/Mock Entry 20-1.info.json": "INFO_JSON", "JMC/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-1.mp4": "dbaeb2a3bfd1de1c7e9615e8bdacb910", + "JMC/Mock Entry 20-1.mp4": "d8dc9918d1646c92b4a4bd246291d849", "JMC/Mock Entry 20-1.nfo": "5d001a105d2380844db181911d5df5c6", "JMC/Mock Entry 20-2.info.json": "INFO_JSON", "JMC/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-2.mp4": "76c2c70572489c684923a51cb1b50687", + "JMC/Mock Entry 20-2.mp4": "6f925179a5b6bf7ffcaf2f70ad585296", "JMC/Mock Entry 20-2.nfo": "dccdded1ca7ebb38d2c9a0e5130bea33", "JMC/Mock Entry 20-3.info.json": "INFO_JSON", "JMC/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-3.mp4": "7bb4f21d59a6fb91836537b27a24e776", + "JMC/Mock Entry 20-3.mp4": "b48f1803f14be665677e9ac9da787593", "JMC/Mock Entry 20-3.nfo": "7b1eab48693161e83c21203b1308b64e", "JMC/Mock Entry 21-1.info.json": "INFO_JSON", "JMC/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 21-1.mp4": "7b008531ca5660b51fb8adc83c799084", + "JMC/Mock Entry 21-1.mp4": "5fb865f27ee1cac381597d1e182dfa48", "JMC/Mock Entry 21-1.nfo": "3b4b0e6820f80370d6738ce828f14a89" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/chapters/test_chapters_from_comments.json b/tests/resources/expected_downloads_summaries/plugins/chapters/test_chapters_from_comments.json index 1c1792d3..d2d07d67 100644 --- a/tests/resources/expected_downloads_summaries/plugins/chapters/test_chapters_from_comments.json +++ b/tests/resources/expected_downloads_summaries/plugins/chapters/test_chapters_from_comments.json @@ -2,18 +2,18 @@ ".ytdl-sub-subscription_test-download-archive.json": "76e202bd03ceef93daaffffee2cfa193", "JMC/Mock Entry 20-1.info.json": "INFO_JSON", "JMC/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-1.mp4": "40efe3f597c40c11d0d3f2f87cc7650b", + "JMC/Mock Entry 20-1.mp4": "f9f1542629edf78fb9d80f2517e6530e", "JMC/Mock Entry 20-1.nfo": "fefcf0b3e4f4ff80ad636584d50dadec", "JMC/Mock Entry 20-2.info.json": "INFO_JSON", "JMC/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-2.mp4": "0747f56d03e720128b1fa5ef25bcf3c8", + "JMC/Mock Entry 20-2.mp4": "48a46efb360b908a5c9653ef266f6574", "JMC/Mock Entry 20-2.nfo": "025c0b631da5ff5470382b38fce78d2d", "JMC/Mock Entry 20-3.info.json": "INFO_JSON", "JMC/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-3.mp4": "eb776b8e6da77a848666d88623600fd6", + "JMC/Mock Entry 20-3.mp4": "69b89a35ca5554d047d7ea375635e557", "JMC/Mock Entry 20-3.nfo": "618b0ff948d9de2e10cf1da8c0dd6615", "JMC/Mock Entry 21-1.info.json": "INFO_JSON", "JMC/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 21-1.mp4": "5d56530dc8a4cfe55efb791d82bae0f0", + "JMC/Mock Entry 21-1.mp4": "a3a18a3acf6e28ab921b8458d1526886", "JMC/Mock Entry 21-1.nfo": "e5c715749efc1603a6e2f59244d87aba" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/file_convert/custom_ffmpeg_args.json b/tests/resources/expected_downloads_summaries/plugins/file_convert/custom_ffmpeg_args.json index 4552cb5d..642ea323 100644 --- a/tests/resources/expected_downloads_summaries/plugins/file_convert/custom_ffmpeg_args.json +++ b/tests/resources/expected_downloads_summaries/plugins/file_convert/custom_ffmpeg_args.json @@ -2,18 +2,18 @@ ".ytdl-sub-subscription_test-download-archive.json": "19cf39d57914ba9cbd1e57ba6f1e0683", "JMC/Mock Entry 20-1.info.json": "INFO_JSON", "JMC/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-1.mkv": "1514f89a141f7b5ee3fdde9a70e63f57", + "JMC/Mock Entry 20-1.mkv": "eb9a8ff61701ab673c2f06147fe29a4e", "JMC/Mock Entry 20-1.nfo": "fefcf0b3e4f4ff80ad636584d50dadec", "JMC/Mock Entry 20-2.info.json": "INFO_JSON", "JMC/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-2.mkv": "da089645cc944fdb411ecc46facfe9f6", + "JMC/Mock Entry 20-2.mkv": "65d047562c61a068e8a92bd8df8801fa", "JMC/Mock Entry 20-2.nfo": "025c0b631da5ff5470382b38fce78d2d", "JMC/Mock Entry 20-3.info.json": "INFO_JSON", "JMC/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 20-3.mkv": "5dbae183aa57c4062af9d5a2e0e0f8fe", + "JMC/Mock Entry 20-3.mkv": "98582526fcb3bea10ab7b3df7a5bc65d", "JMC/Mock Entry 20-3.nfo": "618b0ff948d9de2e10cf1da8c0dd6615", "JMC/Mock Entry 21-1.info.json": "INFO_JSON", "JMC/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "JMC/Mock Entry 21-1.mkv": "61910bf74a0175fbdf595095109d1a1c", + "JMC/Mock Entry 21-1.mkv": "3fe368f6d4bd9662a24abca9215b4d26", "JMC/Mock Entry 21-1.nfo": "e5c715749efc1603a6e2f59244d87aba" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/output_options/empty_info_json_thumb.json b/tests/resources/expected_downloads_summaries/plugins/output_options/empty_info_json_thumb.json index 235abb09..8857b8f1 100644 --- a/tests/resources/expected_downloads_summaries/plugins/output_options/empty_info_json_thumb.json +++ b/tests/resources/expected_downloads_summaries/plugins/output_options/empty_info_json_thumb.json @@ -1,12 +1,12 @@ { ".ytdl-sub-subscription_test-download-archive.json": "7c6fbd0631d7d02025f3da457ba203e3", - "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "7d2ee7fe8003ea63ece37dd2a441c123", + "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "06e7e5beab0b68e4ee3535c801448b4c", "Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", - "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "699017cd1b67ae216eda769bef413415", + "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "dfe89d82ae778bae164e161f10ac9adc", "Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", - "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "a16741d4fbf657d1de4c50493db14062", + "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "273785dcc28969f4de4a6e3e5ff1e61e", "Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", - "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "7433153952b069a5674e2a3ed529b49b", + "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "2170bfbc2b85057ba0ec403e7e5ea66d", "Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", "tvshow.nfo": "cccca1086b41af04d8ea004b1aa250e8" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/output_options/post_migration.json b/tests/resources/expected_downloads_summaries/plugins/output_options/post_migration.json index f66f7456..08f43cf5 100644 --- a/tests/resources/expected_downloads_summaries/plugins/output_options/post_migration.json +++ b/tests/resources/expected_downloads_summaries/plugins/output_options/post_migration.json @@ -2,19 +2,19 @@ ".ytdl-sub-JMC-migrated-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", "Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "7d2ee7fe8003ea63ece37dd2a441c123", + "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "06e7e5beab0b68e4ee3535c801448b4c", "Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", "Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "699017cd1b67ae216eda769bef413415", + "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "dfe89d82ae778bae164e161f10ac9adc", "Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", "Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "a16741d4fbf657d1de4c50493db14062", + "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "273785dcc28969f4de4a6e3e5ff1e61e", "Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", "Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "7433153952b069a5674e2a3ed529b49b", + "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "2170bfbc2b85057ba0ec403e7e5ea66d", "Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", "tvshow.nfo": "cccca1086b41af04d8ea004b1aa250e8" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/output_options/pre_migration.json b/tests/resources/expected_downloads_summaries/plugins/output_options/pre_migration.json index 61c1c924..7ca037a7 100644 --- a/tests/resources/expected_downloads_summaries/plugins/output_options/pre_migration.json +++ b/tests/resources/expected_downloads_summaries/plugins/output_options/pre_migration.json @@ -2,19 +2,19 @@ ".ytdl-sub-subscription_test-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", "Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "7d2ee7fe8003ea63ece37dd2a441c123", + "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "06e7e5beab0b68e4ee3535c801448b4c", "Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", "Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "699017cd1b67ae216eda769bef413415", + "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "dfe89d82ae778bae164e161f10ac9adc", "Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", "Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "a16741d4fbf657d1de4c50493db14062", + "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "273785dcc28969f4de4a6e3e5ff1e61e", "Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", "Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "7433153952b069a5674e2a3ed529b49b", + "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "2170bfbc2b85057ba0ec403e7e5ea66d", "Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", "tvshow.nfo": "cccca1086b41af04d8ea004b1aa250e8" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/output_options/test_missing_thumb.json b/tests/resources/expected_downloads_summaries/plugins/output_options/test_missing_thumb.json index 21967d07..6c1628ba 100644 --- a/tests/resources/expected_downloads_summaries/plugins/output_options/test_missing_thumb.json +++ b/tests/resources/expected_downloads_summaries/plugins/output_options/test_missing_thumb.json @@ -1,16 +1,16 @@ { ".ytdl-sub-subscription_test-download-archive.json": "e049068ba7f5bdc27c474b18f4c6b402", "Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "7d2ee7fe8003ea63ece37dd2a441c123", + "Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "06e7e5beab0b68e4ee3535c801448b4c", "Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", "Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "699017cd1b67ae216eda769bef413415", + "Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "dfe89d82ae778bae164e161f10ac9adc", "Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", "Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "a16741d4fbf657d1de4c50493db14062", + "Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "273785dcc28969f4de4a6e3e5ff1e61e", "Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", "Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "7433153952b069a5674e2a3ed529b49b", + "Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "2170bfbc2b85057ba0ec403e7e5ea66d", "Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", "tvshow.nfo": "cccca1086b41af04d8ea004b1aa250e8" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/soundcloud/test_soundcloud_discography.json b/tests/resources/expected_downloads_summaries/soundcloud/test_soundcloud_discography.json index 242947bf..219447f1 100644 --- a/tests/resources/expected_downloads_summaries/soundcloud/test_soundcloud_discography.json +++ b/tests/resources/expected_downloads_summaries/soundcloud/test_soundcloud_discography.json @@ -1,19 +1,19 @@ { ".ytdl-sub-j_b-download-archive.json": "1a99156e9ece62539fb2608416a07200", - "j_b/[2021] Baby Santana's Dorian Groove/01 - Baby Santana's Dorian Groove.mp3": "b35d01351e5dd1195e90a41b2edeb5b7", + "j_b/[2021] Baby Santana's Dorian Groove/01 - Baby Santana's Dorian Groove.mp3": "0aecc0e9832768002f41e09a7e70b305", "j_b/[2021] Baby Santana's Dorian Groove/folder.jpg": "967892be44b8c47e1be73f055a7c6f08", - "j_b/[2021] Purple Clouds/01 - Purple Clouds.mp3": "5c107c122048389aa40936c4fba0436e", + "j_b/[2021] Purple Clouds/01 - Purple Clouds.mp3": "2d4154dfa596c905d71cfd970f5dc9d3", "j_b/[2021] Purple Clouds/folder.jpg": "967892be44b8c47e1be73f055a7c6f08", - "j_b/[2022] Acoustic Treats/01 - 20160426 184214.mp3": "e737c2ba118920643cec9eac09a283ea", - "j_b/[2022] Acoustic Treats/02 - 20160502 123150.mp3": "d5def3e4329b9b95c5354c838dd3bc91", - "j_b/[2022] Acoustic Treats/03 - 20160504 143832.mp3": "1694c4a2889aa7dacafc5f2fdb4fe1d7", - "j_b/[2022] Acoustic Treats/04 - 20160601 221234.mp3": "9c8ddee6aaf88b38706ce6bbdf907878", - "j_b/[2022] Acoustic Treats/05 - 20160601 222440.mp3": "4bf9e700137cb1b58e730dd312e00bb4", - "j_b/[2022] Acoustic Treats/06 - 20170604 190236.mp3": "c1920254046eda0d84b36dd34f9bafdb", - "j_b/[2022] Acoustic Treats/07 - 20170612 193646.mp3": "26f2eb8395b23cecc4000e2fd58304bf", - "j_b/[2022] Acoustic Treats/08 - 20170628 215206.mp3": "e3ceb5ae25c115d037a298b4620bce9f", - "j_b/[2022] Acoustic Treats/09 - Finding Home.mp3": "f3dcfe7c8569853a02eb12ad21b0e248", - "j_b/[2022] Acoustic Treats/10 - Shallow Water WIP.mp3": "4fb9a18b3fdd788ce9d9f4c8a07b6028", - "j_b/[2022] Acoustic Treats/11 - Untold History.mp3": "ad186ee1d0029f8de02357e8b8712a4b", + "j_b/[2022] Acoustic Treats/01 - 20160426 184214.mp3": "10c925fc97629ca788c44ae8082ee889", + "j_b/[2022] Acoustic Treats/02 - 20160502 123150.mp3": "da0e8a7db660adbfef255ba1763c384c", + "j_b/[2022] Acoustic Treats/03 - 20160504 143832.mp3": "42284493f75a55bd1b1d3f1ac8d1ffe1", + "j_b/[2022] Acoustic Treats/04 - 20160601 221234.mp3": "d660abefa257a10cbeae434c770bf3e5", + "j_b/[2022] Acoustic Treats/05 - 20160601 222440.mp3": "565d4dcf92e40e1485ed77fa79b52c17", + "j_b/[2022] Acoustic Treats/06 - 20170604 190236.mp3": "7c5903693230ca9ac8b44b76ed004eb4", + "j_b/[2022] Acoustic Treats/07 - 20170612 193646.mp3": "dfec9909cb8156ec8d5c28cfce858f36", + "j_b/[2022] Acoustic Treats/08 - 20170628 215206.mp3": "2c8769a9de3d1033d0e152c642512e40", + "j_b/[2022] Acoustic Treats/09 - Finding Home.mp3": "b3920d39deb847be938e03e3d74d4ac9", + "j_b/[2022] Acoustic Treats/10 - Shallow Water WIP.mp3": "759394ebe3db9ccef564fa9d7c0dfd09", + "j_b/[2022] Acoustic Treats/11 - Untold History.mp3": "477af6c479263539f244db8d9de04201", "j_b/[2022] Acoustic Treats/folder.jpg": "967892be44b8c47e1be73f055a7c6f08" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json index ac184954..c8541f52 100644 --- a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "d14710bc7c6ef6d7d64d7d955b7b32d0", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "1eec4bae304dcb12ba91cbe5b3ef52c1", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "ff2a6a35b533c4e0f41d0c761c9c2f08", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "9767c6fc84316bc5d27e6527c7ca62b4", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json index 71b9f021..33848fb2 100644 --- a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "e30d83126c2c6981c936ed894a6f159b", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "35770012af9ea0d5d1da45b9667b421f", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "c712d7fd5dfdb9bb6c2be99f7c796c6f", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "65010c031d76bc70055befd3aac68139", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "7ec7ac1923053c4b5653bbfb8924fdc6", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "9b1066f98309432e9d4d7aaf8d30ddcd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "414c243016f406451c790757949173aa", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "129a7ee05d048db25f4c0cf0581a9318", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "e2f858efd08ac82749fd01db65d8341e", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json index 65e049cf..622ac651 100644 --- a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "809885e6c29bba06215b840516628090", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json index 5fad68c9..ef34edca 100644 --- a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json @@ -2,35 +2,35 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "1427a80ab1d6e2e97506aebee3dd7a21", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "c66baf5bb22f386d4bf6db027bb60b1a", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "36b049db676868cbd2f2633bf3ab71fb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "c25a7830dfa7a6601b8e7fbce117cc48", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json index 087583f9..c67cdbac 100644 --- a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "ede1deeba072bae50f7f7039deca0543", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "6aae009946f29e5d3095cfe24d4ce527", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.nfo": "043c6de15ab09f32e64414d1f4a8a89c", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "66f9ee8157f918711d28448fc67b7417", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.nfo": "4fb018858502fe2c7a0d3dcb89145a8d", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "8f0a39a96e6dca16c09a7a0fd51df09a", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.nfo": "6ac2ee3bd87b453d56bd90b42bbf52a0", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "d6df6d3e2e68c1b80f464d514a7f550c", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.nfo": "d54ba1888f0083f8de6f401e399ad379", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json index eaf036eb..9754c9cb 100644 --- a/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json @@ -2,35 +2,35 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "9b9e26ff3d036f450501bf5adb979aeb", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "dc9260aa08144f4207c797e393b05939", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "fab0f2d0a74558a86b3935c6b962ebe3", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.nfo": "9ceac835c0166bf4f7354106379e6d17", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "c497a3f67cd0a98e690a22f8a7b8bf23", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "9c2569c62ff81f067fe3d91324942c11", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.nfo": "35f15e5437cae813095fe2ca3bd2ca18", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "7518678ed81fe6f918cc89c10b923aa5", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "921e686edbf2a2e11f8d3eba9ef32592", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.nfo": "9aa69e4c86bb282ac57b2024ec2fbd34", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "9f755810e03f6476d1c7211eefa04fc1", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "a9fae3eca046637910a6e79aae4a8354", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.nfo": "709533b6b8f501196db0d98dfe2b2b16", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "6aae009946f29e5d3095cfe24d4ce527", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.nfo": "05f34cd0e6be4b09ea96134faec892f6", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "66f9ee8157f918711d28448fc67b7417", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.nfo": "54b4f84daf25626703f7b3a36b0dea49", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "8f0a39a96e6dca16c09a7a0fd51df09a", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.nfo": "3d2644161e57b94cfac5e95732864cc3", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "d6df6d3e2e68c1b80f464d514a7f550c", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.nfo": "fd91adb2089d0fcdbb2e568a10ac880e", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1.json index d8b62c9e..1795a9ee 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "d14710bc7c6ef6d7d64d7d955b7b32d0", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "1eec4bae304dcb12ba91cbe5b3ef52c1", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "ff2a6a35b533c4e0f41d0c761c9c2f08", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "9767c6fc84316bc5d27e6527c7ca62b4", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json index ac184954..c8541f52 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "d14710bc7c6ef6d7d64d7d955b7b32d0", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "1eec4bae304dcb12ba91cbe5b3ef52c1", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "ff2a6a35b533c4e0f41d0c761c9c2f08", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "9767c6fc84316bc5d27e6527c7ca62b4", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json index 71b9f021..33848fb2 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "e30d83126c2c6981c936ed894a6f159b", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "35770012af9ea0d5d1da45b9667b421f", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "c712d7fd5dfdb9bb6c2be99f7c796c6f", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "65010c031d76bc70055befd3aac68139", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "7ec7ac1923053c4b5653bbfb8924fdc6", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "9b1066f98309432e9d4d7aaf8d30ddcd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "414c243016f406451c790757949173aa", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "129a7ee05d048db25f4c0cf0581a9318", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "e2f858efd08ac82749fd01db65d8341e", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1.json index 8e813e40..bbd955da 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "05539b932348da7e949a63eb71f77efc", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.mp4": "9b276cb01ceb989cdf215ae9c0d9d32a", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.mp4": "c27d1898d39763a265e4fe4451777688", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.nfo": "88fee5353ad7eecd96865b34654bbde6", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.mp4": "2ea78b08315e7fca677a639c36c65c38", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.mp4": "80c087803d5ac9c0efe02361fdaaa5bd", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.nfo": "d781b80ef24916acbf3bf181ab32ddea", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.mp4": "0221338f33f1ae59bda7a3eb1c0795ae", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.mp4": "1b5084c06b33f7e0d6daf7cff03adc73", "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.nfo": "252b3639b4d1686f8c79476943f89439", "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.mp4": "389f962b863817991e537475d6c3e885", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.mp4": "a83870aaca55947b7a91ac90109163af", "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.nfo": "e7374b766d9ec0599ecf209a0f78c0ba", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1.json index c8d7aa1b..05570b53 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "5269b5e9e4fad7b63b6fdb3fef477b1e", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.mp4": "cabf6750f99eab4e55a3220238a82532", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.mp4": "b095358d6b335a25f3be3ae44a6d10ac", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.nfo": "4ba0e01c1e7295952c3f5e6b9b251d7d", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.mp4": "eb07113fc41ea2ef9014c3275f9e0202", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.mp4": "43f73b6f99439e4873bf8d4ba1802452", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.nfo": "db9196b729c7b2cd26e3f0fc649b39f0", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.mp4": "ca8615ad8503aeeccfb0c79016787d56", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.mp4": "632af351287dde4d1a096460f6bd93b1", "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.nfo": "ba4a387d9462f416ba176c31c1c55316", "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.mp4": "9023d52c4ac00b448249a5d55bab5326", + "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.mp4": "bf0104b783e168b150ea165faa898915", "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.nfo": "93dd5c4c493422f9a60e61a6b965b39a", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1.json index ce154a2a..901a9588 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "4e5ef7394c029e7fe230f82dfe134e4c", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.mp4": "9d2ef6838874f46d7e222672f7fc5de5", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.mp4": "79cac07b1964b53ff128ef041e3ed10b", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.nfo": "2a3d9b51221a541fefc29eebffe47cd4", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.mp4": "261e446652a61457fc0a74b3880ef466", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.mp4": "ebd20e58d50951bfcd2316bcf660ba11", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.nfo": "ec57b2c78058e18cdc015813e8a14b9d", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.mp4": "a47a82ae9323e5f63ed78cddaf4e2613", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.mp4": "331068e0bf01c2baaa131c7760a46c02", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.nfo": "cd919caf88b0eed99fd2a595c1afa6b1", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.mp4": "1f176ffa4d10e80f25e63922bbf4eff7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.mp4": "c646ebe3838f553abb5e9cb1dd96b85f", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.nfo": "7c4b28456fe5d398b7dad966eb194421", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1.json index aadbb9fd..85551fe8 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1.json @@ -2,35 +2,35 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "c7c2427315924db344d4659a60c59bc9", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.mp4": "6cee06c349a722937d63469335ac0940", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.mp4": "a37dba001208063f0c04b2a681973c1c", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.nfo": "7d8f03bdcd8ee66fd1578a86f20365cc", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "36b049db676868cbd2f2633bf3ab71fb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.mp4": "7bab968253b962fef6b6afc38d8e9ce3", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.mp4": "0bee8e6eb39dbfa8aab81fb78c74ffa0", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.nfo": "39996f43e9761247dce614247f99c808", "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.mp4": "c97823194c3098c9dca79436d57b5070", + "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.mp4": "db88af54bfd315035ce187c2da47f95a", "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.nfo": "cae377877c966dad492eaa3f224b86ba", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.mp4": "9d2ef6838874f46d7e222672f7fc5de5", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.mp4": "79cac07b1964b53ff128ef041e3ed10b", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.nfo": "974bb83bd43b9579ab1716f66589ccc1", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.mp4": "261e446652a61457fc0a74b3880ef466", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.mp4": "ebd20e58d50951bfcd2316bcf660ba11", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.nfo": "b12dcb09ffad7f23f21d350e1f60f128", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.mp4": "a47a82ae9323e5f63ed78cddaf4e2613", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.mp4": "331068e0bf01c2baaa131c7760a46c02", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.nfo": "e6fd0fc3e95b77c595d1a77c2060fd98", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.mp4": "1f176ffa4d10e80f25e63922bbf4eff7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.mp4": "c646ebe3838f553abb5e9cb1dd96b85f", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.nfo": "23386ea27c1e64afcecdb235acb81b79", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1.json index 20379646..edf55e33 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "809885e6c29bba06215b840516628090", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json index 65e049cf..622ac651 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "809885e6c29bba06215b840516628090", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1.json index db93c907..56508d3c 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1.json @@ -2,35 +2,35 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "1427a80ab1d6e2e97506aebee3dd7a21", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "c66baf5bb22f386d4bf6db027bb60b1a", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "36b049db676868cbd2f2633bf3ab71fb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "c25a7830dfa7a6601b8e7fbce117cc48", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json index 5fad68c9..ef34edca 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json @@ -2,35 +2,35 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "1427a80ab1d6e2e97506aebee3dd7a21", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "c66baf5bb22f386d4bf6db027bb60b1a", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "36b049db676868cbd2f2633bf3ab71fb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "c25a7830dfa7a6601b8e7fbce117cc48", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json index 087583f9..c67cdbac 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "ede1deeba072bae50f7f7039deca0543", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "6aae009946f29e5d3095cfe24d4ce527", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.nfo": "043c6de15ab09f32e64414d1f4a8a89c", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "66f9ee8157f918711d28448fc67b7417", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.nfo": "4fb018858502fe2c7a0d3dcb89145a8d", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "8f0a39a96e6dca16c09a7a0fd51df09a", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.nfo": "6ac2ee3bd87b453d56bd90b42bbf52a0", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "d6df6d3e2e68c1b80f464d514a7f550c", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.nfo": "d54ba1888f0083f8de6f401e399ad379", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json index eaf036eb..9754c9cb 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json @@ -2,35 +2,35 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "9b9e26ff3d036f450501bf5adb979aeb", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "dc9260aa08144f4207c797e393b05939", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "fab0f2d0a74558a86b3935c6b962ebe3", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.nfo": "9ceac835c0166bf4f7354106379e6d17", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "c497a3f67cd0a98e690a22f8a7b8bf23", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "9c2569c62ff81f067fe3d91324942c11", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.nfo": "35f15e5437cae813095fe2ca3bd2ca18", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "7518678ed81fe6f918cc89c10b923aa5", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "921e686edbf2a2e11f8d3eba9ef32592", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.nfo": "9aa69e4c86bb282ac57b2024ec2fbd34", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "9f755810e03f6476d1c7211eefa04fc1", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "a9fae3eca046637910a6e79aae4a8354", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.nfo": "709533b6b8f501196db0d98dfe2b2b16", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "6aae009946f29e5d3095cfe24d4ce527", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.nfo": "05f34cd0e6be4b09ea96134faec892f6", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "66f9ee8157f918711d28448fc67b7417", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.nfo": "54b4f84daf25626703f7b3a36b0dea49", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "8f0a39a96e6dca16c09a7a0fd51df09a", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.nfo": "3d2644161e57b94cfac5e95732864cc3", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "d6df6d3e2e68c1b80f464d514a7f550c", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.nfo": "fd91adb2089d0fcdbb2e568a10ac880e", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1.json index 932e7f20..077b159a 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1.json @@ -2,19 +2,19 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "e26598ffd47b150e6bf09e5490546e94", "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1.mp4": "5b87fe189379fcce34facf73e7021538", + "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1.mp4": "cda96931a134eeb6e05e0b5aec03ddfe", "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1.nfo": "a7e21040a3fcb264f287e4eba1853f94", "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1.mp4": "adc4a4e47515d628981fad20b6169b6c", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1.mp4": "a7f2ca37b817da0512af297b5652e5e8", "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1.nfo": "78c08ad76d004a74cdba012f0b746c22", "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2.mp4": "cfecc8d04705b7592f07a8d695cafc3a", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2.mp4": "35ebd30923d8f321e023281ec6ef4e6f", "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2.nfo": "d9031d8608d12742c40a3279138c8371", "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3.mp4": "fc0e44becce6b0f685020d781fab86f1", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3.mp4": "204ce9c28ab7b69c659f0f76b6c75bfa", "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3.nfo": "74bd8dc59c5b76ae112d90638977c464", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1.json index 10d451e4..ba4303f1 100644 --- a/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1.json @@ -2,35 +2,35 @@ "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "2990d95213df5a6c87825a28daa970f4", "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4.mp4": "7c015856068b9fe798d0c24144550259", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4.mp4": "611d34cf77a2123181a7c4096623f6b9", "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4.nfo": "0242d92e5e0d26745948b42c25eecfba", "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5.mp4": "8894ba3b2cf87fffa2d3861f85db47d4", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5.mp4": "f09ce6574a040cea52b7177f74b9ccea", "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5.nfo": "52b17bcad30adb6eaef4c3b21c1af76b", "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6.mp4": "dfb7ffe2b77618e5607cc2a770122359", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6.mp4": "435692c75994d929807b5f09726728ad", "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6.nfo": "31fb72d089fd680fea1340f3d3c41d64", "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7.mp4": "f3e511d2e6b09bb72bea872b817b83d9", + "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7.mp4": "613c386e00bf1c87e4f1d1acbbd98281", "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7.nfo": "df65227ee260219883ff618c9fbdf1d4", "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1.mp4": "5b87fe189379fcce34facf73e7021538", + "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1.mp4": "cda96931a134eeb6e05e0b5aec03ddfe", "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1.nfo": "0e4ea058d6a1e8760c80d3a02d25aafc", "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1.mp4": "adc4a4e47515d628981fad20b6169b6c", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1.mp4": "a7f2ca37b817da0512af297b5652e5e8", "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1.nfo": "1095322364e512dff963a44b2beffe30", "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2.mp4": "cfecc8d04705b7592f07a8d695cafc3a", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2.mp4": "35ebd30923d8f321e023281ec6ef4e6f", "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2.nfo": "5130c71d99f1c0726fee8cb8c9d82ba7", "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3.mp4": "fc0e44becce6b0f685020d781fab86f1", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3.mp4": "204ce9c28ab7b69c659f0f76b6c75bfa", "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3.nfo": "bde2a5401c49b58de0eacea4145d91ae", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", diff --git a/tests/resources/expected_downloads_summaries/unit/music/YouTube Full Albums.json b/tests/resources/expected_downloads_summaries/unit/music/YouTube Full Albums.json index fabc51b6..325074c7 100644 --- a/tests/resources/expected_downloads_summaries/unit/music/YouTube Full Albums.json +++ b/tests/resources/expected_downloads_summaries/unit/music/YouTube Full Albums.json @@ -1,43 +1,43 @@ { ".ytdl-sub-subscription_test-download-archive.json": "a428f2d540b605d0804b99600372d5d1", - "subscription_test/[2020] Mock Entry 20-1/01 - " Intro.mp3": "c09c8590553141752697c6752667666a", - "subscription_test/[2020] Mock Entry 20-1/02 - " Part 1.mp3": "b25c7e1d9e614974ea255485414acc62", - "subscription_test/[2020] Mock Entry 20-1/03 - " Part 2.mp3": "3440ca7a156d8d8290e20854586f723a", - "subscription_test/[2020] Mock Entry 20-1/04 - " Part 3.mp3": "d093d2674a88b7e8f52edbf3629868ff", + "subscription_test/[2020] Mock Entry 20-1/01 - " Intro.mp3": "76a6712260a4bb2ab0b08ec6bd692872", + "subscription_test/[2020] Mock Entry 20-1/02 - " Part 1.mp3": "60b19560ad4eeaca372adf5cd1aecd72", + "subscription_test/[2020] Mock Entry 20-1/03 - " Part 2.mp3": "13bba7567936f04abe5bdd6348bdc4c2", + "subscription_test/[2020] Mock Entry 20-1/04 - " Part 3.mp3": "00f13beb106202ed920037bd17cffe44", "subscription_test/[2020] Mock Entry 20-1/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/[2020] Mock Entry 20-2/01 - " Intro.mp3": "d2b61d59894df0e99169a32d8cec0b2b", - "subscription_test/[2020] Mock Entry 20-2/02 - " Part 1.mp3": "30971eafe14adf282784462e1cedf822", - "subscription_test/[2020] Mock Entry 20-2/03 - " Part 2.mp3": "9e165ed71adc64a88192e686b97a0df3", - "subscription_test/[2020] Mock Entry 20-2/04 - " Part 3.mp3": "2e6851853e3634eaf52cc9258d8e375a", + "subscription_test/[2020] Mock Entry 20-2/01 - " Intro.mp3": "0d4c25d4d64ea8898f8252625b09177c", + "subscription_test/[2020] Mock Entry 20-2/02 - " Part 1.mp3": "afa2066ecac49e12a3995d97db94655e", + "subscription_test/[2020] Mock Entry 20-2/03 - " Part 2.mp3": "47be8ad5ed93e9051d6c78bd317a49e9", + "subscription_test/[2020] Mock Entry 20-2/04 - " Part 3.mp3": "23660f56222b169868908f0e58e0733e", "subscription_test/[2020] Mock Entry 20-2/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/[2020] Mock Entry 20-3/01 - " Intro.mp3": "915b052131b2c50bc3b91fee23a58da5", - "subscription_test/[2020] Mock Entry 20-3/02 - " Part 1.mp3": "030e82f87f761f75ad19adfc4dbf1063", - "subscription_test/[2020] Mock Entry 20-3/03 - " Part 2.mp3": "810c579dac3632e1155911a6cb4ef506", - "subscription_test/[2020] Mock Entry 20-3/04 - " Part 3.mp3": "42a1ce49b8217dbe614cbb5eee5f552c", + "subscription_test/[2020] Mock Entry 20-3/01 - " Intro.mp3": "9c89f6dd066601ee15ef9b2eaf5bb3ee", + "subscription_test/[2020] Mock Entry 20-3/02 - " Part 1.mp3": "83b4b06ac7f069863252c559757cfc1e", + "subscription_test/[2020] Mock Entry 20-3/03 - " Part 2.mp3": "b747271438b1cdd1dad5a45f9d0d1731", + "subscription_test/[2020] Mock Entry 20-3/04 - " Part 3.mp3": "85727de0a1799336fff0be042723a10e", "subscription_test/[2020] Mock Entry 20-3/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/[2020] Mock Entry 20-4/01 - " Intro.mp3": "bf0d2b91e2c7cc136dc0a56be94e0d7e", - "subscription_test/[2020] Mock Entry 20-4/02 - " Part 1.mp3": "eb8c0e34fef88b940f328956c03a2ae0", - "subscription_test/[2020] Mock Entry 20-4/03 - " Part 2.mp3": "23bcef6856e58d942cb83372434f8525", - "subscription_test/[2020] Mock Entry 20-4/04 - " Part 3.mp3": "08f50f77e9654362724a6e737f44306d", + "subscription_test/[2020] Mock Entry 20-4/01 - " Intro.mp3": "c0179198948f6cb096437ef1784a5689", + "subscription_test/[2020] Mock Entry 20-4/02 - " Part 1.mp3": "b414ce97e727526cb51c2a86b8f32aed", + "subscription_test/[2020] Mock Entry 20-4/03 - " Part 2.mp3": "c939dca7b62947db3c6a6152af97993c", + "subscription_test/[2020] Mock Entry 20-4/04 - " Part 3.mp3": "422f848cce38ddec42b3bb81f9c02f15", "subscription_test/[2020] Mock Entry 20-4/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/[2020] Mock Entry 20-5/01 - " Intro.mp3": "01f501bade24e3cab1fb6b58a6d2a8ac", - "subscription_test/[2020] Mock Entry 20-5/02 - " Part 1.mp3": "c5a0b461e1e1a67b028c05a9a3a774d2", - "subscription_test/[2020] Mock Entry 20-5/03 - " Part 2.mp3": "edda09bc84916663bc946696f6cc5ce0", - "subscription_test/[2020] Mock Entry 20-5/04 - " Part 3.mp3": "083a8482ee343b8e71fd4ff0710649fe", + "subscription_test/[2020] Mock Entry 20-5/01 - " Intro.mp3": "0ab2892cd0f0f8a68d8ea62be01f4300", + "subscription_test/[2020] Mock Entry 20-5/02 - " Part 1.mp3": "6944e056e81ac9aacbe292996b46ea7c", + "subscription_test/[2020] Mock Entry 20-5/03 - " Part 2.mp3": "666b6f573bb7d2b7589c3ab56556f872", + "subscription_test/[2020] Mock Entry 20-5/04 - " Part 3.mp3": "486952f7f0fbb3a9ea5a7af1689c286e", "subscription_test/[2020] Mock Entry 20-5/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/[2020] Mock Entry 20-6/01 - " Intro.mp3": "674f23188f8808e3b44c116e41594e76", - "subscription_test/[2020] Mock Entry 20-6/02 - " Part 1.mp3": "d8fc85cfade392b78fcf66670905a2d1", - "subscription_test/[2020] Mock Entry 20-6/03 - " Part 2.mp3": "23c7ac598d181ea16b945662beeae11e", - "subscription_test/[2020] Mock Entry 20-6/04 - " Part 3.mp3": "1dd37e65243aa545a55de73cd480580a", + "subscription_test/[2020] Mock Entry 20-6/01 - " Intro.mp3": "32705b6b80915bd2c970f2518522a609", + "subscription_test/[2020] Mock Entry 20-6/02 - " Part 1.mp3": "17dad487b84362c161a4b264393c5ee7", + "subscription_test/[2020] Mock Entry 20-6/03 - " Part 2.mp3": "616b7a82970884a2ee8ec258d162f13c", + "subscription_test/[2020] Mock Entry 20-6/04 - " Part 3.mp3": "bdfa25664e166b92e1a4996ca69ac8d6", "subscription_test/[2020] Mock Entry 20-6/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/[2020] Mock Entry 20-7/01 - " Intro.mp3": "c42c845f3028d910137af63af04c46a0", - "subscription_test/[2020] Mock Entry 20-7/02 - " Part 1.mp3": "514db0c82a210b9ea886e6ee2ab9327f", - "subscription_test/[2020] Mock Entry 20-7/03 - " Part 2.mp3": "112b6018f05e1aa62518001b61de0123", - "subscription_test/[2020] Mock Entry 20-7/04 - " Part 3.mp3": "5e1fb5d017a54b0156fa96ad71241f00", + "subscription_test/[2020] Mock Entry 20-7/01 - " Intro.mp3": "759e3fddad88de7ada2284b7f1f1a4c6", + "subscription_test/[2020] Mock Entry 20-7/02 - " Part 1.mp3": "c51bc61e097ad644637d26060f300041", + "subscription_test/[2020] Mock Entry 20-7/03 - " Part 2.mp3": "c8004e429f4075c5c64b941aa14361da", + "subscription_test/[2020] Mock Entry 20-7/04 - " Part 3.mp3": "2620fd0ae7bad9cc9b0d1eadbb583b1f", "subscription_test/[2020] Mock Entry 20-7/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/[2021] Mock Entry 21-1/01 - " Intro.mp3": "c1718b35ec1ab0b83c519acd30f32927", - "subscription_test/[2021] Mock Entry 21-1/02 - " Part 1.mp3": "4fed9885e3ce0f2d1ae0134c2b22ff08", - "subscription_test/[2021] Mock Entry 21-1/03 - " Part 2.mp3": "240774666c7636f9490ab98a77ef75bb", - "subscription_test/[2021] Mock Entry 21-1/04 - " Part 3.mp3": "0087935c3158fb4151dac0920dd84002", + "subscription_test/[2021] Mock Entry 21-1/01 - " Intro.mp3": "a86816be03ce0aa08fa72a784a0cc843", + "subscription_test/[2021] Mock Entry 21-1/02 - " Part 1.mp3": "84f14bdc616b45c3dbadf218da57bafe", + "subscription_test/[2021] Mock Entry 21-1/03 - " Part 2.mp3": "25f353289022c0fb8e8b9da6c7a364e4", + "subscription_test/[2021] Mock Entry 21-1/04 - " Part 3.mp3": "4b593b094cbb1cd5e4349ebbf83ae933", "subscription_test/[2021] Mock Entry 21-1/folder.jpg": "e80c508c4818454300133fe1dc1a9cd7" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_False.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_False.json index 72e4fbce..c29e6056 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_False.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_False.json @@ -2,18 +2,18 @@ ".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed", "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", "subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1", "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", "subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405", "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", "subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352", "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90", + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4", "subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_True.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_True.json index ced3db94..e970dc97 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_True.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos Categorized/multi_url_True.json @@ -2,22 +2,22 @@ ".ytdl-sub-subscription_test-download-archive.json": "bcb2e8e8139f5bf589e027f841aa9449", "subscription_test/Custom Title.info.json": "INFO_JSON", "subscription_test/Custom Title.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Custom Title.mp4": "d7c2b8e961a8fcb612bd0d69c96bf0f3", + "subscription_test/Custom Title.mp4": "59b7b4ed1419fa43a2faff470b764bd2", "subscription_test/Custom Title.nfo": "996f3993b2ba8a0614bef294492dde65", "subscription_test/Mock Entry 20-4.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-4.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-4.mp4": "10f239edf916f8fb9eb461f24a821578", + "subscription_test/Mock Entry 20-4.mp4": "67a47bc3b9583a1d99040afc2589bfe6", "subscription_test/Mock Entry 20-4.nfo": "1e7cb1a09c15f155623f6cd796e874ff", "subscription_test/Mock Entry 20-5.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-5.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-5.mp4": "046878a073fb269ec61401cdeb834707", + "subscription_test/Mock Entry 20-5.mp4": "ae8d22fe6de7ee75a80508e53d2aaaae", "subscription_test/Mock Entry 20-5.nfo": "f6100f194ae3c3b24211ff515d97ccdf", "subscription_test/Mock Entry 20-6.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-6.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-6.mp4": "a50ead5d08456f0bcb907f1912caefcf", + "subscription_test/Mock Entry 20-6.mp4": "0c4c6f12b8e7993e34d9ba1dce605683", "subscription_test/Mock Entry 20-6.nfo": "f51ae05104f5b98531535e75d623f941", "subscription_test/Mock Entry 20-7.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-7.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-7.mp4": "5b35f04254c38c33ba056274b6c3af9f", + "subscription_test/Mock Entry 20-7.mp4": "d9fd30536ff349030467e25fa611055e", "subscription_test/Mock Entry 20-7.nfo": "852c02ea3ab196d808854ee94a9313d2" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos.json index 72e4fbce..c29e6056 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos.json @@ -2,18 +2,18 @@ ".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed", "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", "subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1", "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", "subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405", "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", "subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352", "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90", + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4", "subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_False.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_False.json index 72e4fbce..c29e6056 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_False.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_False.json @@ -2,18 +2,18 @@ ".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed", "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", "subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1", "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", "subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405", "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", "subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352", "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90", + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4", "subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_True.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_True.json index ced3db94..e970dc97 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_True.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos Categorized/multi_url_True.json @@ -2,22 +2,22 @@ ".ytdl-sub-subscription_test-download-archive.json": "bcb2e8e8139f5bf589e027f841aa9449", "subscription_test/Custom Title.info.json": "INFO_JSON", "subscription_test/Custom Title.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Custom Title.mp4": "d7c2b8e961a8fcb612bd0d69c96bf0f3", + "subscription_test/Custom Title.mp4": "59b7b4ed1419fa43a2faff470b764bd2", "subscription_test/Custom Title.nfo": "996f3993b2ba8a0614bef294492dde65", "subscription_test/Mock Entry 20-4.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-4.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-4.mp4": "10f239edf916f8fb9eb461f24a821578", + "subscription_test/Mock Entry 20-4.mp4": "67a47bc3b9583a1d99040afc2589bfe6", "subscription_test/Mock Entry 20-4.nfo": "1e7cb1a09c15f155623f6cd796e874ff", "subscription_test/Mock Entry 20-5.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-5.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-5.mp4": "046878a073fb269ec61401cdeb834707", + "subscription_test/Mock Entry 20-5.mp4": "ae8d22fe6de7ee75a80508e53d2aaaae", "subscription_test/Mock Entry 20-5.nfo": "f6100f194ae3c3b24211ff515d97ccdf", "subscription_test/Mock Entry 20-6.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-6.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-6.mp4": "a50ead5d08456f0bcb907f1912caefcf", + "subscription_test/Mock Entry 20-6.mp4": "0c4c6f12b8e7993e34d9ba1dce605683", "subscription_test/Mock Entry 20-6.nfo": "f51ae05104f5b98531535e75d623f941", "subscription_test/Mock Entry 20-7.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-7.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-7.mp4": "5b35f04254c38c33ba056274b6c3af9f", + "subscription_test/Mock Entry 20-7.mp4": "d9fd30536ff349030467e25fa611055e", "subscription_test/Mock Entry 20-7.nfo": "852c02ea3ab196d808854ee94a9313d2" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos.json index 72e4fbce..c29e6056 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos.json @@ -2,18 +2,18 @@ ".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed", "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", "subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1", "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", "subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405", "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", "subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352", "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90", + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4", "subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_False.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_False.json index 78727e67..c6d6fdd1 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_False.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_False.json @@ -2,14 +2,14 @@ ".ytdl-sub-subscription_test-download-archive.json": "6cb47203ec56d8318a0d428b5b4efa5d", "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90" + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_True.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_True.json index 5f236acf..9b3c2a0f 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_True.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos Categorized/multi_url_True.json @@ -2,17 +2,17 @@ ".ytdl-sub-subscription_test-download-archive.json": "69a9960ce69e3813269412fa7cb1bd33", "subscription_test/Custom Title.info.json": "INFO_JSON", "subscription_test/Custom Title.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Custom Title.mp4": "d7c2b8e961a8fcb612bd0d69c96bf0f3", + "subscription_test/Custom Title.mp4": "59b7b4ed1419fa43a2faff470b764bd2", "subscription_test/Mock Entry 20-4.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-4.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-4.mp4": "10f239edf916f8fb9eb461f24a821578", + "subscription_test/Mock Entry 20-4.mp4": "67a47bc3b9583a1d99040afc2589bfe6", "subscription_test/Mock Entry 20-5.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-5.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-5.mp4": "046878a073fb269ec61401cdeb834707", + "subscription_test/Mock Entry 20-5.mp4": "ae8d22fe6de7ee75a80508e53d2aaaae", "subscription_test/Mock Entry 20-6.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-6.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-6.mp4": "a50ead5d08456f0bcb907f1912caefcf", + "subscription_test/Mock Entry 20-6.mp4": "0c4c6f12b8e7993e34d9ba1dce605683", "subscription_test/Mock Entry 20-7.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-7.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-7.mp4": "5b35f04254c38c33ba056274b6c3af9f" + "subscription_test/Mock Entry 20-7.mp4": "d9fd30536ff349030467e25fa611055e" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos.json index 78727e67..c6d6fdd1 100644 --- a/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos.json +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos.json @@ -2,14 +2,14 @@ ".ytdl-sub-subscription_test-download-archive.json": "6cb47203ec56d8318a0d428b5b4efa5d", "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-1.mp4": "34916dc26e723c3464adcc4687898ca8", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-2.mp4": "01a910b7a023325aa9d4ad3a013a1e02", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 20-3.mp4": "812b6db9ff08bf1822e99e43d371400d", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", - "subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90" + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json index 35af6f8f..57c4e26f 100644 --- a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_migrated.json @@ -2,16 +2,16 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "0011c85c3339ac1301d80be2f3330e67", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "d14710bc7c6ef6d7d64d7d955b7b32d0", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "1eec4bae304dcb12ba91cbe5b3ef52c1", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "ff2a6a35b533c4e0f41d0c761c9c2f08", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "9767c6fc84316bc5d27e6527c7ca62b4", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json index adc8a5f1..33cbc2b5 100644 --- a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.json @@ -2,16 +2,16 @@ "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "6cd67e6b935bc5b2521f6ed0fa2ea2ed", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "35770012af9ea0d5d1da45b9667b421f", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "c712d7fd5dfdb9bb6c2be99f7c796c6f", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "65010c031d76bc70055befd3aac68139", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "7ec7ac1923053c4b5653bbfb8924fdc6", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "9b1066f98309432e9d4d7aaf8d30ddcd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "414c243016f406451c790757949173aa", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "129a7ee05d048db25f4c0cf0581a9318", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "e2f858efd08ac82749fd01db65d8341e", "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json index 00d40f43..bae82de6 100644 --- a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_migrated.json @@ -3,16 +3,16 @@ "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json index 3196e323..eb4cb28e 100644 --- a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json +++ b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_migrated.json @@ -3,29 +3,29 @@ "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "1427a80ab1d6e2e97506aebee3dd7a21", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "c66baf5bb22f386d4bf6db027bb60b1a", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "36b049db676868cbd2f2633bf3ab71fb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "c25a7830dfa7a6601b8e7fbce117cc48", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", "Best Prebuilt TV Show Collection/Season 02/Season02.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "bab31d1ace4b9b74e5e55ed8e75a7488", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "ec823c5e3df83bd3e21b3bd1987a1b29", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "3208b2ade911b6c4bc604b74d7128648", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "70aa6608cc7016fcf722b8bcd5282f4d", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json index 86c112df..3ebd92c2 100644 --- a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.json @@ -3,16 +3,16 @@ "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "6aae009946f29e5d3095cfe24d4ce527", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "66f9ee8157f918711d28448fc67b7417", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "8f0a39a96e6dca16c09a7a0fd51df09a", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "d6df6d3e2e68c1b80f464d514a7f550c", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json index 49ad460e..47a0f4ac 100644 --- a/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json +++ b/tests/resources/expected_downloads_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.json @@ -3,29 +3,29 @@ "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "dc9260aa08144f4207c797e393b05939", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "fab0f2d0a74558a86b3935c6b962ebe3", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "c497a3f67cd0a98e690a22f8a7b8bf23", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "9c2569c62ff81f067fe3d91324942c11", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "7518678ed81fe6f918cc89c10b923aa5", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "921e686edbf2a2e11f8d3eba9ef32592", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "9f755810e03f6476d1c7211eefa04fc1", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "a9fae3eca046637910a6e79aae4a8354", "Best Prebuilt TV Show Collection/Season 02/Season02.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "6aae009946f29e5d3095cfe24d4ce527", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "66f9ee8157f918711d28448fc67b7417", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "8f0a39a96e6dca16c09a7a0fd51df09a", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", - "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "d6df6d3e2e68c1b80f464d514a7f550c", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" } \ No newline at end of file From 665ded7cece4892aa9df6fdcd7698a2c0ede50d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Mar 2025 00:25:10 -0700 Subject: [PATCH 26/48] [DEV] Bump isort from 5.13.2 to 6.0.1 (#1180) Bumps [isort](https://github.com/PyCQA/isort) from 5.13.2 to 6.0.1. - [Release notes](https://github.com/PyCQA/isort/releases) - [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md) - [Commits](https://github.com/PyCQA/isort/compare/5.13.2...6.0.1) --- updated-dependencies: - dependency-name: isort dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1de69102..499127f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ test = [ ] lint = [ "black==24.10.0", - "isort==5.13.2", + "isort==6.0.1", "pylint==3.3.4", ] docs = [ From d21aebfbafd6b117a372235401a4eb722eb09a86 Mon Sep 17 00:00:00 2001 From: curryicecream Date: Fri, 21 Mar 2025 17:05:08 +0100 Subject: [PATCH 27/48] [BUILD] Update release workflow to build aarch64 executable correctly (#1190) Update release action to build aarch64 executable in arm64 runner. Fixes #1177 --- .github/workflows/release.yaml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0cee01c1..dd5ce4e8 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -61,9 +61,16 @@ jobs: strategy: matrix: arch: [ "aarch64", "x86_64" ] - runs-on: ubuntu-latest + include: + - arch: "aarch64" + runner: "ubuntu-24.04-arm" + container: "quay.io/pypa/manylinux_2_28_aarch64" + - arch: "x86_64" + runner: "ubuntu-latest" + container: "quay.io/pypa/manylinux_2_28_x86_64" + runs-on: ${{ matrix.runner }} container: - image: quay.io/pypa/manylinux_2_28_x86_64 + image: ${{ matrix.container }} steps: - uses: actions/checkout@v3 - name: Write version to init file From e90e95982b7d5b1befd364960e0a2b95c448d6d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 09:07:36 -0700 Subject: [PATCH 28/48] [DEV] Bump pylint from 3.3.4 to 3.3.6 (#1191) Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.4 to 3.3.6. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.4...v3.3.6) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 499127f5..6045eefc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.10.0", "isort==6.0.1", - "pylint==3.3.4", + "pylint==3.3.6", ] docs = [ "sphinx>=7,<9", From 6c3fd8d5c721fc7c3a922659ae345bf4602d0209 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 14:43:59 -0700 Subject: [PATCH 29/48] Bump yt-dlp[default] from 2025.2.19 to 2025.3.25 (#1194) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.2.19 to 2025.3.25. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.02.19...2025.03.25) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6045eefc..e675de1c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.2.19", + "yt-dlp[default]==2025.3.25", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 1897f884ab45bf54d3c795543ddb2f73aa480391 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:39:11 -0700 Subject: [PATCH 30/48] Bump yt-dlp[default] from 2025.3.25 to 2025.3.26 (#1195) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.3.25 to 2025.3.26. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.03.25...2025.03.26) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e675de1c..aadb90b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.3.25", + "yt-dlp[default]==2025.3.26", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 2161dc5ac78ff55b536dcc86324071fe7dc284ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 08:38:10 -0700 Subject: [PATCH 31/48] Bump yt-dlp[default] from 2025.3.26 to 2025.3.27 (#1196) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.3.26 to 2025.3.27. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.03.26...2025.03.27) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index aadb90b5..624d8a96 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.3.26", + "yt-dlp[default]==2025.3.27", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 6cf41a06b59dddda02c4ca83909197a76137df01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 23:54:59 -0700 Subject: [PATCH 32/48] Bump yt-dlp[default] from 2025.3.27 to 2025.3.31 (#1199) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.3.27 to 2025.3.31. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.03.27...2025.03.31) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-version: 2025.3.31 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 624d8a96..80d73970 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.3.27", + "yt-dlp[default]==2025.3.31", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From e27a7c549537acebc3769d3d07dda76e2c615308 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Wed, 2 Apr 2025 21:22:12 -0700 Subject: [PATCH 33/48] [DOCKER] Fix various cron issues (#1204) Closes - https://github.com/jmbannon/ytdl-sub/issues/1200 - Runs in the background now - https://github.com/jmbannon/ytdl-sub/issues/1201 - Was not running as user `abc`, now it is - https://github.com/jmbannon/ytdl-sub/issues/1202 - Due to reading stdout and tail of hidden log file. Should only tail from hidden log file now Will leave crontab as-is if no CRON_SCHEDULE is specified --- docker/root/custom-cont-init.d/defaults | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docker/root/custom-cont-init.d/defaults b/docker/root/custom-cont-init.d/defaults index e07ed6a8..cfbc0776 100644 --- a/docker/root/custom-cont-init.d/defaults +++ b/docker/root/custom-cont-init.d/defaults @@ -21,6 +21,9 @@ echo "Starting ytdl-sub..." chown -R ${PUID:-abc}:${PGID:-abc} \ /config +# always create empty cron log file on start +echo "" > "$LOGS_TO_STDOUT" + # set up cron if [ "$CRON_SCHEDULE" != "" ] ; then [[ ! -e "$CRON_SCRIPT" ]] && \ @@ -51,19 +54,15 @@ if [ "$CRON_SCHEDULE" != "" ] ; then echo "Cron enabled with schedule $CRON_SCHEDULE_CLEAN" if [ "$CRON_RUN_ON_START" = true ] ; then - echo "Running cron script on start" - . "$CRON_WRAPPER_SCRIPT" + echo "Running cron script on start in the background" + # ensure it runs as abc to respect puid/guid with delay for tail to start + su -s "/bin/bash" -c "sleep 5 && . '$CRON_WRAPPER_SCRIPT'" abc > /dev/null 2>&1 & fi else echo "Error in CRON_SCHEDULE definition, disabling cron." exit 1 fi else - echo "CRON_SCHEDULE not specified, disabling cron." - echo "# min hour day month weekday command" > /config/crontabs/abc - echo "" >> /config/crontabs/abc + echo "CRON_SCHEDULE not specified, leaving crontabs as-is. Current configuration in /config/crontabs/abc" + cat /config/crontabs/abc fi - -# always create cron log file, after cron runs -# on start to not tail it again -echo "" > "$LOGS_TO_STDOUT" From 19d28e9baa747585bdb273953b1e99c8be9188cb Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Thu, 17 Apr 2025 22:14:37 -0700 Subject: [PATCH 34/48] [FEATURE] Throw more actionable error if users supply the wrong type of url for TV show presets (#1210) Don't let users supply `url` for TV Show Collection presets, or `s01_url` for TV Show by Date presets. --- .../tv_show/tv_show_by_date.yaml | 20 +++++++++++++- .../tv_show/tv_show_collection.yaml | 11 ++++++++ tests/unit/prebuilt_presets/__init__.py | 0 .../prebuilt_presets/test_tv_show_by_date.py | 26 +++++++++++++++++++ .../test_tv_show_collection.py | 26 +++++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/unit/prebuilt_presets/__init__.py create mode 100644 tests/unit/prebuilt_presets/test_tv_show_by_date.py create mode 100644 tests/unit/prebuilt_presets/test_tv_show_collection.py diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml index e676ec82..bca76405 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml @@ -35,11 +35,29 @@ presets: # TV show from one or more sources. Uses {url}'s avatar and banner as poster and fanart _tv_show_by_date: - preset: "_multi_url_bilateral" + preset: + - "_multi_url_bilateral" + - "_tv_show_by_date_asserts" overrides: avatar_uncropped_thumbnail_file_name: "{tv_show_poster_file_name}" banner_uncropped_thumbnail_file_name: "{tv_show_fanart_file_name}" + _tv_show_by_date_asserts: + overrides: + s01_url: "" + s01_name: "" + assert_not_collection: >- + { + %assert( + %and( + %not( %bool(s01_url) ), + %not( %bool(s01_name) ) + ), + "Provided `s01_url` or `s01_name` variable to TV Show by Date preset when it expects `url`. Perhaps you meant to use the `TV Show Collection` preset?" + ) + } + + #################################################################################################### _season_by_year: 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 888068d1..accdd395 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 @@ -62,6 +62,7 @@ presets: _tv_show_collection: preset: - "_tv_show_collection_bilateral" + - "_tv_show_collection_asserts" download: - url: "{collection_season_1_url}" @@ -1015,6 +1016,16 @@ presets: ytdl_options: playlist_items: "-1:0:-1" + _tv_show_collection_asserts: + overrides: + url: "" + assert_not_by_date: >- + { + %assert( + %not( %bool(url) ), + "Provided `url` to TV Show Collection preset when it expects `s01_url`. Perhaps you meant to use the `TV Show by Date` preset?" + ) + } #################################################################################################### # DEPRECATED SEASON PRESETS diff --git a/tests/unit/prebuilt_presets/__init__.py b/tests/unit/prebuilt_presets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/prebuilt_presets/test_tv_show_by_date.py b/tests/unit/prebuilt_presets/test_tv_show_by_date.py new file mode 100644 index 00000000..f8da99a7 --- /dev/null +++ b/tests/unit/prebuilt_presets/test_tv_show_by_date.py @@ -0,0 +1,26 @@ +import re + +import pytest + +from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError +from ytdl_sub.subscriptions.subscription import Subscription + + +class TestTvShowByDatePreset: + + def test_s01_error_thrown(self, default_config): + with pytest.raises( + UserThrownRuntimeError, + match=re.escape( + "Provided `s01_url` or `s01_name` variable to TV Show by Date preset when it " + "expects `url`. Perhaps you meant to use the `TV Show Collection` preset?" + ), + ): + _ = Subscription.from_dict( + config=default_config, + preset_name="test", + preset_dict={ + "preset": "Jellyfin TV Show by Date", + "overrides": {"tv_show_directory": "abc", "s01_url": "test"}, + }, + ) diff --git a/tests/unit/prebuilt_presets/test_tv_show_collection.py b/tests/unit/prebuilt_presets/test_tv_show_collection.py new file mode 100644 index 00000000..3621f3cb --- /dev/null +++ b/tests/unit/prebuilt_presets/test_tv_show_collection.py @@ -0,0 +1,26 @@ +import re + +import pytest + +from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError +from ytdl_sub.subscriptions.subscription import Subscription + + +class TestTvShowCollectionPreset: + + def test_url_error_thrown(self, default_config): + with pytest.raises( + UserThrownRuntimeError, + match=re.escape( + "Provided `url` to TV Show Collection preset when it expects `s01_url`. " + "Perhaps you meant to use the `TV Show by Date` preset?" + ), + ): + _ = Subscription.from_dict( + config=default_config, + preset_name="test", + preset_dict={ + "preset": "Jellyfin TV Show Collection", + "overrides": {"tv_show_directory": "abc", "url": "test"}, + }, + ) From a1681bf71adad1ef4b85299057e890f97e507da1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 16:00:54 -0700 Subject: [PATCH 35/48] Bump yt-dlp[default] from 2025.3.31 to 2025.4.30 (#1213) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.3.31 to 2025.4.30. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.03.31...2025.04.30) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-version: 2025.4.30 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 80d73970..91092da8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.3.31", + "yt-dlp[default]==2025.4.30", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 0c0f05e4d0b1762a625747b0ff73fade68b677d3 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 3 May 2025 19:40:28 -0700 Subject: [PATCH 36/48] [DEV] Get windows testing in better state (#1214) --- Makefile | 6 +++--- tests/unit/validators/test_file_path_validators.py | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 39d8939d..6bdc1e1a 100644 --- a/Makefile +++ b/Makefile @@ -14,9 +14,9 @@ else endif lint: - @-isort . - @-black . - @-pylint src/ + python3 -m isort . && \ + python3 -m black . && \ + python3 -m pylint src check_lint: isort . --check-only --diff \ && black . --check \ diff --git a/tests/unit/validators/test_file_path_validators.py b/tests/unit/validators/test_file_path_validators.py index 467f7b80..e66a11c2 100644 --- a/tests/unit/validators/test_file_path_validators.py +++ b/tests/unit/validators/test_file_path_validators.py @@ -1,3 +1,4 @@ +import os import tempfile from pathlib import Path @@ -34,7 +35,8 @@ class TestStringFormatterFilePathValidator: Script({"file_name": formatter.format_string}).resolve().get_str("file_name") ) - assert truncated_file_path.count(".") == ext.count(".") + _, truncated_file_name = os.path.split(truncated_file_path) + assert truncated_file_name.count(".") == ext.count(".") assert str(Path(temp_dir)) in truncated_file_path assert ext in truncated_file_path From d5e8157b6c217235074d6c2bbdaae491dae1cbc3 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 3 May 2025 19:56:46 -0700 Subject: [PATCH 37/48] [FEATURE] Add ability to suppress colors via CLI arg (#1215) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Not all terminals/logs displayed colors correctly. Adds the ability to suppress any color via `--suppress-colors` cli arg. Thanks @drewski3420 for the contribution 🎉 --- src/ytdl_sub/cli/entrypoint.py | 2 +- src/ytdl_sub/cli/output_summary.py | 50 +++++++++++++++------------ src/ytdl_sub/cli/parsers/main.py | 9 +++++ tests/unit/cli/test_output_summary.py | 6 ++-- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/ytdl_sub/cli/entrypoint.py b/src/ytdl_sub/cli/entrypoint.py index c19baf33..eace6173 100644 --- a/src/ytdl_sub/cli/entrypoint.py +++ b/src/ytdl_sub/cli/entrypoint.py @@ -271,6 +271,6 @@ def main() -> List[Subscription]: transaction_log_file_path=args.transaction_log, ) - output_summary(subscriptions) + output_summary(subscriptions, suppress_colors=args.suppress_colors) return subscriptions diff --git a/src/ytdl_sub/cli/output_summary.py b/src/ytdl_sub/cli/output_summary.py index 69cf3217..44819f59 100644 --- a/src/ytdl_sub/cli/output_summary.py +++ b/src/ytdl_sub/cli/output_summary.py @@ -8,16 +8,16 @@ from ytdl_sub.utils.logger import Logger logger = Logger.get() -def _green(value: str) -> str: - return Fore.GREEN + value + Fore.RESET +def _green(value: str, suppress_colors: bool = False) -> str: + return value if suppress_colors else Fore.GREEN + value + Fore.RESET -def _red(value: str) -> str: - return Fore.RED + value + Fore.RESET +def _red(value: str, suppress_colors: bool = False) -> str: + return value if suppress_colors else Fore.RED + value + Fore.RESET -def _no_color(value: str) -> str: - return Fore.RESET + value + Fore.RESET +def _no_color(value: str, suppress_colors: bool = False) -> str: + return value if suppress_colors else Fore.RESET + value + Fore.RESET def _str_int(value: int) -> str: @@ -26,21 +26,23 @@ def _str_int(value: int) -> str: return str(value) -def _color_int(value: int) -> str: +def _color_int(value: int, suppress_colors: bool = False) -> str: str_int = _str_int(value) if value > 0: - return _green(str_int) + return _green(str_int, suppress_colors) if value < 0: - return _red(str_int) - return _no_color(str_int) + return _red(str_int, suppress_colors) + return _no_color(str_int, suppress_colors) -def output_summary(subscriptions: List[Subscription]) -> None: +def output_summary(subscriptions: List[Subscription], suppress_colors: bool) -> None: """ Parameters ---------- subscriptions Processed subscriptions + suppress_colors + Whether to have color or not Returns ------- @@ -65,21 +67,21 @@ def output_summary(subscriptions: List[Subscription]) -> None: # Initialize widths to 0 width_sub_name: int = max(len(sub.name) for sub in subscriptions) + 4 # aesthetics - width_num_entries_added: int = len(_color_int(total_added)) - width_num_entries_modified: int = len(_color_int(total_modified)) - width_num_entries_removed: int = len(_color_int(total_removed)) + width_num_entries_added: int = len(_color_int(total_added, suppress_colors)) + width_num_entries_modified: int = len(_color_int(total_modified, suppress_colors)) + width_num_entries_removed: int = len(_color_int(total_removed, suppress_colors)) width_num_entries: int = len(str(total_entries)) + 4 # aesthetics # Build the summary for subscription in subscriptions: - num_entries_added = _color_int(subscription.num_entries_added) - num_entries_modified = _color_int(subscription.num_entries_modified) - num_entries_removed = _color_int(subscription.num_entries_removed * -1) + num_entries_added = _color_int(subscription.num_entries_added, suppress_colors) + num_entries_modified = _color_int(subscription.num_entries_modified, suppress_colors) + num_entries_removed = _color_int(subscription.num_entries_removed * -1, suppress_colors) num_entries = str(subscription.num_entries) status = ( - _red(subscription.exception.__class__.__name__) + _red(subscription.exception.__class__.__name__, suppress_colors) if subscription.exception - else _green("✔") + else _green("✔", suppress_colors) ) summary.append( @@ -92,14 +94,16 @@ def output_summary(subscriptions: List[Subscription]) -> None: ) total_errors_str = ( - _green("Success") if total_errors == 0 else _red(f"Error{'s' if total_errors > 1 else ''}") + _green("Success", suppress_colors) + if total_errors == 0 + else _red(f"Error{'s' if total_errors > 1 else ''}", suppress_colors) ) summary.append( f"{total_subs_str:<{width_sub_name}} " - f"{_color_int(total_added):>{width_num_entries_added}} " - f"{_color_int(total_modified):>{width_num_entries_modified}} " - f"{_color_int(total_removed * -1):>{width_num_entries_removed}} " + f"{_color_int(total_added, suppress_colors):>{width_num_entries_added}} " + f"{_color_int(total_modified, suppress_colors):>{width_num_entries_modified}} " + f"{_color_int(total_removed * -1, suppress_colors):>{width_num_entries_removed}} " f"{total_entries:>{width_num_entries}} " f"{total_errors_str}" ) diff --git a/src/ytdl_sub/cli/parsers/main.py b/src/ytdl_sub/cli/parsers/main.py index 3c31e900..b88b165c 100644 --- a/src/ytdl_sub/cli/parsers/main.py +++ b/src/ytdl_sub/cli/parsers/main.py @@ -44,6 +44,7 @@ class MainArguments: short="-m", long="--match", ) + SUPPRESS_COLORS = CLIArgument(short="-nc", long="--suppress-colors") @classmethod def all(cls) -> List[CLIArgument]: @@ -59,6 +60,7 @@ class MainArguments: cls.TRANSACTION_LOG, cls.SUPPRESS_TRANSACTION_LOG, cls.MATCH, + cls.SUPPRESS_COLORS, ] @classmethod @@ -129,6 +131,13 @@ def _add_shared_arguments(arg_parser: argparse.ArgumentParser, suppress_defaults help="do not output transaction logs to console or file", default=argparse.SUPPRESS if suppress_defaults else False, ) + arg_parser.add_argument( + MainArguments.SUPPRESS_COLORS.short, + MainArguments.SUPPRESS_COLORS.long, + action="store_true", + help="do not use colors in ytdl-sub output", + default=argparse.SUPPRESS if suppress_defaults else False, + ) arg_parser.add_argument( MainArguments.MATCH.short, MainArguments.MATCH.long, diff --git a/tests/unit/cli/test_output_summary.py b/tests/unit/cli/test_output_summary.py index 67422532..a31c9d58 100644 --- a/tests/unit/cli/test_output_summary.py +++ b/tests/unit/cli/test_output_summary.py @@ -36,7 +36,7 @@ def test_output_summary_no_errors(): ] ) - output_summary(subscriptions=mock_subscriptions) + output_summary(subscriptions=mock_subscriptions, suppress_colors=False) def test_output_summary_one_error(): @@ -50,7 +50,7 @@ def test_output_summary_one_error(): ] ) - output_summary(subscriptions=mock_subscriptions) + output_summary(subscriptions=mock_subscriptions, suppress_colors=False) def test_output_summary_multiple_errors(): @@ -64,4 +64,4 @@ def test_output_summary_multiple_errors(): ] ) - output_summary(subscriptions=mock_subscriptions) + output_summary(subscriptions=mock_subscriptions, suppress_colors=True) From dfcbadb69d01d3e2fe43429a07aa8be78120bca2 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 3 May 2025 21:46:31 -0700 Subject: [PATCH 38/48] [BACKEND] Make kodi_safe nfo overrideable (#1216) For an upcoming change to make preset selection easier --- Makefile | 6 +++--- docs/source/config_reference/plugins.rst | 4 ++-- src/ytdl_sub/config/overrides.py | 9 +++++++++ src/ytdl_sub/config/plugin/plugin.py | 5 +---- src/ytdl_sub/downloaders/url/downloader.py | 9 +++------ src/ytdl_sub/plugins/date_range.py | 5 +---- src/ytdl_sub/plugins/filter_exclude.py | 8 +++----- src/ytdl_sub/plugins/filter_include.py | 4 ++-- src/ytdl_sub/plugins/nfo_tags.py | 13 ++++++------- 9 files changed, 30 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 6bdc1e1a..938e8fe7 100644 --- a/Makefile +++ b/Makefile @@ -14,9 +14,9 @@ else endif lint: - python3 -m isort . && \ - python3 -m black . && \ - python3 -m pylint src + python3 -m isort . + python3 -m black . + python3 -m pylint src check_lint: isort . --check-only --diff \ && black . --check \ diff --git a/docs/source/config_reference/plugins.rst b/docs/source/config_reference/plugins.rst index c3161a27..69afce80 100644 --- a/docs/source/config_reference/plugins.rst +++ b/docs/source/config_reference/plugins.rst @@ -456,7 +456,7 @@ with a ``.nfo`` extension. You can add any values into the NFO. ``kodi_safe`` -:expected type: Optional[Boolean] +:expected type: OverridesBooleanFormatterValidator :description: Defaults to False. Kodi does not support > 3-byte unicode characters, which include emojis and some foreign language characters. Setting this to True will replace those @@ -554,7 +554,7 @@ Usage: ``kodi_safe`` -:expected type: Optional[Boolean] +:expected type: OverridesBooleanFormatterValidator :description: Defaults to False. Kodi does not support > 3-byte unicode characters, which include emojis and some foreign language characters. Setting this to True will replace those diff --git a/src/ytdl_sub/config/overrides.py b/src/ytdl_sub/config/overrides.py index 9b7a4372..8ed6990c 100644 --- a/src/ytdl_sub/config/overrides.py +++ b/src/ytdl_sub/config/overrides.py @@ -221,3 +221,12 @@ class Overrides(UnstructuredDictFormatterValidator, Scriptable): return self._apply_to_resolvable( formatter=formatter, entry=None, function_overrides=None ).native + + def evaluate_boolean( + self, formatter: StringFormatterValidator, entry: Optional[Entry] = None + ) -> bool: + """ + Apply a formatter, and evaluate it to a boolean + """ + output = self.apply_formatter(formatter=formatter, entry=entry) + return ScriptUtils.bool_formatter_output(output) diff --git a/src/ytdl_sub/config/plugin/plugin.py b/src/ytdl_sub/config/plugin/plugin.py index 13feb41d..6b5929c1 100644 --- a/src/ytdl_sub/config/plugin/plugin.py +++ b/src/ytdl_sub/config/plugin/plugin.py @@ -13,7 +13,6 @@ from ytdl_sub.config.validators.options import OptionsValidatorT from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.entries.entry import Entry from ytdl_sub.utils.file_handler import FileMetadata -from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.ytdl_additions.enhanced_download_archive import DownloadArchiver from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive @@ -49,9 +48,7 @@ class Plugin(BasePlugin[OptionsValidatorT], Generic[OptionsValidatorT], ABC): Returns True if enabled, False if disabled. """ if isinstance(self.plugin_options, ToggleableOptionsDictValidator): - return ScriptUtils.bool_formatter_output( - self.overrides.apply_formatter(self.plugin_options.enable) - ) + return self.overrides.evaluate_boolean(self.plugin_options.enable) return True def ytdl_options_match_filters(self) -> Tuple[List[str], List[str]]: diff --git a/src/ytdl_sub/downloaders/url/downloader.py b/src/ytdl_sub/downloaders/url/downloader.py index f0595945..2db75fb1 100644 --- a/src/ytdl_sub/downloaders/url/downloader.py +++ b/src/ytdl_sub/downloaders/url/downloader.py @@ -25,7 +25,6 @@ from ytdl_sub.entries.script.variable_definitions import VARIABLES from ytdl_sub.entries.script.variable_definitions import VariableDefinitions from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.logger import Logger -from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.utils.thumbnail import ThumbnailTypes from ytdl_sub.utils.thumbnail import download_and_convert_url_thumbnail from ytdl_sub.utils.thumbnail import try_convert_download_thumbnail @@ -459,11 +458,9 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): metadata_ytdl_options = self.metadata_ytdl_options( ytdl_option_overrides=validator.ytdl_options.to_native_dict(self.overrides) ) - download_reversed = ScriptUtils.bool_formatter_output( - self.overrides.apply_formatter(validator.download_reverse) - ) - include_sibling_metadata = ScriptUtils.bool_formatter_output( - self.overrides.apply_formatter(validator.include_sibling_metadata) + download_reversed = self.overrides.evaluate_boolean(validator.download_reverse) + include_sibling_metadata = self.overrides.evaluate_boolean( + validator.include_sibling_metadata ) parents, orphan_entries = self._download_url_metadata( diff --git a/src/ytdl_sub/plugins/date_range.py b/src/ytdl_sub/plugins/date_range.py index 27b9c808..b8b73711 100644 --- a/src/ytdl_sub/plugins/date_range.py +++ b/src/ytdl_sub/plugins/date_range.py @@ -5,7 +5,6 @@ from typing import Tuple from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.utils.datetime import to_date_str -from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.validators.string_datetime import StringDatetimeValidator from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator @@ -95,9 +94,7 @@ class DateRangePlugin(Plugin[DateRangeOptions]): date_validator=self.plugin_options.after, overrides=self.overrides ) after_filter = f"upload_date >= {after_str}" - if ScriptUtils.bool_formatter_output( - self.overrides.apply_formatter(self.plugin_options.breaks) - ): + if self.overrides.evaluate_boolean(self.plugin_options.breaks): breaking_match_filters.append(after_filter) else: match_filters.append(after_filter) diff --git a/src/ytdl_sub/plugins/filter_exclude.py b/src/ytdl_sub/plugins/filter_exclude.py index 08f13939..7d256998 100644 --- a/src/ytdl_sub/plugins/filter_exclude.py +++ b/src/ytdl_sub/plugins/filter_exclude.py @@ -7,7 +7,6 @@ from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.entries.entry import Entry from ytdl_sub.utils.exceptions import StringFormattingException from ytdl_sub.utils.logger import Logger -from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.validators.string_formatter_validators import ListFormatterValidator from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive @@ -53,10 +52,9 @@ class FilterExcludePlugin(Plugin[FilterExcludeOptions]): return entry for formatter in self.plugin_options.list: - out = ScriptUtils.bool_formatter_output( - self.overrides.apply_formatter(formatter=formatter, entry=entry) - ) - if bool(out): + should_exclude = self.overrides.evaluate_boolean(formatter=formatter, entry=entry) + + if should_exclude: logger.info( "Filtering '%s' from the filter %s evaluating to True", entry.title, diff --git a/src/ytdl_sub/plugins/filter_include.py b/src/ytdl_sub/plugins/filter_include.py index 5f7fcc4a..c2bc5217 100644 --- a/src/ytdl_sub/plugins/filter_include.py +++ b/src/ytdl_sub/plugins/filter_include.py @@ -61,10 +61,10 @@ class FilterIncludePlugin(Plugin[FilterIncludeOptions]): return entry for formatter in self.plugin_options.list: - out = ScriptUtils.bool_formatter_output( + should_exclude = ScriptUtils.bool_formatter_output( self.overrides.apply_formatter(formatter=formatter, entry=entry) ) - if not bool(out): + if not should_exclude: logger.info( "Filtering '%s' from the filter %s evaluating to False", entry.title, diff --git a/src/ytdl_sub/plugins/nfo_tags.py b/src/ytdl_sub/plugins/nfo_tags.py index 86fe6568..24c07c72 100644 --- a/src/ytdl_sub/plugins/nfo_tags.py +++ b/src/ytdl_sub/plugins/nfo_tags.py @@ -5,7 +5,6 @@ from pathlib import Path from typing import Any from typing import Dict from typing import List -from typing import Optional from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator @@ -19,8 +18,8 @@ from ytdl_sub.utils.xml import to_xml from ytdl_sub.validators.file_path_validators import StringFormatterFileNameValidator from ytdl_sub.validators.nfo_validators import NfoTagsValidator from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator +from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator -from ytdl_sub.validators.validators import BoolValidator class SharedNfoTagsOptions(ToggleableOptionsDictValidator): @@ -54,8 +53,8 @@ class SharedNfoTagsOptions(ToggleableOptionsDictValidator): ) self._tags = self._validate_key_if_present(key="tags", validator=NfoTagsValidator) self._kodi_safe = self._validate_key_if_present( - key="kodi_safe", validator=BoolValidator, default=False - ).value + key="kodi_safe", validator=OverridesBooleanFormatterValidator, default="False" + ) @property def nfo_name(self) -> StringFormatterFileNameValidator: @@ -81,9 +80,9 @@ class SharedNfoTagsOptions(ToggleableOptionsDictValidator): return self._tags @property - def kodi_safe(self) -> Optional[bool]: + def kodi_safe(self) -> OverridesBooleanFormatterValidator: """ - :expected type: Optional[Boolean] + :expected type: OverridesBooleanFormatterValidator :description: Defaults to False. Kodi does not support > 3-byte unicode characters, which include emojis and some foreign language characters. Setting this to True will replace those @@ -141,7 +140,7 @@ class SharedNfoTagsPlugin(Plugin[SharedNfoTagsOptions], ABC): if not nfo_tags: return - if self.plugin_options.kodi_safe: + if self.overrides.evaluate_boolean(self.plugin_options.kodi_safe): nfo_root = to_max_3_byte_utf8_string(nfo_root) nfo_tags = { to_max_3_byte_utf8_string(key): [ From a4293398b7d633bb93e613ff819057e00f96cdb0 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 4 May 2025 18:19:32 -0700 Subject: [PATCH 39/48] [FEATURE] Add `join` and `strip` string functions to scripting (#1218) --- .../scripting/scripting_functions.rst | 35 +++++++++++++++++ .../script/functions/string_functions.py | 38 +++++++++++++++++++ .../script/functions/test_string_functions.py | 20 ++++++++++ 3 files changed, 93 insertions(+) diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index cc42c52c..61076fa7 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -660,6 +660,24 @@ contains_any :description: Returns true if any element in ``contains_array`` is in ``string``. False otherwise. +join +~~~~ +:spec: ``join(separator: String, array: Array) -> String`` + +:description: + Join all elements in the array together as a string, and insert the + separator between them. + +:usage: + +.. code-block:: python + + { + %join( ", ", ["item1", "item2"] ) + } + + # "item1, item2" + lower ~~~~~ :spec: ``lower(string: String) -> String`` @@ -710,6 +728,23 @@ string :description: Cast to String. +strip +~~~~~ +:spec: ``strip(string: String) -> String`` + +:description: + Strip a string of all its whitespace at the beginning and end. + +:usage: + +.. code-block:: python + + { + %trim(" delete the outer! ") + } + + # "delete the outer!" + titlecase ~~~~~~~~~ :spec: ``titlecase(string: String) -> String`` diff --git a/src/ytdl_sub/script/functions/string_functions.py b/src/ytdl_sub/script/functions/string_functions.py index e9af7a54..43ff87a5 100644 --- a/src/ytdl_sub/script/functions/string_functions.py +++ b/src/ytdl_sub/script/functions/string_functions.py @@ -176,3 +176,41 @@ class StringFunctions: # World """ return String(string.value.encode("utf-8").decode("unicode_escape")) + + @staticmethod + def join(separator: String, array: Array) -> String: + """ + :description: + Join all elements in the array together as a string, and insert the + separator between them. + + :usage: + + .. code-block:: python + + { + %join( ", ", ["item1", "item2"] ) + } + + # "item1, item2" + """ + + return String(separator.value.join(str(val) for val in array.value)) + + @staticmethod + def strip(string: String) -> String: + """ + :description: + Strip a string of all its whitespace at the beginning and end. + + :usage: + + .. code-block:: python + + { + %trim(" delete the outer! ") + } + + # "delete the outer!" + """ + return String(string.value.strip()) diff --git a/tests/unit/script/functions/test_string_functions.py b/tests/unit/script/functions/test_string_functions.py index f5c85741..bc5bfc32 100644 --- a/tests/unit/script/functions/test_string_functions.py +++ b/tests/unit/script/functions/test_string_functions.py @@ -152,3 +152,23 @@ class TestNumericFunctions: output = single_variable_output(f"{{%split('{input_string}', {split})}}") assert output == expected_output + + @pytest.mark.parametrize( + "value, expected_output", + [ + ("['a', 'b', 'c']", "a, b, c"), + ("['nope', [], {}]", "nope, [], {}"), + ("['a', 1, 3.14, True]", "a, 1, 3.14, true"), + ], + ) + def test_join(self, value, expected_output): + output = single_variable_output(f"{{%join(', ', {value})}}") + assert output == expected_output + + @pytest.mark.parametrize( + "value, expected_output", + [(" delete outer ", "delete outer"), (" delete me\n\n", "delete me")], + ) + def test_strip(self, value, expected_output): + output = single_variable_output(f"{{%strip('{value}')}}") + assert output == expected_output From d926617d5de39ea8daa70045104412911a09756f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 22:00:26 -0700 Subject: [PATCH 40/48] [DEV] Bump pylint from 3.3.6 to 3.3.7 (#1219) Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.3.6 to 3.3.7. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.6...v3.3.7) --- updated-dependencies: - dependency-name: pylint dependency-version: 3.3.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 91092da8..c59996e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.10.0", "isort==6.0.1", - "pylint==3.3.6", + "pylint==3.3.7", ] docs = [ "sphinx>=7,<9", From 8ea0360b1c56994d171c71d1accda51c1edcd973 Mon Sep 17 00:00:00 2001 From: markalex2209 <55829038+markalex2209@users.noreply.github.com> Date: Sun, 11 May 2025 22:34:45 +0300 Subject: [PATCH 41/48] [DOCS] Add faq about disabling parts of presets to address #506 (#1223) Closes https://github.com/jmbannon/ytdl-sub/issues/506 . Thanks @markalex2209 ! --------- Co-authored-by: Aliaksei Markouski --- docs/source/faq/index.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/source/faq/index.rst b/docs/source/faq/index.rst index f8ae6653..a3dad246 100644 --- a/docs/source/faq/index.rst +++ b/docs/source/faq/index.rst @@ -62,6 +62,29 @@ See the prebuilt preset :doc:`chunk_initial_download See the prebuilt preset :doc:`Filter Keywords `. +...prevent creation of NFO file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Creation of NFO files is done by :ref:`NFO tags plugin `. It, as any other plugin, can be disabled: + +.. code-block:: yaml + + nfo_tags: + enabled: False + +...prevent download of images +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The :ref:`config_reference/prebuilt_presets/tv_show:TV Show` presets by default downloads images corresponding to show and each episode. +This can be prevented by overriding following variables: + +.. code-block:: yaml + + overrides: + tv_show_fanart_file_name: "" # to stop creation of fanart.jpg in subscription + tv_show_poster_file_name: "" # to stop creation of poster.jpg in subscription + thumbnail_name: "" # to stop creation of episode thumbnails + There is a bug where... ----------------------- From c40b032eed497c23786a6442eeb34a3ec202a320 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 21:51:22 -0700 Subject: [PATCH 42/48] Bump yt-dlp[default] from 2025.4.30 to 2025.5.22 (#1224) Bumps [yt-dlp[default]](https://github.com/yt-dlp/yt-dlp) from 2025.4.30 to 2025.5.22. - [Release notes](https://github.com/yt-dlp/yt-dlp/releases) - [Changelog](https://github.com/yt-dlp/yt-dlp/blob/master/Changelog.md) - [Commits](https://github.com/yt-dlp/yt-dlp/compare/2025.04.30...2025.05.22) --- updated-dependencies: - dependency-name: yt-dlp[default] dependency-version: 2025.5.22 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c59996e8..def7bea1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp[default]==2025.4.30", + "yt-dlp[default]==2025.5.22", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From 987b1cd02886f651ebfe2c13218b9090243dc4e5 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 31 May 2025 08:52:15 -0700 Subject: [PATCH 43/48] [FEATURE] Ability to customize date used for deleting old files (#1221) Implements https://github.com/jmbannon/ytdl-sub/issues/1182 Adds the ability to change the `keep_files_date_eval` (traditionally upload_date_standardized) to any date, so long as its in the form of YYYY-MM-DD. Will be able to use this to have episodes get deleted based on their release_date or epoch_date, instead of their upload_date. --- docs/source/config_reference/plugins.rst | 12 +++++++ .../scripting/entry_variables.rst | 6 ++++ src/ytdl_sub/config/preset_options.py | 36 +++++++++++++++++-- .../config/validators/variable_validation.py | 7 +++- .../entries/script/variable_definitions.py | 12 +++++++ .../subscriptions/subscription_download.py | 19 ++++++++-- .../validators/string_formatter_validators.py | 15 ++++++++ .../enhanced_download_archive.py | 2 +- .../plugins/test_output_options.py | 34 ++++++++++++++++++ 9 files changed, 137 insertions(+), 6 deletions(-) diff --git a/docs/source/config_reference/plugins.rst b/docs/source/config_reference/plugins.rst index 69afce80..8e63e291 100644 --- a/docs/source/config_reference/plugins.rst +++ b/docs/source/config_reference/plugins.rst @@ -640,6 +640,8 @@ Defines where to output files and thumbnails after all post-processing has compl maintain_download_archive: True keep_files_before: now keep_files_after: 19000101 + keep_max_files: 1000 + keep_files_date_eval: "{upload_date_standardized}" ``download_archive_name`` @@ -690,6 +692,16 @@ Defines where to output files and thumbnails after all post-processing has compl ``keep_max_files``. +``keep_files_date_eval`` + +:expected type: str +:description: + Uses this standardized date in the form of YYYY-MM-DD to record in the + download archive for a given entry. Subsequently, uses this value to + perform evaluation for keep_files_before/after and keep_max_files. Defaults + to the entry's upload_date_standardized variable. + + ``keep_max_files`` :expected type: Optional[OverridesFormatter] diff --git a/docs/source/config_reference/scripting/entry_variables.rst b/docs/source/config_reference/scripting/entry_variables.rst index 84247234..eea90981 100644 --- a/docs/source/config_reference/scripting/entry_variables.rst +++ b/docs/source/config_reference/scripting/entry_variables.rst @@ -659,3 +659,9 @@ ytdl_sub_input_url_index :type: ``Integer`` :description: The index of the input URL as defined in the subscription, top-most being the 0th index. + +ytdl_sub_keep_files_date_eval +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:type: ``String`` +:description: + The standardized date variable supplied in ``output_options.keep_files_date_eval``. diff --git a/src/ytdl_sub/config/preset_options.py b/src/ytdl_sub/config/preset_options.py index f1ba8534..a16476ed 100644 --- a/src/ytdl_sub/config/preset_options.py +++ b/src/ytdl_sub/config/preset_options.py @@ -1,15 +1,19 @@ from typing import Any from typing import Dict from typing import Optional +from typing import Set from ytdl_sub.config.defaults import DEFAULT_DOWNLOAD_ARCHIVE_NAME from ytdl_sub.config.overrides import Overrides +from ytdl_sub.config.plugin.plugin_operation import PluginOperation +from ytdl_sub.config.validators.options import OptionsDictValidator +from ytdl_sub.entries.script.variable_definitions import VARIABLES as v from ytdl_sub.validators.file_path_validators import OverridesStringFormatterFilePathValidator from ytdl_sub.validators.file_path_validators import StringFormatterFileNameValidator -from ytdl_sub.validators.strict_dict_validator import StrictDictValidator from ytdl_sub.validators.string_datetime import StringDatetimeValidator from ytdl_sub.validators.string_formatter_validators import OverridesIntegerFormatterValidator from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator +from ytdl_sub.validators.string_formatter_validators import StandardizedDateValidator from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.validators.string_formatter_validators import ( UnstructuredOverridesDictFormatterValidator, @@ -65,7 +69,7 @@ class YTDLOptions(UnstructuredOverridesDictFormatterValidator): # pylint: disable=line-too-long -class OutputOptions(StrictDictValidator): +class OutputOptions(OptionsDictValidator): """ Defines where to output files and thumbnails after all post-processing has completed. @@ -87,6 +91,8 @@ class OutputOptions(StrictDictValidator): maintain_download_archive: True keep_files_before: now keep_files_after: 19000101 + keep_max_files: 1000 + keep_files_date_eval: "{upload_date_standardized}" """ _required_keys = {"output_directory", "file_name"} @@ -99,6 +105,8 @@ class OutputOptions(StrictDictValidator): "keep_files_before", "keep_files_after", "keep_max_files", + "download_archive_standardized_date", + "keep_files_date_eval", } @classmethod @@ -156,6 +164,11 @@ class OutputOptions(StrictDictValidator): self._keep_max_files = self._validate_key_if_present( "keep_max_files", OverridesIntegerFormatterValidator ) + self._keep_files_date_eval = self._validate_key( + "keep_files_date_eval", + StandardizedDateValidator, + default=f"{{{v.upload_date_standardized.variable_name}}}", + ) if ( self._keep_files_before or self._keep_files_after or self._keep_max_files @@ -272,6 +285,18 @@ class OutputOptions(StrictDictValidator): """ return self._keep_files_after + @property + def keep_files_date_eval(self) -> StandardizedDateValidator: + """ + :expected type: str + :description: + Uses this standardized date in the form of YYYY-MM-DD to record in the + download archive for a given entry. Subsequently, uses this value to + perform evaluation for keep_files_before/after and keep_max_files. Defaults + to the entry's upload_date_standardized variable. + """ + return self._keep_files_date_eval + @property def keep_max_files(self) -> Optional[OverridesIntegerFormatterValidator]: """ @@ -283,3 +308,10 @@ class OutputOptions(StrictDictValidator): applied. Can be used in conjunction with ``keep_files_before`` and ``keep_files_after``. """ return self._keep_max_files + + def added_variables(self, unresolved_variables: Set[str]) -> Dict[PluginOperation, Set[str]]: + return { + # PluginOperation.MODIFY_ENTRY_METADATA: { + # VARIABLES.ytdl_sub_entry_date_eval.variable_name + # } + } diff --git a/src/ytdl_sub/config/validators/variable_validation.py b/src/ytdl_sub/config/validators/variable_validation.py index 60488394..e2d5e85d 100644 --- a/src/ytdl_sub/config/validators/variable_validation.py +++ b/src/ytdl_sub/config/validators/variable_validation.py @@ -57,13 +57,14 @@ def _add_dummy_overrides(overrides: Overrides) -> Dict[str, str]: def _get_added_and_modified_variables( - plugins: PresetPlugins, downloader_options: MultiUrlValidator + plugins: PresetPlugins, downloader_options: MultiUrlValidator, output_options: OutputOptions ) -> Iterable[Tuple[OptionsValidator, Set[str], Set[str]]]: """ Iterates and returns the plugin options, added variables, modified variables """ options: List[OptionsValidator] = plugins.plugin_options options.append(downloader_options) + options.append(output_options) for plugin_options in options: added_variables: Set[str] = set() @@ -117,6 +118,7 @@ class VariableValidation: ) in _get_added_and_modified_variables( plugins=self.plugins, downloader_options=self.downloader_options, + output_options=self.output_options, ): for added_variable in added_variables: @@ -183,6 +185,9 @@ class VariableValidation: self._add_variables(PluginOperation.DOWNLOADER, options=self.downloader_options) self._add_subscription_override_variables() + # Always add output options first + self._add_variables(PluginOperation.MODIFY_ENTRY_METADATA, options=self.output_options) + # Metadata variables to be added for plugin_options in PluginMapping.order_options_by( self.plugins.zipped(), PluginOperation.MODIFY_ENTRY_METADATA diff --git a/src/ytdl_sub/entries/script/variable_definitions.py b/src/ytdl_sub/entries/script/variable_definitions.py index 5526780a..cc86737d 100644 --- a/src/ytdl_sub/entries/script/variable_definitions.py +++ b/src/ytdl_sub/entries/script/variable_definitions.py @@ -823,6 +823,17 @@ class YtdlSubVariableDefinitions(ABC): variable_name="upload_date_index_reversed_padded", pad=2 ) + @cached_property + def ytdl_sub_keep_files_date_eval(self: "VariableDefinitions") -> StringVariable: + """ + :description: + The standardized date variable supplied in ``output_options.keep_files_date_eval``. + """ + return StringVariable( + variable_name="ytdl_sub_entry_date_eval", + definition=f"{{%string({self.upload_date_standardized.variable_name})}}", + ) + class EntryVariableDefinitions(ABC): @cached_property @@ -1121,6 +1132,7 @@ class VariableDefinitions( self.ytdl_sub_input_url, self.ytdl_sub_input_url_index, self.ytdl_sub_input_url_count, + self.ytdl_sub_keep_files_date_eval, } @cache diff --git a/src/ytdl_sub/subscriptions/subscription_download.py b/src/ytdl_sub/subscriptions/subscription_download.py index 5d1b4cb3..9acabda4 100644 --- a/src/ytdl_sub/subscriptions/subscription_download.py +++ b/src/ytdl_sub/subscriptions/subscription_download.py @@ -17,6 +17,7 @@ from ytdl_sub.downloaders.source_plugin import SourcePlugin from ytdl_sub.downloaders.url.downloader import MultiUrlDownloader from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder from ytdl_sub.entries.entry import Entry +from ytdl_sub.entries.script.variable_definitions import VARIABLES from ytdl_sub.subscriptions.base_subscription import BaseSubscription from ytdl_sub.subscriptions.subscription_ytdl_options import SubscriptionYTDLOptions from ytdl_sub.utils.datetime import to_date_range @@ -215,9 +216,23 @@ class SubscriptionDownload(BaseSubscription, ABC): FileHandler.delete(entry.get_download_thumbnail_path()) FileHandler.delete(entry.get_download_info_json_path()) - @classmethod - def _preprocess_entry(cls, plugins: List[Plugin], entry: Entry) -> Optional[Entry]: + def _preprocess_entry(self, plugins: List[Plugin], entry: Entry) -> Optional[Entry]: maybe_entry: Optional[Entry] = entry + + # Inject OutputOption variables here + entry.add( + { + VARIABLES.ytdl_sub_keep_files_date_eval: ( + self.output_options.keep_files_date_eval.format_string + ) + } + ) + + # Run it to make sure it's actually a standardized date + _ = self.overrides.apply_formatter( + formatter=self.output_options.keep_files_date_eval, entry=entry + ) + for plugin in PluginMapping.order_plugins_by( plugins, PluginOperation.MODIFY_ENTRY_METADATA ): diff --git a/src/ytdl_sub/validators/string_formatter_validators.py b/src/ytdl_sub/validators/string_formatter_validators.py index 2c709ebb..855a607f 100644 --- a/src/ytdl_sub/validators/string_formatter_validators.py +++ b/src/ytdl_sub/validators/string_formatter_validators.py @@ -1,3 +1,4 @@ +from datetime import datetime from typing import Dict from typing import Set from typing import Union @@ -73,6 +74,20 @@ class StringFormatterValidator(StringValidator): return resolved +class StandardizedDateValidator(StringFormatterValidator): + _expected_value_type_name = "standardized_date" + + def post_process(self, resolved: str) -> str: + try: + datetime.strptime(resolved, "%Y-%m-%d") + except ValueError as exc: + raise self._validation_exception( + f"Expected a standardized date in the form of YYYY-MM-DD, but received '{resolved}'" + ) from exc + + return resolved + + # pylint: disable=line-too-long class OverridesStringFormatterValidator(StringFormatterValidator): """ diff --git a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py index ec155245..2c633a74 100644 --- a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +++ b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py @@ -75,7 +75,7 @@ class DownloadMapping: DownloadMapping for the entry """ return DownloadMapping( - upload_date=entry.get(v.upload_date_standardized, str), + upload_date=entry.get(v.ytdl_sub_keep_files_date_eval, str), extractor=entry.download_archive_extractor, file_names=set(), ) diff --git a/tests/integration/plugins/test_output_options.py b/tests/integration/plugins/test_output_options.py index c8665c1e..458416b4 100644 --- a/tests/integration/plugins/test_output_options.py +++ b/tests/integration/plugins/test_output_options.py @@ -1,3 +1,4 @@ +import re from pathlib import Path from typing import Dict from unittest.mock import patch @@ -11,6 +12,7 @@ from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.downloaders.ytdlp import YTDLP from ytdl_sub.entries.entry import Entry from ytdl_sub.subscriptions.subscription import Subscription +from ytdl_sub.utils.exceptions import ValidationException from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.thumbnail import try_convert_download_thumbnail @@ -223,3 +225,35 @@ class TestOutputOptions: dry_run=False, expected_download_summary_file_name="plugins/output_options/test_missing_thumb.json", ) + + def test_invalid_keep_files_date_eval( + self, + config: ConfigFile, + subscription_name: str, + output_options_subscription_dict: Dict, + output_directory: str, + mock_download_collection_entries, + ): + output_options_subscription_dict["output_options"]["keep_files_date_eval"] = "nope" + + subscription = Subscription.from_dict( + config=config, + preset_name=subscription_name, + preset_dict=output_options_subscription_dict, + ) + + expected_error_msg = ( + "Validation error in subscription_test.output_options.keep_files_date_eval: " + "Expected a standardized date in the form of YYYY-MM-DD, but received 'nope'" + ) + + with ( + mock_download_collection_entries( + is_youtube_channel=False, + num_urls=1, + is_extracted_audio=False, + is_dry_run=True, + ), + pytest.raises(ValidationException, match=re.escape(expected_error_msg)), + ): + subscription.download(dry_run=True) From bc15fe09bd7be371f9d9543fb80d934c081fc59c Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 31 May 2025 09:41:14 -0700 Subject: [PATCH 44/48] [FEATURE] Throttle protection per request (#1229) Allows adding a sleep inbetween every request during metadata scrape. ``` throttle_protection: sleep_per_request_s: min: 4 max: 6 ``` Closes https://github.com/jmbannon/ytdl-sub/issues/1222 --- docs/source/config_reference/plugins.rst | 13 ++++++ src/ytdl_sub/plugins/subtitles.py | 7 +++- src/ytdl_sub/plugins/throttle_protection.py | 41 +++++++++++++++++++ .../subscription_ytdl_options.py | 2 + tests/e2e/presets/test_soundcloud.py | 1 + 5 files changed, 63 insertions(+), 1 deletion(-) diff --git a/docs/source/config_reference/plugins.rst b/docs/source/config_reference/plugins.rst index 8e63e291..4825f0f7 100644 --- a/docs/source/config_reference/plugins.rst +++ b/docs/source/config_reference/plugins.rst @@ -903,6 +903,9 @@ scripted. presets: my_example_preset: throttle_protection: + sleep_per_request_s: + min: 5.5 + max: 10.4 sleep_per_download_s: min: 2.2 max: 10.8 @@ -938,6 +941,16 @@ scripted. ytdl-sub to perform post-processing. +``sleep_per_request_s`` + +:expected type: Optional[Range] +:description: + Number in seconds to sleep between each request during metadata download. Note that + metadata download refers to the initial info.json download, not the actual audio/video + download for the entry. Also, yt-dlp only supports a single value at this time for this, + so will always use the max value. + + ``sleep_per_subscription_s`` :expected type: Optional[Range] diff --git a/src/ytdl_sub/plugins/subtitles.py b/src/ytdl_sub/plugins/subtitles.py index ecf32a1d..74aee5a8 100644 --- a/src/ytdl_sub/plugins/subtitles.py +++ b/src/ytdl_sub/plugins/subtitles.py @@ -146,7 +146,12 @@ class SubtitlesPlugin(Plugin[SubtitleOptions]): plugin_options_type = SubtitleOptions def ytdl_options(self) -> Optional[Dict]: - builder = YTDLOptionsBuilder().add({"writesubtitles": True}) + builder = YTDLOptionsBuilder().add( + { + "writesubtitles": True, + "sleep_interval_subtitles": 5.367, # for safe measure + } + ) if self.plugin_options.embed_subtitles: builder.add( diff --git a/src/ytdl_sub/plugins/throttle_protection.py b/src/ytdl_sub/plugins/throttle_protection.py index 5bd45f10..77ec4fa8 100644 --- a/src/ytdl_sub/plugins/throttle_protection.py +++ b/src/ytdl_sub/plugins/throttle_protection.py @@ -1,5 +1,6 @@ import random import time +from typing import Dict from typing import Optional from ytdl_sub.config.overrides import Overrides @@ -40,6 +41,22 @@ class RandomizedRangeValidator(StrictDictValidator): f"max ({self._max}) must be greater than or equal to min ({self._min})" ) + def min_value(self) -> float: + """ + Returns + ------- + Minimum value + """ + return self._min + + def max_value(self) -> float: + """ + Returns + ------- + Maximum value + """ + return self._max + def randomized_float(self) -> float: """ Returns @@ -70,6 +87,9 @@ class ThrottleProtectionOptions(ToggleableOptionsDictValidator): presets: my_example_preset: throttle_protection: + sleep_per_request_s: + min: 5.5 + max: 10.4 sleep_per_download_s: min: 2.2 max: 10.8 @@ -84,6 +104,7 @@ class ThrottleProtectionOptions(ToggleableOptionsDictValidator): _optional_keys = { "enable", + "sleep_per_request_s", "sleep_per_download_s", "sleep_per_subscription_s", "max_downloads_per_subscription", @@ -93,6 +114,9 @@ class ThrottleProtectionOptions(ToggleableOptionsDictValidator): def __init__(self, name, value): super().__init__(name, value) + self._sleep_per_request_s = self._validate_key_if_present( + key="sleep_per_request_s", validator=RandomizedRangeValidator + ) self._sleep_per_download_s = self._validate_key_if_present( key="sleep_per_download_s", validator=RandomizedRangeValidator ) @@ -106,6 +130,18 @@ class ThrottleProtectionOptions(ToggleableOptionsDictValidator): key="subscription_download_probability", validator=ProbabilityValidator ) + @property + def sleep_per_request_s(self) -> Optional[RandomizedRangeValidator]: + """ + :expected type: Optional[Range] + :description: + Number in seconds to sleep between each request during metadata download. Note that + metadata download refers to the initial info.json download, not the actual audio/video + download for the entry. Also, yt-dlp only supports a single value at this time for this, + so will always use the max value. + """ + return self._sleep_per_request_s + @property def sleep_per_download_s(self) -> Optional[RandomizedRangeValidator]: """ @@ -165,6 +201,11 @@ class ThrottleProtectionPlugin(Plugin[ThrottleProtectionOptions]): self.plugin_options.max_downloads_per_subscription.randomized_int() ) + def ytdl_options(self) -> Optional[Dict]: + if self.plugin_options.sleep_per_request_s is not None: + return {"sleep_interval_requests": self.plugin_options.sleep_per_request_s.max_value()} + return {} + def initialize_subscription(self) -> bool: if self.plugin_options.subscription_download_probability: proba = self.plugin_options.subscription_download_probability.value diff --git a/src/ytdl_sub/subscriptions/subscription_ytdl_options.py b/src/ytdl_sub/subscriptions/subscription_ytdl_options.py index 12efb951..b5772197 100644 --- a/src/ytdl_sub/subscriptions/subscription_ytdl_options.py +++ b/src/ytdl_sub/subscriptions/subscription_ytdl_options.py @@ -19,6 +19,7 @@ from ytdl_sub.plugins.match_filters import MatchFiltersPlugin from ytdl_sub.plugins.match_filters import combine_filters from ytdl_sub.plugins.match_filters import default_filters from ytdl_sub.plugins.subtitles import SubtitlesPlugin +from ytdl_sub.plugins.throttle_protection import ThrottleProtectionPlugin from ytdl_sub.utils.ffmpeg import FFMPEG from ytdl_sub.utils.logger import Logger from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive @@ -175,6 +176,7 @@ class SubscriptionYTDLOptions: self._global_options, self._output_options, self._plugin_match_filters, + self._plugin_ytdl_options(ThrottleProtectionPlugin), self._plugin_ytdl_options(FormatPlugin), self._plugin_ytdl_options(AudioExtractPlugin), # will override format self._user_ytdl_options, # user ytdl options... diff --git a/tests/e2e/presets/test_soundcloud.py b/tests/e2e/presets/test_soundcloud.py index 9dbe6481..15c6d7d6 100644 --- a/tests/e2e/presets/test_soundcloud.py +++ b/tests/e2e/presets/test_soundcloud.py @@ -19,6 +19,7 @@ def subscription_dict(output_directory): "subscription_indent_1": "Acoustic", "music_directory": output_directory, }, + "throttle_protection": {"sleep_per_request_s": {"min": 0.1, "max": 0.5}}, } From 36e23839f36b6408f5ee49e98319cd3f1a435de9 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 31 May 2025 10:26:42 -0700 Subject: [PATCH 45/48] [FEATURE] Ability to change season and episode ordering via variables, support for release_date (#1220) Adds the ability to change season and episode ordering using override variables, like so: ``` "~Kids Toys Play": url: "https://www.youtube.com/@KidsToysPlayChannel" tv_show_by_date_season_ordering: "upload-year-month" tv_show_by_date_episode_ordering: "upload-day" ``` In addition, adds support for release-date based episode ordering (and culling if using Only Recent). More info here: https://ytdl-sub.readthedocs.io/en/latest/prebuilt_presets/tv_shows.html Closes https://github.com/jmbannon/ytdl-sub/issues/1182 --- .../scripting/scripting_functions.rst | 2 +- docs/source/faq/index.rst | 4 +- docs/source/prebuilt_presets/tv_shows.rst | 142 ++++++--- src/ytdl_sub/downloaders/url/downloader.py | 4 +- .../prebuilt_presets/tv_show/__init__.py | 43 --- .../prebuilt_presets/tv_show/episode.yaml | 8 +- .../tv_show/tv_show_by_date.yaml | 107 ++++++- .../tv_show/tv_show_collection.yaml | 54 +++- .../script/functions/string_functions.py | 4 +- .../enhanced_download_archive.py | 8 +- tests/integration/conftest.py | 15 + .../prebuilt_presets/test_tv_show_by_date.py | 153 ++++++++-- .../test_tv_show_collection.py | 82 ++++-- .../download-index/is_yt_1_migrated.json | 22 ++ .../upload-year/upload-month-day/is_yt_1.json | 22 ++ .../release-day/is_yt_1.json | 22 ++ .../release-year/download-index/is_yt_1.json | 22 ++ .../release-month-day-reversed/is_yt_1.json | 22 ++ .../release-month-day/is_yt_1.json | 22 ++ .../upload-year-month/upload-day/is_yt_1.json | 22 ++ .../upload-year/download-index/is_yt_1.json | 22 ++ .../download-index/is_yt_1_migrated.json | 22 ++ .../upload-month-day-reversed/is_yt_1.json | 22 ++ .../upload-year/upload-month-day/is_yt_1.json | 22 ++ .../download-index/is_yt_1_migrated.json | 17 ++ .../upload-year/upload-month-day/is_yt_1.json | 17 ++ .../s_1/is_yt_1_migrated.json | 23 ++ .../s_2/is_yt_1_migrated.json | 40 +++ .../upload-year-month-day/s_1/is_yt_1.json | 23 ++ .../upload-year-month-day/s_2/is_yt_1.json | 40 +++ .../Kodi/does-not-exist/s_1/is_yt_1.json | 1 + .../playlist-index-reversed/s_1/is_yt_1.json | 23 ++ .../s_1/is_yt_1_migrated.json | 23 ++ .../playlist-index-reversed/s_2/is_yt_1.json | 40 +++ .../s_2/is_yt_1_migrated.json | 40 +++ .../Kodi/playlist-index/s_1/is_yt_1.json | 23 ++ .../Kodi/playlist-index/s_2/is_yt_1.json | 40 +++ .../s_1/is_yt_1.json | 23 ++ .../s_2/is_yt_1.json | 40 +++ .../release-year-month-day/s_1/is_yt_1.json | 23 ++ .../release-year-month-day/s_2/is_yt_1.json | 40 +++ .../s_1/is_yt_1.json | 23 ++ .../s_2/is_yt_1.json | 40 +++ .../upload-year-month-day/s_1/is_yt_1.json | 23 ++ .../upload-year-month-day/s_2/is_yt_1.json | 40 +++ .../s_1/is_yt_1_migrated.json | 18 ++ .../s_2/is_yt_1_migrated.json | 31 ++ .../upload-year-month-day/s_1/is_yt_1.json | 18 ++ .../upload-year-month-day/s_2/is_yt_1.json | 31 ++ .../upload-year/upload-month-day}/is_yt_1.txt | 0 .../is_yt_1_reformatted_to_upload-year.txt} | 0 .../release-day/is_yt_1.txt | 130 ++++++++ .../is_yt_1_reformatted_to_upload-year.txt | 145 +++++++++ .../release-year/download-index/is_yt_1.txt | 130 ++++++++ .../is_yt_1_reformatted_to_upload-year.txt | 145 +++++++++ .../release-month-day-reversed/is_yt_1.txt | 130 ++++++++ .../is_yt_1_reformatted_to_upload-year.txt | 145 +++++++++ .../release-month-day/is_yt_1.txt | 130 ++++++++ .../is_yt_1_reformatted_to_upload-year.txt | 145 +++++++++ .../upload-year-month/upload-day}/is_yt_1.txt | 0 .../is_yt_1_reformatted_to_upload-year.txt} | 0 .../upload-year/download-index}/is_yt_1.txt | 0 .../is_yt_1_reformatted_to_upload-year.txt} | 0 .../upload-month-day-reversed}/is_yt_1.txt | 0 .../is_yt_1_reformatted_to_upload-year.txt} | 0 .../upload-year/upload-month-day}/is_yt_1.txt | 0 .../is_yt_1_reformatted_to_upload-year.txt} | 0 .../upload-year/upload-month-day}/is_yt_1.txt | 0 .../is_yt_1_reformatted_to_upload-year.txt} | 0 .../upload-year-month-day}/s_1/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../upload-year-month-day}/s_2/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../Kodi/does-not-exist/s_1/is_yt_1.txt | 1 + ...reformatted_to_playlist-index-reversed.txt | 4 + .../playlist-index-reversed}/s_1/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../playlist-index-reversed}/s_2/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../Kodi/playlist-index}/s_1/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../Kodi/playlist-index}/s_2/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../s_1/is_yt_1.txt | 134 +++++++++ ...reformatted_to_playlist-index-reversed.txt | 143 +++++++++ .../s_2/is_yt_1.txt | 257 ++++++++++++++++ ...reformatted_to_playlist-index-reversed.txt | 277 ++++++++++++++++++ .../release-year-month-day/s_1/is_yt_1.txt | 134 +++++++++ ...reformatted_to_playlist-index-reversed.txt | 143 +++++++++ .../release-year-month-day/s_2/is_yt_1.txt | 257 ++++++++++++++++ ...reformatted_to_playlist-index-reversed.txt | 277 ++++++++++++++++++ .../s_1/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../s_2/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../upload-year-month-day}/s_1/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../upload-year-month-day}/s_2/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../upload-year-month-day}/s_1/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 .../upload-year-month-day}/s_2/is_yt_1.txt | 0 ...eformatted_to_playlist-index-reversed.txt} | 0 103 files changed, 4120 insertions(+), 175 deletions(-) create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/download-index/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/download-index/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_1/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_2/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_1/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_2/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1.json rename tests/resources/transaction_log_summaries/{unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day => integration/by-date/Jellyfin/upload-year/upload-month-day}/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt => integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt} (100%) create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1_reformatted_to_upload-year.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1_reformatted_to_upload-year.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1_reformatted_to_upload-year.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1_reformatted_to_upload-year.txt rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day => integration/by-date/Kodi/upload-year-month/upload-day}/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt => integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1_reformatted_to_upload-year.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index => integration/by-date/Kodi/upload-year/download-index}/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt => integration/by-date/Kodi/upload-year/download-index/is_yt_1_reformatted_to_upload-year.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed => integration/by-date/Kodi/upload-year/upload-month-day-reversed}/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt => integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1_reformatted_to_upload-year.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day => integration/by-date/Kodi/upload-year/upload-month-day}/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt => integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/plex_tv_show_by_date/season_by_year__episode_by_month_day => integration/by-date/Plex/upload-year/upload-month-day}/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt => integration/by-date/Plex/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day => integration/collection/Jellyfin/upload-year-month-day}/s_1/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day => integration/collection/Jellyfin/upload-year-month-day}/s_2/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed => integration/collection/Kodi/playlist-index-reversed}/s_1/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed => integration/collection/Kodi/playlist-index-reversed}/s_2/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index => integration/collection/Kodi/playlist-index}/s_1/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/playlist-index/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index => integration/collection/Kodi/playlist-index}/s_2/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/playlist-index/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed => integration/collection/Kodi/upload-year-month-day-reversed}/s_1/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed => integration/collection/Kodi/upload-year-month-day-reversed}/s_2/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day => integration/collection/Kodi/upload-year-month-day}/s_1/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day => integration/collection/Kodi/upload-year-month-day}/s_2/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day => integration/collection/Plex/upload-year-month-day}/s_1/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Plex/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) rename tests/resources/transaction_log_summaries/{unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day => integration/collection/Plex/upload-year-month-day}/s_2/is_yt_1.txt (100%) rename tests/resources/transaction_log_summaries/{unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt => integration/collection/Plex/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt} (100%) diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index 61076fa7..e2cf4e41 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -634,7 +634,7 @@ capitalize concat ~~~~~~ -:spec: ``concat(values: String, ...) -> String`` +:spec: ``concat(values: AnyArgument, ...) -> String`` :description: Concatenate multiple Strings into a single String. diff --git a/docs/source/faq/index.rst b/docs/source/faq/index.rst index a3dad246..95f9e06b 100644 --- a/docs/source/faq/index.rst +++ b/docs/source/faq/index.rst @@ -63,9 +63,9 @@ See the prebuilt preset :doc:`chunk_initial_download See the prebuilt preset :doc:`Filter Keywords `. ...prevent creation of NFO file -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Creation of NFO files is done by :ref:`NFO tags plugin `. It, as any other plugin, can be disabled: +Creation of NFO files is done by the NFO tags plugin. It, as any other plugin, can be disabled: .. code-block:: yaml diff --git a/docs/source/prebuilt_presets/tv_shows.rst b/docs/source/prebuilt_presets/tv_shows.rst index 8510350d..9cf0f92b 100644 --- a/docs/source/prebuilt_presets/tv_shows.rst +++ b/docs/source/prebuilt_presets/tv_shows.rst @@ -28,23 +28,18 @@ Plex ---------------------------------------------- -Generic Presets -=============== - -There are two main methods for downloading and formatting videos as a TV show. - TV Show by Date ---------------- +=============== TV Show by Date will organize something like a YouTube channel or playlist into a tv show, where seasons and episodes are organized using upload date. Example -~~~~~~~ +------- Must define ``tv_show_directory``. Available presets: -* ``"Kodi TV Show by Date"`` -* ``"Jellyfin TV Show by Date"`` -* ``"Plex TV Show by Date"`` +* ``Kodi TV Show by Date`` +* ``Jellyfin TV Show by Date`` +* ``Plex TV Show by Date`` .. code-block:: yaml @@ -72,30 +67,68 @@ Must define ``tv_show_directory``. Available presets: - "https://www.youtube.com/@rickbeato240" Advanced Usage -~~~~~~~~~~~~~~ +-------------- -If you prefer a different organization method, you can instead apply multiple presets to your subscriptions. +If you prefer a different season/episode organization method, you can set the following override variables. -You will need a base of one of the below: +.. code-block:: yaml -* ``kodi_tv_show_by_date`` -* ``jellyfin_tv_show_by_date`` -* ``plex_tv_show_by_date`` + __preset__: + overrides: + tv_show_directory: "/tv_shows" + tv_show_by_date_season_ordering: "upload-year-month" + tv_show_by_date_episode_ordering: "upload-day" -And then add one of these: +Or for a specific preset -* ``season_by_year__episode_by_month_day`` -* ``season_by_year_month__episode_by_day`` -* ``season_by_year__episode_by_month_day_reversed`` - - * Episode numbers are reversed, meaning more recent episodes appear at the top of a season by having a lower value. -* ``season_by_year__episode_by_download_index`` - - * Episodes are numbered by the download order. NOTE that this is fetched using the length of the download archive. Do not use if you intend to remove old videos. +.. code-block:: yaml + "~Kids Toys Play": + url: "https://www.youtube.com/@KidsToysPlayChannel" + tv_show_by_date_season_ordering: "upload-year-month" + tv_show_by_date_episode_ordering: "upload-day" + +The following are supported. Be sure the combined season + episode ordering +include the year, month, day, i.e. upload-year + upload-month-day. + + +Season Ordering +~~~~~~~~~~~~~~~ + +``tv_show_by_date_season_ordering`` supports one of the following: + +* ``upload-year`` (default) +* ``upload-year-month`` +* ``release-year`` +* ``release-year-month`` + + +Episode Ordering +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``tv_show_by_date_episode_ordering`` supports one of the following: + +* ``upload-month-day`` (default) +* ``upload-month-day-reversed`` + + * Reversed means more recent episodes appear at the top of a season by having a lower value. +* ``upload-day`` +* ``release-day`` +* ``release-month-day`` +* ``release-month-day-reversed`` +* ``download-index`` + + * Episodes are numbered by the download order. **NOTE**: this is fetched using the length of the download archive. Do not use if you intend to remove old videos. + +TV Show by Date presets use the following for defaults: + +.. code-block:: yaml + + tv_show_by_date_season_ordering: "upload-year" + tv_show_by_date_episode_ordering: "upload-month-day" TV Show Collection ------------------- +================== TV Show Collections set each URL as its own season. If a video belongs to multiple URLs (i.e. a channel and a channel's playlist), the video will only download once and reside in @@ -109,12 +142,12 @@ Two main use cases of a collection are: represents a separate channel/playlist. Example -~~~~~~~ +------- Must define ``tv_show_directory``. Available presets: -* ``"Kodi TV Show Collection"`` -* ``"Jellyfin TV Show Collection"`` -* ``"Plex TV Show Collection"`` +* ``Kodi TV Show Collection`` +* ``Jellyfin TV Show Collection`` +* ``Plex TV Show Collection`` .. code-block:: yaml @@ -132,21 +165,44 @@ Must define ``tv_show_directory``. Available presets: s02_url: "https://www.youtube.com/playlist?list=PLE62gWlWZk5NWVAVuf0Lm9jdv_-_KXs0W" Advanced Usage -~~~~~~~~~~~~~~ +-------------- -If you prefer a different organization method, you can instead apply multiple presets to your subscriptions. +If you prefer a different episode organization method, you can set the following override variables. -You will need a base of one of the below: +.. code-block:: yaml -* ``kodi_tv_show_collection`` -* ``jellyfin_tv_show_collection`` -* ``plex_tv_show_collection`` + __preset__: + overrides: + tv_show_directory: "/tv_shows" + tv_show_collection_episode_ordering: "release-year-month-day" -And then add one of these: +Or for a specific preset -* ``season_by_collection__episode_by_year_month_day`` -* ``season_by_collection__episode_by_year_month_day_reversed`` -* ``season_by_collection__episode_by_playlist_index`` - - * Only use playlist_index episode formatting for playlists that will be fully downloaded once and never again. Otherwise, indices can change. -* ``season_by_collection__episode_by_playlist_index_reversed`` +.. code-block:: yaml + + "~Beyond the Guitar": + tv_show_collection_episode_ordering: "release-year-month-day" + s01_name: "Videos" + s01_url: "https://www.youtube.com/c/BeyondTheGuitar" + s02_name: "Covers" + s02_url: "https://www.youtube.com/playlist?list=PLE62gWlWZk5NWVAVuf0Lm9jdv_-_KXs0W" + + +The following are supported. + + +Episode Ordering +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``tv_show_collection_episode_ordering`` supports one of the following: + +* ``upload-year-month-day`` (default) +* ``upload-year-month-day-reversed`` +* ``release-year-month-day`` +* ``release-year-month-day-reversed`` +* ``playlist-index`` + + * Only use ``playlist-index`` episode formatting for playlists that will be fully downloaded once and never again. Otherwise, indices can change. +* ``playlist-index-reversed`` + +TV Show Collection presets use upload-year-month-day as the default. diff --git a/src/ytdl_sub/downloaders/url/downloader.py b/src/ytdl_sub/downloaders/url/downloader.py index 2db75fb1..1f5eb56d 100644 --- a/src/ytdl_sub/downloaders/url/downloader.py +++ b/src/ytdl_sub/downloaders/url/downloader.py @@ -531,8 +531,8 @@ class MultiUrlDownloader(SourcePlugin[MultiUrlValidator]): download_logger.info("Entry rejected by download match-filter, skipping ..") return None - upload_date_idx = self._enhanced_download_archive.mapping.get_num_entries_with_upload_date( - upload_date_standardized=entry.get(v.upload_date_standardized, str) + upload_date_idx = self._enhanced_download_archive.mapping.get_num_entries_with_date( + standardized_date=entry.get(v.ytdl_sub_keep_files_date_eval, str) ) download_idx = self._enhanced_download_archive.num_entries diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py b/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py index b2e0df4f..841e1713 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py +++ b/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py @@ -12,28 +12,6 @@ class TvShowByDatePresets(PrebuiltPresets): } -class TvShowByDateOldPresets(PrebuiltPresets): - """ - TV Show by Date presets create a TV show from a single URL using upload dates as season/episode - numbers. - """ - - preset_names = { - "kodi_tv_show_by_date", - "jellyfin_tv_show_by_date", - "plex_tv_show_by_date", - } - - -class TvShowByDateEpisodeFormattingPresets(PrebuiltPresets): - preset_names = { - "season_by_year__episode_by_month_day", - "season_by_year__episode_by_month_day_reversed", - "season_by_year_month__episode_by_day", - "season_by_year__episode_by_download_index", - } - - class TvShowCollectionPresets(PrebuiltPresets): preset_names = { "Kodi TV Show Collection", @@ -48,24 +26,3 @@ class TvShowCollectionOldPresets(PrebuiltPresets): "jellyfin_tv_show_collection", "plex_tv_show_collection", } - - -class TvShowCollectionEpisodeFormattingPresets(PrebuiltPresets): - preset_names = { - "season_by_collection__episode_by_year_month_day", - "season_by_collection__episode_by_year_month_day_reversed", - "season_by_collection__episode_by_playlist_index", - "season_by_collection__episode_by_playlist_index_reversed", - } - - -class TvShowCollectionSeasonPresets(PrebuiltPresets): - """Now Deprecated""" - - preset_names = { - "collection_season_1", - "collection_season_2", - "collection_season_3", - "collection_season_4", - "collection_season_5", - } diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml index b6bacd27..4e9ccc7d 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml @@ -9,6 +9,7 @@ presets: thumbnail_name: "{thumbnail_file_name}" info_json_name: "{episode_file_path}.{info_json_ext}" maintain_download_archive: True + keep_files_date_eval: "{episode_date_standardized}" ytdl_options: break_on_existing: True @@ -36,14 +37,11 @@ presets: tv_show_genre: "{subscription_indent_1}" tv_show_content_rating: "{subscription_indent_2}" season_directory_name: "Season {season_number_padded}" - episode_title: "{upload_date_standardized} - {title}" + episode_title: "{episode_date_standardized} - {title}" episode_plot: "{webpage_url}\n\n{description}" - episode_year: "{upload_year}" episode_content_rating: "{tv_show_content_rating}" episode_date_standardized: "{upload_date_standardized}" episode_file_name: "s{season_number_padded}.e{episode_number_padded} - {file_title}" episode_file_path: "{season_directory_name_sanitized}/{episode_file_name_sanitized}" thumbnail_file_name: "{episode_file_path}-thumb.jpg" - - - + episode_year: "{%slice(episode_date_standardized, 0, 4)}" diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml index bca76405..db12b9d0 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml @@ -56,19 +56,104 @@ presets: "Provided `s01_url` or `s01_name` variable to TV Show by Date preset when it expects `url`. Perhaps you meant to use the `TV Show Collection` preset?" ) } - #################################################################################################### + _tv_show_by_date_season_episode_ordering: + overrides: + tv_show_by_date_season_ordering: >- + { %throw("Must specify tv_show_by_date_season_ordering") } + + "%season_ordering_": >- + { %eq( %lower(tv_show_by_date_season_ordering), $0 ) } + + season_number: >- + { + %elif( + %season_ordering_( "upload-year" ), upload_year, + %season_ordering_( "upload-year-month" ), %concat(upload_year, upload_month_padded), + %season_ordering_( "release-year" ), release_year, + %season_ordering_( "release-year-month" ), %concat(release_year, release_month_padded), + %throw( + 'tv_show_by_date_season_ordering must be one of the following: "upload-year", "upload-year-month", "release-year", "release-year-month"' + ) + ) + } + + # both year and year-month are fixed width, until the year 10000 :) + season_number_padded: "{season_number}" + + ##################################### episode overrides + + tv_show_by_date_episode_ordering: >- + { %throw("Must specify tv_show_by_date_episode_ordering") } + + "%episode_ordering_": >- + { %eq( %lower(tv_show_by_date_episode_ordering), $0 ) } + + episode_number_and_padded_: >- + { + %elif( + %episode_ordering_( "upload-day" ), [ %concat(upload_day, upload_date_index_padded), 4 ], + %episode_ordering_( "upload-month-day" ), [ %concat(upload_month, upload_day_padded, upload_date_index_padded), 6], + %episode_ordering_( "upload-month-day-reversed" ), [ %concat(upload_day_of_year_reversed, upload_date_index_reversed_padded), 5], + %episode_ordering_( "release-day" ), [ %concat(release_day, upload_date_index_padded), 4 ], + %episode_ordering_( "release-month-day" ), [ %concat(release_month, release_day_padded, upload_date_index_padded), 6], + %episode_ordering_( "release-month-day-reversed" ), [ %concat(release_day_of_year_reversed, upload_date_index_reversed_padded), 5], + %episode_ordering_( "download-index" ), [ download_index, 6 ], + %throw( + 'tv_show_by_date_episode_ordering must be one of the following: "upload-day", "upload-month-day", "upload-month-day-reversed", "release-day", "release-month-day", "release-month-day-reversed", "download-index"' + ) + ) + } + + episode_number: "{ %array_at(episode_number_and_padded_, 0) }" + episode_number_padded: "{ %pad_zero( %int(episode_number), %int(%array_at(episode_number_and_padded_, 1))) }" + episode_date_standardized: >- + { + %if( + %contains(tv_show_by_date_season_ordering, "release"), + release_date_standardized, + upload_date_standardized + ) + } + + ##################################### season/episode pairing validation + + "%ordering_pair_eq": >- + { + %eq([tv_show_by_date_season_ordering, tv_show_by_date_episode_ordering], [$0, $1]) + } + tv_show_by_date_ordering_pair_validation_: >- + { + %assert_then( + %or( + %ordering_pair_eq("upload-year", "upload-month-day"), + %ordering_pair_eq("upload-year", "upload-month-day-reversed"), + %ordering_pair_eq("upload-year", "download-index"), + %ordering_pair_eq("upload-year-month", "upload-day"), + %ordering_pair_eq("release-year", "release-month-day"), + %ordering_pair_eq("release-year", "release-month-day-reversed"), + %ordering_pair_eq("release-year", "download-index"), + %ordering_pair_eq("release-year-month", "release-day") + ), + episode_number_and_padded_, + "Detected incompatibility between tv_show_by_date_season_ordering and tv_show_by_date_episode_ordering. Ensure you are not using both upload and release date, and that the year/month/day are included in the combined season and episode." + ) + } + + +#################################################################################################### +# LEGACY PRESETS _season_by_year: + preset: "_tv_show_by_date_season_episode_ordering" overrides: - season_number: "{upload_year}" - season_number_padded: "{season_number}" + tv_show_by_date_season_ordering: "upload-year" _season_by_year_month: + preset: "_tv_show_by_date_season_episode_ordering" overrides: - season_number: "{upload_year}{upload_month_padded}" - season_number_padded: "{season_number}" + tv_show_by_date_season_ordering: "upload-year-month" #################################################################################################### @@ -76,26 +161,22 @@ presets: preset: - "_season_by_year_month" overrides: - episode_number: "{upload_day}{upload_date_index_padded}" - episode_number_padded: "{upload_day_padded}{upload_date_index_padded}" + tv_show_by_date_episode_ordering: "upload-day" season_by_year__episode_by_month_day: preset: - "_season_by_year" overrides: - episode_number: "{upload_month}{upload_day_padded}{upload_date_index_padded}" - episode_number_padded: "{upload_month_padded}{upload_day_padded}{upload_date_index_padded}" + tv_show_by_date_episode_ordering: "upload-month-day" season_by_year__episode_by_month_day_reversed: preset: - "_season_by_year" overrides: - episode_number: "{upload_day_of_year_reversed}{upload_date_index_reversed_padded}" - episode_number_padded: "{upload_day_of_year_reversed_padded}{upload_date_index_reversed_padded}" + tv_show_by_date_episode_ordering: "upload-month-day-reversed" season_by_year__episode_by_download_index: preset: - "_season_by_year" overrides: - episode_number: "{download_index}" - episode_number_padded: "{download_index_padded6}" \ No newline at end of file + tv_show_by_date_episode_ordering: "download-index" 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 accdd395..71a81dc6 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 @@ -37,25 +37,61 @@ presets: ############################### - season_by_collection__episode_by_year_month_day: + _tv_show_collection_episode_ordering: overrides: - episode_number: "{upload_year_truncated}{upload_month_padded}{upload_day_padded}{upload_date_index_padded}" - episode_number_padded: "{episode_number}" + tv_show_collection_episode_ordering: >- + { %throw("Must specify tv_show_collection_episode_ordering") } + + "%episode_ordering_": >- + { %eq( %lower(tv_show_collection_episode_ordering), $0 ) } + + episode_number_and_padded_: >- + { + %elif( + %episode_ordering_( "upload-year-month-day" ), [ %concat(upload_year_truncated, upload_month_padded, upload_day_padded, upload_date_index_padded), 8 ], + %episode_ordering_( "upload-year-month-day-reversed" ), [ %concat(upload_year_truncated_reversed, upload_month_reversed_padded, upload_day_reversed_padded, upload_date_index_reversed_padded), 8], + %episode_ordering_( "release-year-month-day" ), [ %concat(release_year_truncated, release_month_padded, release_day_padded, upload_date_index_padded), 8 ], + %episode_ordering_( "release-year-month-day-reversed" ), [ %concat(release_year_truncated_reversed, release_month_reversed_padded, release_day_reversed_padded, upload_date_index_reversed_padded), 8], + %episode_ordering_( "playlist-index" ), [ %concat(playlist_index), 6], + %episode_ordering_( "playlist-index-reversed" ), [ %concat(playlist_index_reversed), 6], + %throw( + 'tv_show_collection_episode_ordering must be one of the following: "upload-year-month-day", "upload-year-month-day-reversed", "release-year-month-day", "release-year-month-day-reversed", "playlist-index", "playlist-index-reversed"' + ) + ) + } + + episode_number: "{ %array_at(episode_number_and_padded_, 0) }" + episode_number_padded: "{ %pad_zero( %int(episode_number), %int(%array_at(episode_number_and_padded_, 1))) }" + episode_date_standardized: >- + { + %if( + %contains(tv_show_collection_episode_ordering, "release"), + release_date_standardized, + upload_date_standardized + ) + } + + ### LEGACY PRESETS + + season_by_collection__episode_by_year_month_day: + preset: "_tv_show_collection_episode_ordering" + overrides: + tv_show_collection_episode_ordering: "upload-year-month-day" season_by_collection__episode_by_year_month_day_reversed: + preset: "_tv_show_collection_episode_ordering" overrides: - episode_number: "{upload_year_truncated_reversed}{upload_month_reversed_padded}{upload_day_reversed_padded}{upload_date_index_reversed_padded}" - episode_number_padded: "{episode_number}" + tv_show_collection_episode_ordering: "upload-year-month-day-reversed" season_by_collection__episode_by_playlist_index: + preset: "_tv_show_collection_episode_ordering" overrides: - episode_number: "{playlist_index}" - episode_number_padded: "{playlist_index_padded6}" + tv_show_collection_episode_ordering: "playlist-index" season_by_collection__episode_by_playlist_index_reversed: + preset: "_tv_show_collection_episode_ordering" overrides: - episode_number: "{playlist_index_reversed}" - episode_number_padded: "{playlist_index_reversed_padded6}" + tv_show_collection_episode_ordering: "playlist-index-reversed" ############## diff --git a/src/ytdl_sub/script/functions/string_functions.py b/src/ytdl_sub/script/functions/string_functions.py index 43ff87a5..a1f4567e 100644 --- a/src/ytdl_sub/script/functions/string_functions.py +++ b/src/ytdl_sub/script/functions/string_functions.py @@ -127,12 +127,12 @@ class StringFunctions: return Array([String(split_val) for split_val in string.value.split(sep=sep.value)]) @staticmethod - def concat(*values: String) -> String: + def concat(*values: AnyArgument) -> String: """ :description: Concatenate multiple Strings into a single String. """ - return String("".join(val.value for val in values)) + return String("".join(str(val.value) for val in values)) @staticmethod def pad(string: String, length: Integer, char: String) -> String: diff --git a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py index 2c633a74..7a565412 100644 --- a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +++ b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py @@ -248,20 +248,18 @@ class DownloadMappings: del self._entry_mappings[entry_id] return self - def get_num_entries_with_upload_date(self, upload_date_standardized: str) -> int: + def get_num_entries_with_date(self, standardized_date: str) -> int: """ Parameters ---------- - upload_date_standardized + standardized_date A standardized upload date Returns ------- Number of entries in the mapping with this upload date """ - return len( - [_ for _ in self._entry_mappings.values() if _.upload_date == upload_date_standardized] - ) + return len([_ for _ in self._entry_mappings.values() if _.upload_date == standardized_date]) def get_num_entries(self) -> int: """ diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index c50773ff..621ad68f 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -5,6 +5,7 @@ from pathlib import Path from typing import Callable from typing import Dict from typing import List +from typing import Optional from unittest.mock import patch import pytest @@ -53,6 +54,7 @@ def mock_entry_dict_factory(mock_downloaded_file_path) -> Callable: is_youtube_channel: bool = False, mock_download_to_working_dir: bool = True, is_extracted_audio: bool = False, + release_date: Optional[str] = None, ) -> Dict: entry_dict = { v.uid.metadata_key: uid, @@ -71,6 +73,10 @@ def mock_entry_dict_factory(mock_downloaded_file_path) -> Callable: v.description.metadata_key: "The Description", } + # TODO: Make this required eventually + if release_date is not None: + entry_dict[v.release_date.metadata_key] = release_date + if is_youtube_channel: entry_dict[v.playlist_metadata.metadata_key]["thumbnails"] = [ { @@ -153,6 +159,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="21-1", upload_date="20210808", + release_date="20010808", playlist_title="Download First", playlist_index=1, playlist_count=4, @@ -163,6 +170,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-1", upload_date="20200808", + release_date="20000808", playlist_title="Download First", playlist_index=2, playlist_count=4, @@ -173,6 +181,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-2", upload_date="20200808", + release_date="20000808", playlist_title="Download First", playlist_index=3, playlist_count=4, @@ -183,6 +192,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-3", upload_date="20200807", + release_date="20000807", playlist_title="Download First", playlist_index=4, playlist_count=4, @@ -196,6 +206,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-3", upload_date="20200807", + release_date="20000807", playlist_title="Download Second", playlist_index=1, playlist_count=5, @@ -206,6 +217,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-4", upload_date="20200806", + release_date="20000806", playlist_title="Download Second", playlist_index=2, playlist_count=5, @@ -216,6 +228,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-5", upload_date="20200706", + release_date="20000706", playlist_title="Download Second", playlist_index=3, playlist_count=5, @@ -226,6 +239,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-6", upload_date="20200706", + release_date="20000706", playlist_title="Download Second", playlist_index=4, playlist_count=5, @@ -236,6 +250,7 @@ def mock_download_collection_entries( mock_entry_dict_factory( uid="20-7", upload_date="20200606", + release_date="20000606", playlist_title="Download Second", playlist_index=5, playlist_count=5, diff --git a/tests/integration/prebuilt_presets/test_tv_show_by_date.py b/tests/integration/prebuilt_presets/test_tv_show_by_date.py index 904642d7..e886e228 100644 --- a/tests/integration/prebuilt_presets/test_tv_show_by_date.py +++ b/tests/integration/prebuilt_presets/test_tv_show_by_date.py @@ -1,19 +1,30 @@ +import re +from typing import Set + import pytest from expected_download import assert_expected_downloads from expected_transaction_log import assert_transaction_log_matches from ytdl_sub.config.config_file import ConfigFile -from ytdl_sub.prebuilt_presets.tv_show import TvShowByDateEpisodeFormattingPresets from ytdl_sub.prebuilt_presets.tv_show import TvShowByDatePresets +from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError from ytdl_sub.subscriptions.subscription import Subscription -DEPRECATED_TV_SHOW_PRESET_EQUIVALENTS = { - "Kodi TV Show by Date": "kodi_tv_show_by_date", - "Jellyfin TV Show by Date": "jellyfin_tv_show_by_date", - "Plex TV Show by Date": "plex_tv_show_by_date", -} +DEFAULT_SEASON_ORDERING = "upload-year" +DEFAULT_EPISODE_ORDERING = "upload-month-day" -DEFAULT_EPISODE_ORDERING_PRESET = "season_by_year__episode_by_month_day" +VALID_ORDERING_COMBOS = [ + # upload + ("upload-year", "upload-month-day"), + ("upload-year", "upload-month-day-reversed"), + ("upload-year", "download-index"), + ("upload-year-month", "upload-day"), + # release + ("release-year", "release-month-day"), + ("release-year", "release-month-day-reversed"), + ("release-year", "download-index"), + ("release-year-month", "release-day"), +] class TestPrebuiltTVShowPresets: @@ -24,24 +35,28 @@ class TestPrebuiltTVShowPresets: subscription_name: str, output_directory: str, tv_show_preset: str, - episode_ordering_preset: str, + season_ordering: str, + episode_ordering: str, is_youtube_channel: bool = True, is_many_urls: bool = False, ): - expected_summary_name = "unit/{}/{}/is_yt_{}{}".format( - DEPRECATED_TV_SHOW_PRESET_EQUIVALENTS[tv_show_preset], - episode_ordering_preset, + expected_summary_name = "integration/by-date/{}/{}/{}/is_yt_{}{}".format( + tv_show_preset.split(" ")[0], + season_ordering, + episode_ordering, int(is_youtube_channel), "_many_urls" if is_many_urls else "", ) preset_dict = { - "preset": [tv_show_preset, episode_ordering_preset], + "preset": tv_show_preset, "overrides": { "url": "https://your.name.here", "tv_show_name": "Best Prebuilt TV Show by Date", "tv_show_directory": output_directory, + "tv_show_by_date_season_ordering": season_ordering, + "tv_show_by_date_episode_ordering": episode_ordering, }, } if is_many_urls: @@ -67,16 +82,19 @@ class TestPrebuiltTVShowPresets: ) ###################################### Perform reformat - reformatted_tv_show_structure_preset = "season_by_year__episode_by_download_index" - reformatted_expected_summary_name = "unit/{}/{}/is_yt_{}{}".format( - DEPRECATED_TV_SHOW_PRESET_EQUIVALENTS[tv_show_preset], - reformatted_tv_show_structure_preset, + reformatted_season_ordering = "upload-year" + reformatted_episode_ordering = "download-index" + + reformatted_expected_summary_name = "integration/by-date/{}/{}/{}/is_yt_{}{}".format( + tv_show_preset.split(" ")[0], + reformatted_season_ordering, + reformatted_episode_ordering, int(is_youtube_channel), "_many_urls" if is_many_urls else "", ) reformatted_preset_dict = { - "preset": [tv_show_preset, reformatted_tv_show_structure_preset], + "preset": tv_show_preset, "output_options": { "migrated_download_archive_name": ".ytdl-sub-{tv_show_name_sanitized}-download-archive.json" }, @@ -84,6 +102,8 @@ class TestPrebuiltTVShowPresets: "url": "https://your.name.here", "tv_show_name": "Best Prebuilt TV Show by Date", "tv_show_directory": output_directory, + "tv_show_by_date_season_ordering": reformatted_season_ordering, + "tv_show_by_date_episode_ordering": reformatted_episode_ordering, }, } if is_many_urls: @@ -98,7 +118,7 @@ class TestPrebuiltTVShowPresets: output_directory=output_directory, transaction_log=reformatted_transaction_log, transaction_log_summary_file_name=( - f"{expected_summary_name}_reformatted_to_{reformatted_tv_show_structure_preset}.txt" + f"{expected_summary_name}_reformatted_to_{reformatted_season_ordering}.txt" ), ) assert_expected_downloads( @@ -123,11 +143,13 @@ class TestPrebuiltTVShowPresets: subscription_name=subscription_name, output_directory=output_directory, tv_show_preset=tv_show_preset, - episode_ordering_preset=DEFAULT_EPISODE_ORDERING_PRESET, + season_ordering=DEFAULT_SEASON_ORDERING, + episode_ordering=DEFAULT_EPISODE_ORDERING, ) @pytest.mark.parametrize( - "episode_ordering_preset", TvShowByDateEpisodeFormattingPresets.preset_names + "season_ordering, episode_ordering", + VALID_ORDERING_COMBOS, ) def test_episode_ordering_presets( self, @@ -135,7 +157,8 @@ class TestPrebuiltTVShowPresets: subscription_name, output_directory, mock_download_collection_entries, - episode_ordering_preset: str, + season_ordering: str, + episode_ordering: str, ): with mock_download_collection_entries( @@ -146,5 +169,91 @@ class TestPrebuiltTVShowPresets: subscription_name=subscription_name, output_directory=output_directory, tv_show_preset="Kodi TV Show by Date", - episode_ordering_preset=episode_ordering_preset, + season_ordering=season_ordering, + episode_ordering=episode_ordering, ) + + def test_invalid_season_ordering( + self, config, subscription_name, output_directory, mock_download_collection_entries + ): + expected_message = ( + "tv_show_by_date_season_ordering must be one of the following: " + '"upload-year", ' + '"upload-year-month", ' + '"release-year", ' + '"release-year-month"' + ) + + with ( + mock_download_collection_entries(is_youtube_channel=True, num_urls=1), + pytest.raises(UserThrownRuntimeError, match=re.escape(expected_message)), + ): + self.run( + config=config, + subscription_name=subscription_name, + output_directory=output_directory, + tv_show_preset="Kodi TV Show by Date", + season_ordering="nope", + episode_ordering=DEFAULT_EPISODE_ORDERING, + ) + + def test_invalid_episode_ordering( + self, config, subscription_name, output_directory, mock_download_collection_entries + ): + expected_message = ( + "tv_show_by_date_episode_ordering must be one of the following: " + '"upload-day", ' + '"upload-month-day", ' + '"upload-month-day-reversed", ' + '"release-day", ' + '"release-month-day", ' + '"release-month-day-reversed", ' + '"download-index"' + ) + + with ( + mock_download_collection_entries(is_youtube_channel=True, num_urls=1), + pytest.raises(UserThrownRuntimeError, match=re.escape(expected_message)), + ): + self.run( + config=config, + subscription_name=subscription_name, + output_directory=output_directory, + tv_show_preset="Kodi TV Show by Date", + season_ordering=DEFAULT_SEASON_ORDERING, + episode_ordering="not-a-valid", + ) + + def test_invalid_season_episode_ordering_combo( + self, config, subscription_name, output_directory, mock_download_collection_entries + ): + expected_message = ( + "Detected incompatibility between tv_show_by_date_season_ordering " + "and tv_show_by_date_episode_ordering. Ensure you are not using both " + "upload and release date, and that the year/month/day are included in " + "the combined season and episode." + ) + + possible_seasons: Set[str] = set() + possible_episodes: Set[str] = set() + for season_ordering, episode_ordering in VALID_ORDERING_COMBOS: + possible_seasons.add(season_ordering) + possible_episodes.add(episode_ordering) + + for season_ordering in possible_seasons: + for episode_ordering in possible_episodes: + if (season_ordering, episode_ordering) in VALID_ORDERING_COMBOS: + continue + + with ( + mock_download_collection_entries(is_youtube_channel=True, num_urls=1), + pytest.raises(UserThrownRuntimeError, match=re.escape(expected_message)), + ): + self.run( + config=config, + subscription_name=subscription_name, + output_directory=output_directory, + tv_show_preset="Kodi TV Show by Date", + season_ordering=season_ordering, + episode_ordering=episode_ordering, + ) diff --git a/tests/integration/prebuilt_presets/test_tv_show_collection.py b/tests/integration/prebuilt_presets/test_tv_show_collection.py index b4954e6e..2061efd1 100644 --- a/tests/integration/prebuilt_presets/test_tv_show_collection.py +++ b/tests/integration/prebuilt_presets/test_tv_show_collection.py @@ -1,3 +1,4 @@ +import re from typing import Dict from typing import List @@ -6,17 +7,11 @@ from expected_download import assert_expected_downloads from expected_transaction_log import assert_transaction_log_matches from ytdl_sub.config.config_file import ConfigFile -from ytdl_sub.prebuilt_presets.tv_show import TvShowCollectionEpisodeFormattingPresets from ytdl_sub.prebuilt_presets.tv_show import TvShowCollectionPresets +from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError from ytdl_sub.subscriptions.subscription import Subscription -DEPRECATED_TV_SHOW_PRESET_EQUIVALENTS = { - "Kodi TV Show Collection": "kodi_tv_show_collection", - "Jellyfin TV Show Collection": "jellyfin_tv_show_collection", - "Plex TV Show Collection": "plex_tv_show_collection", -} - -DEFAULT_EPISODE_ORDERING_PRESET = "season_by_collection__episode_by_year_month_day" +DEFAULT_EPISODE_ORDERING = "upload-year-month-day" class TestPrebuiltTvShowCollectionPresets: @@ -27,22 +22,19 @@ class TestPrebuiltTvShowCollectionPresets: subscription_name: str, output_directory: str, media_player_preset: str, - tv_show_structure_preset: str, + episode_ordering: str, season_indices: List[int], is_youtube_channel: bool = True, ): - expected_summary_name = "unit/{}/{}/s_{}/is_yt_{}".format( - DEPRECATED_TV_SHOW_PRESET_EQUIVALENTS[media_player_preset], - tv_show_structure_preset, + expected_summary_name = "integration/collection/{}/{}/s_{}/is_yt_{}".format( + media_player_preset.split(" ")[0], + episode_ordering, len(season_indices), int(is_youtube_channel), ) - parent_presets: List[str] = [media_player_preset, tv_show_structure_preset] overrides: Dict[str, str] = {} for season_index in season_indices: - parent_presets.append(f"collection_season_{season_index}") - overrides = dict( overrides, **{ @@ -55,12 +47,13 @@ class TestPrebuiltTvShowCollectionPresets: config=config, preset_name=subscription_name, preset_dict={ - "preset": parent_presets, + "preset": media_player_preset, "overrides": dict( overrides, **{ "tv_show_name": "Best Prebuilt TV Show Collection", "tv_show_directory": output_directory, + "tv_show_collection_episode_ordering": episode_ordering, }, ), }, @@ -79,12 +72,10 @@ class TestPrebuiltTvShowCollectionPresets: ) ###################################### Perform reformat - reformatted_tv_show_structure_preset = ( - "season_by_collection__episode_by_playlist_index_reversed" - ) - reformatted_expected_summary_name = "unit/{}/{}/s_{}/is_yt_{}".format( - DEPRECATED_TV_SHOW_PRESET_EQUIVALENTS[media_player_preset], - reformatted_tv_show_structure_preset, + reformatted_tv_show_collection_episode_ordering = "playlist-index-reversed" + reformatted_expected_summary_name = "integration/collection/{}/{}/s_{}/is_yt_{}".format( + media_player_preset.split(" ")[0], + reformatted_tv_show_collection_episode_ordering, len(season_indices), int(is_youtube_channel), ) @@ -93,7 +84,7 @@ class TestPrebuiltTvShowCollectionPresets: config=config, preset_name=subscription_name, preset_dict={ - "preset": parent_presets + [reformatted_tv_show_structure_preset], + "preset": media_player_preset, "output_options": { "migrated_download_archive_name": ".ytdl-sub-{tv_show_name_sanitized}-download-archive.json" }, @@ -102,6 +93,7 @@ class TestPrebuiltTvShowCollectionPresets: **{ "tv_show_name": "Best Prebuilt TV Show Collection", "tv_show_directory": output_directory, + "tv_show_collection_episode_ordering": reformatted_tv_show_collection_episode_ordering, }, ), }, @@ -112,7 +104,7 @@ class TestPrebuiltTvShowCollectionPresets: output_directory=output_directory, transaction_log=reformatted_transaction_log, transaction_log_summary_file_name=( - f"{expected_summary_name}_reformatted_to_{reformatted_tv_show_structure_preset}.txt" + f"{expected_summary_name}_reformatted_to_{reformatted_tv_show_collection_episode_ordering}.txt" ), ) assert_expected_downloads( @@ -141,12 +133,20 @@ class TestPrebuiltTvShowCollectionPresets: subscription_name=subscription_name, output_directory=output_directory, media_player_preset=media_player_preset, - tv_show_structure_preset=DEFAULT_EPISODE_ORDERING_PRESET, + episode_ordering=DEFAULT_EPISODE_ORDERING, season_indices=season_indices, ) @pytest.mark.parametrize( - "episode_ordering_preset", TvShowCollectionEpisodeFormattingPresets.preset_names + "episode_ordering", + [ + "upload-year-month-day", + "upload-year-month-day-reversed", + "release-year-month-day", + "release-year-month-day-reversed", + "playlist-index", + "playlist-index-reversed", + ], ) @pytest.mark.parametrize("season_indices", [[1], [1, 2]]) def test_episode_ordering_presets( @@ -155,7 +155,7 @@ class TestPrebuiltTvShowCollectionPresets: subscription_name, output_directory, mock_download_collection_entries, - episode_ordering_preset: str, + episode_ordering: str, season_indices: List[int], ): @@ -167,6 +167,32 @@ class TestPrebuiltTvShowCollectionPresets: subscription_name=subscription_name, output_directory=output_directory, media_player_preset="Kodi TV Show Collection", - tv_show_structure_preset=episode_ordering_preset, + episode_ordering=episode_ordering, season_indices=season_indices, ) + + def test_invalid_episode_ordering( + self, config, subscription_name, output_directory, mock_download_collection_entries + ): + expected_message = ( + "tv_show_collection_episode_ordering must be one of the following: " + '"upload-year-month-day", ' + '"upload-year-month-day-reversed", ' + '"release-year-month-day", ' + '"release-year-month-day-reversed", ' + '"playlist-index", ' + '"playlist-index-reversed"' + ) + + with ( + mock_download_collection_entries(is_youtube_channel=True, num_urls=1), + pytest.raises(UserThrownRuntimeError, match=re.escape(expected_message)), + ): + self.run( + config=config, + subscription_name=subscription_name, + output_directory=output_directory, + media_player_preset="Kodi TV Show Collection", + episode_ordering="does-not-exist", + season_indices=[1], + ) diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/download-index/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/download-index/is_yt_1_migrated.json new file mode 100644 index 00000000..c8541f52 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/download-index/is_yt_1_migrated.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1.json new file mode 100644 index 00000000..33848fb2 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "e30d83126c2c6981c936ed894a6f159b", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "c712d7fd5dfdb9bb6c2be99f7c796c6f", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "7ec7ac1923053c4b5653bbfb8924fdc6", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "414c243016f406451c790757949173aa", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "e2f858efd08ac82749fd01db65d8341e", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.json new file mode 100644 index 00000000..0ead8778 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "95d3790190cece6e49d2f4d5f68868b1", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0701 - Mock Entry 20-3.mp4": "6dd6860e8075e5e99c85e14729c41bdb", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0701 - Mock Entry 20-3.nfo": "92d978e6f64d97e7e71e7045c9d2fb1f", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0801 - Mock Entry 20-2.mp4": "6b3537db708f88a877d3c5273df02eb0", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0801 - Mock Entry 20-2.nfo": "b1a3768f43d0f7f4dde1207a8670f9b1", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0802 - Mock Entry 20-1.mp4": "7e40cf2da8eedd93b3df9a017c78cd2e", + "Best Prebuilt TV Show by Date/Season 200008/s200008.e0802 - Mock Entry 20-1.nfo": "ea37e0d89713f971a87ddf67f8933be1", + "Best Prebuilt TV Show by Date/Season 200108/s200108.e0801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 200108/s200108.e0801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 200108/s200108.e0801 - Mock Entry 21-1.mp4": "c14c0b1901c456e87e1070539d32917e", + "Best Prebuilt TV Show by Date/Season 200108/s200108.e0801 - Mock Entry 21-1.nfo": "4e18e9e0454bc948cf8daa0151a0b137", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.json new file mode 100644 index 00000000..8c885adb --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "d2888d629be62badedce415f8296a995", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000001 - Mock Entry 20-3.mp4": "f94c693da1964bd8e916459253ede6d4", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000001 - Mock Entry 20-3.nfo": "57b7ef31d0b9948bd67ba6a7c83dd22b", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000002 - Mock Entry 20-2.mp4": "68a76930c4456ab58f30ad1a3eb109aa", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000002 - Mock Entry 20-2.nfo": "1cc84f0bbe25315268dc453db8941c7f", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000003 - Mock Entry 20-1.mp4": "b24b301ec95f359ba28ca503e678522f", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e000003 - Mock Entry 20-1.nfo": "e77cc16953d13241f83fbd01792c15ba", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e000004 - Mock Entry 21-1.mp4": "cf36da70822036f06e5c834dac291dd3", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e000004 - Mock Entry 21-1.nfo": "cbd1abadd656f6d047775969604e9af4", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.json new file mode 100644 index 00000000..7bc26567 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "1e8b4072d6d6aace4cac0c94ac0e711e", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14698 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14698 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14698 - Mock Entry 20-1.mp4": "f4846a3b9ee6a16df3348916077d6476", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14698 - Mock Entry 20-1.nfo": "ad715f955b255f356b6263f06941bf05", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14699 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14699 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14699 - Mock Entry 20-2.mp4": "82a1f043b879412d6219e16993b8b188", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14699 - Mock Entry 20-2.nfo": "2fa884c057a44122a245efe3c33921cd", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14799 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14799 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14799 - Mock Entry 20-3.mp4": "6626433c9c3399c6403ba5753e3b31c2", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e14799 - Mock Entry 20-3.nfo": "63f4405964a11f99ff1595cc18266489", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e14699 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e14699 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e14699 - Mock Entry 21-1.mp4": "bac622134b8f65eaeccce6f3b822be64", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e14699 - Mock Entry 21-1.nfo": "6b9659879d7a1b9f5e2dccee70d7fe66", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.json new file mode 100644 index 00000000..290d9fa6 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "f13a43a83e725981df8417ab1d36705a", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080701 - Mock Entry 20-3.mp4": "219480c0ee2075ed86ccba740cca3d70", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080701 - Mock Entry 20-3.nfo": "6085b15cd1a32e8b45b97cee69ca4741", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080801 - Mock Entry 20-2.mp4": "7ed6abcf342149769ea2de23a0fee0a1", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080801 - Mock Entry 20-2.nfo": "599b687960602264db2f7f44dbd2f849", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080802 - Mock Entry 20-1.mp4": "1431320eb3acc337b1c70a895362397a", + "Best Prebuilt TV Show by Date/Season 2000/s2000.e080802 - Mock Entry 20-1.nfo": "6da492b1897671a3309df38e6fa33279", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e080801 - Mock Entry 21-1.mp4": "5c7f600b9a40039ea77729deda8d103f", + "Best Prebuilt TV Show by Date/Season 2001/s2001.e080801 - Mock Entry 21-1.nfo": "294fb0959c2cf640312f112c0a7aae27", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1.json new file mode 100644 index 00000000..05570b53 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "5269b5e9e4fad7b63b6fdb3fef477b1e", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.mp4": "b095358d6b335a25f3be3ae44a6d10ac", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0701 - Mock Entry 20-3.nfo": "4ba0e01c1e7295952c3f5e6b9b251d7d", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.mp4": "43f73b6f99439e4873bf8d4ba1802452", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0801 - Mock Entry 20-2.nfo": "db9196b729c7b2cd26e3f0fc649b39f0", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.mp4": "632af351287dde4d1a096460f6bd93b1", + "Best Prebuilt TV Show by Date/Season 202008/s202008.e0802 - Mock Entry 20-1.nfo": "ba4a387d9462f416ba176c31c1c55316", + "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.mp4": "bf0104b783e168b150ea165faa898915", + "Best Prebuilt TV Show by Date/Season 202108/s202108.e0801 - Mock Entry 21-1.nfo": "93dd5c4c493422f9a60e61a6b965b39a", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1.json new file mode 100644 index 00000000..1795a9ee --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1_migrated.json new file mode 100644 index 00000000..c8541f52 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1_migrated.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1.json new file mode 100644 index 00000000..bbd955da --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "05539b932348da7e949a63eb71f77efc", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.mp4": "c27d1898d39763a265e4fe4451777688", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14698 - Mock Entry 20-1.nfo": "88fee5353ad7eecd96865b34654bbde6", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.mp4": "80c087803d5ac9c0efe02361fdaaa5bd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14699 - Mock Entry 20-2.nfo": "d781b80ef24916acbf3bf181ab32ddea", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.mp4": "1b5084c06b33f7e0d6daf7cff03adc73", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e14799 - Mock Entry 20-3.nfo": "252b3639b4d1686f8c79476943f89439", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.mp4": "a83870aaca55947b7a91ac90109163af", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e14699 - Mock Entry 21-1.nfo": "e7374b766d9ec0599ecf209a0f78c0ba", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1.json new file mode 100644 index 00000000..33848fb2 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "e30d83126c2c6981c936ed894a6f159b", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "c712d7fd5dfdb9bb6c2be99f7c796c6f", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "7ec7ac1923053c4b5653bbfb8924fdc6", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "414c243016f406451c790757949173aa", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "e2f858efd08ac82749fd01db65d8341e", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/download-index/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/download-index/is_yt_1_migrated.json new file mode 100644 index 00000000..57c4e26f --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/download-index/is_yt_1_migrated.json @@ -0,0 +1,17 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "0011c85c3339ac1301d80be2f3330e67", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1.json new file mode 100644 index 00000000..33cbc2b5 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1.json @@ -0,0 +1,17 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "6cd67e6b935bc5b2521f6ed0fa2ea2ed", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "c712d7fd5dfdb9bb6c2be99f7c796c6f", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "7ec7ac1923053c4b5653bbfb8924fdc6", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "414c243016f406451c790757949173aa", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "e2f858efd08ac82749fd01db65d8341e", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_1/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_1/is_yt_1_migrated.json new file mode 100644 index 00000000..622ac651 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_1/is_yt_1_migrated.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "809885e6c29bba06215b840516628090", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_2/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_2/is_yt_1_migrated.json new file mode 100644 index 00000000..ef34edca --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/playlist-index-reversed/s_2/is_yt_1_migrated.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1.json new file mode 100644 index 00000000..c67cdbac --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "ede1deeba072bae50f7f7039deca0543", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.nfo": "043c6de15ab09f32e64414d1f4a8a89c", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.nfo": "4fb018858502fe2c7a0d3dcb89145a8d", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.nfo": "6ac2ee3bd87b453d56bd90b42bbf52a0", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.nfo": "d54ba1888f0083f8de6f401e399ad379", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1.json new file mode 100644 index 00000000..9754c9cb --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "9b9e26ff3d036f450501bf5adb979aeb", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "fab0f2d0a74558a86b3935c6b962ebe3", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.nfo": "9ceac835c0166bf4f7354106379e6d17", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "9c2569c62ff81f067fe3d91324942c11", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.nfo": "35f15e5437cae813095fe2ca3bd2ca18", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "921e686edbf2a2e11f8d3eba9ef32592", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.nfo": "9aa69e4c86bb282ac57b2024ec2fbd34", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "a9fae3eca046637910a6e79aae4a8354", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.nfo": "709533b6b8f501196db0d98dfe2b2b16", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.nfo": "05f34cd0e6be4b09ea96134faec892f6", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.nfo": "54b4f84daf25626703f7b3a36b0dea49", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.nfo": "3d2644161e57b94cfac5e95732864cc3", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.nfo": "fd91adb2089d0fcdbb2e568a10ac880e", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1.json new file mode 100644 index 00000000..edf55e33 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "809885e6c29bba06215b840516628090", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1_migrated.json new file mode 100644 index 00000000..622ac651 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1_migrated.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "809885e6c29bba06215b840516628090", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1.json new file mode 100644 index 00000000..56508d3c --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1_migrated.json new file mode 100644 index 00000000..ef34edca --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1_migrated.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1.json new file mode 100644 index 00000000..901a9588 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "4e5ef7394c029e7fe230f82dfe134e4c", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.mp4": "79cac07b1964b53ff128ef041e3ed10b", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 21-1.nfo": "2a3d9b51221a541fefc29eebffe47cd4", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.mp4": "ebd20e58d50951bfcd2316bcf660ba11", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-1.nfo": "ec57b2c78058e18cdc015813e8a14b9d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.mp4": "331068e0bf01c2baaa131c7760a46c02", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-2.nfo": "cd919caf88b0eed99fd2a595c1afa6b1", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.mp4": "c646ebe3838f553abb5e9cb1dd96b85f", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-3.nfo": "7c4b28456fe5d398b7dad966eb194421", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1.json new file mode 100644 index 00000000..85551fe8 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "c7c2427315924db344d4659a60c59bc9", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.mp4": "a37dba001208063f0c04b2a681973c1c", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-4.nfo": "7d8f03bdcd8ee66fd1578a86f20365cc", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.mp4": "0bee8e6eb39dbfa8aab81fb78c74ffa0", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-6.nfo": "39996f43e9761247dce614247f99c808", + "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.mp4": "db88af54bfd315035ce187c2da47f95a", + "Best Prebuilt TV Show Collection/Season 01/s01.e000005 - Mock Entry 20-7.nfo": "cae377877c966dad492eaa3f224b86ba", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.mp4": "79cac07b1964b53ff128ef041e3ed10b", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 21-1.nfo": "974bb83bd43b9579ab1716f66589ccc1", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.mp4": "ebd20e58d50951bfcd2316bcf660ba11", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-1.nfo": "b12dcb09ffad7f23f21d350e1f60f128", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.mp4": "331068e0bf01c2baaa131c7760a46c02", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-2.nfo": "e6fd0fc3e95b77c595d1a77c2060fd98", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.mp4": "c646ebe3838f553abb5e9cb1dd96b85f", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 20-3.nfo": "23386ea27c1e64afcecdb235acb81b79", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.json new file mode 100644 index 00000000..e9a36254 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "df87dea55d4f4076ab4c075a3bceaa3d", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052498 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052498 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052498 - Mock Entry 20-1.mp4": "170f6eaaa831b92e80ba798b5ae50b60", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052498 - Mock Entry 20-1.nfo": "93e75d3231077883d37c5baac435e182", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052499 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052499 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052499 - Mock Entry 20-2.mp4": "0e1805471b84d94f605f645d9ea94c9e", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052499 - Mock Entry 20-2.nfo": "6d022da37f3545d9ab8608f11b8059cd", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052599 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052599 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052599 - Mock Entry 20-3.mp4": "2b59eab2673eb7f2a0ec91033737634a", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052599 - Mock Entry 20-3.nfo": "f47403746915586d1bd87436210311c5", + "Best Prebuilt TV Show Collection/Season 01/s01.e99052499 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e99052499 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e99052499 - Mock Entry 21-1.mp4": "450737dd9b8307f498eddb2ac7f4e567", + "Best Prebuilt TV Show Collection/Season 01/s01.e99052499 - Mock Entry 21-1.nfo": "5c095683a8c1ae4ff950d4302dc5f06e", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.json new file mode 100644 index 00000000..3a8abfa0 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "e89ac9f59f9f9ef22e01c9055708b81c", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052699 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052699 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052699 - Mock Entry 20-4.mp4": "1ea0b0274a45288449dddcb1c91a0ac7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100052699 - Mock Entry 20-4.nfo": "f670533b516a47b833cd0ae04bec5877", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062698 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062698 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062698 - Mock Entry 20-5.mp4": "9b03d1c2e2be9cd75920821accae7774", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062698 - Mock Entry 20-5.nfo": "a223cdfe24fb5d285704351f38db7b46", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062699 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062699 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062699 - Mock Entry 20-6.mp4": "2240a972bc91ef589b3b0a25f1e41725", + "Best Prebuilt TV Show Collection/Season 01/s01.e100062699 - Mock Entry 20-6.nfo": "bb1cc5d794aa28d43e405179622f2095", + "Best Prebuilt TV Show Collection/Season 01/s01.e100072599 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e100072599 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e100072599 - Mock Entry 20-7.mp4": "5944f9af51010e2783576fdbd2ad5436", + "Best Prebuilt TV Show Collection/Season 01/s01.e100072599 - Mock Entry 20-7.nfo": "dbd5b09d734a10795a11344a5b536b8f", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052498 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052498 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052498 - Mock Entry 20-1.mp4": "170f6eaaa831b92e80ba798b5ae50b60", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052498 - Mock Entry 20-1.nfo": "bb5c4debab0a9f5bbd0a4e303c9bed2d", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052499 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052499 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052499 - Mock Entry 20-2.mp4": "0e1805471b84d94f605f645d9ea94c9e", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052499 - Mock Entry 20-2.nfo": "de6eab4d23acac23213ee25adb8095ac", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052599 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052599 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052599 - Mock Entry 20-3.mp4": "2b59eab2673eb7f2a0ec91033737634a", + "Best Prebuilt TV Show Collection/Season 02/s02.e100052599 - Mock Entry 20-3.nfo": "23e88cb7a059946b12c0702a1f987bc7", + "Best Prebuilt TV Show Collection/Season 02/s02.e99052499 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e99052499 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e99052499 - Mock Entry 21-1.mp4": "450737dd9b8307f498eddb2ac7f4e567", + "Best Prebuilt TV Show Collection/Season 02/s02.e99052499 - Mock Entry 21-1.nfo": "ee3a0c5681e7bf7923f72c323e7a9795", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.json new file mode 100644 index 00000000..8eb2de94 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "8f0390db6223f1c48072c28aabdc4162", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080701 - Mock Entry 20-3.mp4": "680b08a1e5032d89188def2784e62146", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080701 - Mock Entry 20-3.nfo": "2ecfb16f4216df21e9485b90b14e355f", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080801 - Mock Entry 20-2.mp4": "3c0dcdd38605f032c98aac9068732329", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080801 - Mock Entry 20-2.nfo": "090cfb9795b2ddd210afb93873cb60ce", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080802 - Mock Entry 20-1.mp4": "29d7648807690a4af93541ae340dd7bc", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080802 - Mock Entry 20-1.nfo": "e4aa8129a961c47e3151062b95f39b73", + "Best Prebuilt TV Show Collection/Season 01/s01.e01080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e01080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e01080801 - Mock Entry 21-1.mp4": "9abd6ecaf194553e9486e1bf02f552cf", + "Best Prebuilt TV Show Collection/Season 01/s01.e01080801 - Mock Entry 21-1.nfo": "34704ea06cbdfaa1c9939e061fd1633a", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.json new file mode 100644 index 00000000..1edba6fc --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "b6ee943d41ca8b0f9b54bb9cb04da7de", + "Best Prebuilt TV Show Collection/Season 01/s01.e00060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e00060601 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e00060601 - Mock Entry 20-7.mp4": "a75f9d2b28d82b78ae30da3962f57f61", + "Best Prebuilt TV Show Collection/Season 01/s01.e00060601 - Mock Entry 20-7.nfo": "29b6f491d1d7cb5e62f6a3dd290ba74a", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070601 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070601 - Mock Entry 20-6.mp4": "18226f783f8c3fac3089d61307bee3ba", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070601 - Mock Entry 20-6.nfo": "8ce2b32b9371cc45908acb73a5c5d5e6", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070602 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070602 - Mock Entry 20-5.mp4": "180e86031e6af3ea1a54714460a6bf1f", + "Best Prebuilt TV Show Collection/Season 01/s01.e00070602 - Mock Entry 20-5.nfo": "4567dfd30fc7287eea63f28e465d9c54", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080601 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080601 - Mock Entry 20-4.mp4": "09fba17ad8bf9deb8157ff83880185c3", + "Best Prebuilt TV Show Collection/Season 01/s01.e00080601 - Mock Entry 20-4.nfo": "0fc29c2520ae80c4390a5b68d02e6794", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080701 - Mock Entry 20-3.mp4": "680b08a1e5032d89188def2784e62146", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080701 - Mock Entry 20-3.nfo": "7276a8c14720f76cf4e5e624eb1dea2d", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080801 - Mock Entry 20-2.mp4": "3c0dcdd38605f032c98aac9068732329", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080801 - Mock Entry 20-2.nfo": "028a4161b6bccda2cf8d2a0a3ff13f4f", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080802 - Mock Entry 20-1.mp4": "29d7648807690a4af93541ae340dd7bc", + "Best Prebuilt TV Show Collection/Season 02/s02.e00080802 - Mock Entry 20-1.nfo": "7303574842c9409a6521486ddeb7cde9", + "Best Prebuilt TV Show Collection/Season 02/s02.e01080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e01080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e01080801 - Mock Entry 21-1.mp4": "9abd6ecaf194553e9486e1bf02f552cf", + "Best Prebuilt TV Show Collection/Season 02/s02.e01080801 - Mock Entry 21-1.nfo": "5b9d248c2fd2460030aa590d8660d957", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1.json new file mode 100644 index 00000000..077b159a --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "e26598ffd47b150e6bf09e5490546e94", + "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1.mp4": "cda96931a134eeb6e05e0b5aec03ddfe", + "Best Prebuilt TV Show Collection/Season 01/s01.e79052499 - Mock Entry 21-1.nfo": "a7e21040a3fcb264f287e4eba1853f94", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1.mp4": "a7f2ca37b817da0512af297b5652e5e8", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052498 - Mock Entry 20-1.nfo": "78c08ad76d004a74cdba012f0b746c22", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2.mp4": "35ebd30923d8f321e023281ec6ef4e6f", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052499 - Mock Entry 20-2.nfo": "d9031d8608d12742c40a3279138c8371", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3.mp4": "204ce9c28ab7b69c659f0f76b6c75bfa", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052599 - Mock Entry 20-3.nfo": "74bd8dc59c5b76ae112d90638977c464", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1.json new file mode 100644 index 00000000..ba4303f1 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "2990d95213df5a6c87825a28daa970f4", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4.mp4": "611d34cf77a2123181a7c4096623f6b9", + "Best Prebuilt TV Show Collection/Season 01/s01.e80052699 - Mock Entry 20-4.nfo": "0242d92e5e0d26745948b42c25eecfba", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5.mp4": "f09ce6574a040cea52b7177f74b9ccea", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062698 - Mock Entry 20-5.nfo": "52b17bcad30adb6eaef4c3b21c1af76b", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6.mp4": "435692c75994d929807b5f09726728ad", + "Best Prebuilt TV Show Collection/Season 01/s01.e80062699 - Mock Entry 20-6.nfo": "31fb72d089fd680fea1340f3d3c41d64", + "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7.mp4": "613c386e00bf1c87e4f1d1acbbd98281", + "Best Prebuilt TV Show Collection/Season 01/s01.e80072599 - Mock Entry 20-7.nfo": "df65227ee260219883ff618c9fbdf1d4", + "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1.mp4": "cda96931a134eeb6e05e0b5aec03ddfe", + "Best Prebuilt TV Show Collection/Season 02/s02.e79052499 - Mock Entry 21-1.nfo": "0e4ea058d6a1e8760c80d3a02d25aafc", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1.mp4": "a7f2ca37b817da0512af297b5652e5e8", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052498 - Mock Entry 20-1.nfo": "1095322364e512dff963a44b2beffe30", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2.mp4": "35ebd30923d8f321e023281ec6ef4e6f", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052499 - Mock Entry 20-2.nfo": "5130c71d99f1c0726fee8cb8c9d82ba7", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3.mp4": "204ce9c28ab7b69c659f0f76b6c75bfa", + "Best Prebuilt TV Show Collection/Season 02/s02.e80052599 - Mock Entry 20-3.nfo": "bde2a5401c49b58de0eacea4145d91ae", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1.json new file mode 100644 index 00000000..c67cdbac --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1.json @@ -0,0 +1,23 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "ede1deeba072bae50f7f7039deca0543", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.nfo": "043c6de15ab09f32e64414d1f4a8a89c", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.nfo": "4fb018858502fe2c7a0d3dcb89145a8d", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.nfo": "6ac2ee3bd87b453d56bd90b42bbf52a0", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.nfo": "d54ba1888f0083f8de6f401e399ad379", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1.json new file mode 100644 index 00000000..9754c9cb --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1.json @@ -0,0 +1,40 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "9b9e26ff3d036f450501bf5adb979aeb", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "fab0f2d0a74558a86b3935c6b962ebe3", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.nfo": "9ceac835c0166bf4f7354106379e6d17", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "9c2569c62ff81f067fe3d91324942c11", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.nfo": "35f15e5437cae813095fe2ca3bd2ca18", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "921e686edbf2a2e11f8d3eba9ef32592", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.nfo": "9aa69e4c86bb282ac57b2024ec2fbd34", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "a9fae3eca046637910a6e79aae4a8354", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.nfo": "709533b6b8f501196db0d98dfe2b2b16", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.nfo": "05f34cd0e6be4b09ea96134faec892f6", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.nfo": "54b4f84daf25626703f7b3a36b0dea49", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.nfo": "3d2644161e57b94cfac5e95732864cc3", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.nfo": "fd91adb2089d0fcdbb2e568a10ac880e", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_1/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_1/is_yt_1_migrated.json new file mode 100644 index 00000000..bae82de6 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_1/is_yt_1_migrated.json @@ -0,0 +1,18 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "ba324b2c6532fe9d8fbe03e0dd6d0410", + "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_2/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_2/is_yt_1_migrated.json new file mode 100644 index 00000000..eb4cb28e --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Plex/playlist-index-reversed/s_2/is_yt_1_migrated.json @@ -0,0 +1,31 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "6ec6913047c175cedcbd41cb3ef402fc", + "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", + "Best Prebuilt TV Show Collection/Season 02/Season02.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1.json new file mode 100644 index 00000000..3ebd92c2 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1.json @@ -0,0 +1,18 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "87f96a1e055447383bfea0a12680438d", + "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1.json new file mode 100644 index 00000000..47a0f4ac --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1.json @@ -0,0 +1,31 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "04d06f293fcb5164266bedf66b4d4264", + "Best Prebuilt TV Show Collection/Season 01/Season01.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "fab0f2d0a74558a86b3935c6b962ebe3", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "9c2569c62ff81f067fe3d91324942c11", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "921e686edbf2a2e11f8d3eba9ef32592", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "a9fae3eca046637910a6e79aae4a8354", + "Best Prebuilt TV Show Collection/Season 02/Season02.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a" +} \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt b/tests/resources/transaction_log_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Jellyfin/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.txt new file mode 100644 index 00000000..2515d402 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1.txt @@ -0,0 +1,130 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + title: Best Prebuilt TV Show by Date +{output_directory}/Season 200008 + s200008.e0701 - Mock Entry 20-3-thumb.jpg + s200008.e0701 - Mock Entry 20-3.info.json + s200008.e0701 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 701 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s200008.e0701 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 701 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 200008 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s200008.e0801 - Mock Entry 20-2-thumb.jpg + s200008.e0801 - Mock Entry 20-2.info.json + s200008.e0801 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 801 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s200008.e0801 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 200008 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s200008.e0802 - Mock Entry 20-1-thumb.jpg + s200008.e0802 - Mock Entry 20-1.info.json + s200008.e0802 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 802 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s200008.e0802 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 802 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 200008 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 +{output_directory}/Season 200108 + s200108.e0801 - Mock Entry 21-1-thumb.jpg + s200108.e0801 - Mock Entry 21-1.info.json + s200108.e0801 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 801 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s200108.e0801 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 200108 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1_reformatted_to_upload-year.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1_reformatted_to_upload-year.txt new file mode 100644 index 00000000..b4622a19 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year-month/release-day/is_yt_1_reformatted_to_upload-year.txt @@ -0,0 +1,145 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json +{output_directory}/Season 2020 + s2020.e000001 - Mock Entry 20-3-thumb.jpg + s2020.e000001 - Mock Entry 20-3.info.json + s2020.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2020 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000002 - Mock Entry 20-2-thumb.jpg + s2020.e000002 - Mock Entry 20-2.info.json + s2020.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000003 - Mock Entry 20-1-thumb.jpg + s2020.e000003 - Mock Entry 20-1.info.json + s2020.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s2020.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 +{output_directory}/Season 2021 + s2021.e000004 - Mock Entry 21-1-thumb.jpg + s2021.e000004 - Mock Entry 21-1.info.json + s2021.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s2021.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2021 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 200008 + s200008.e0701 - Mock Entry 20-3-thumb.jpg + s200008.e0701 - Mock Entry 20-3.info.json + s200008.e0701 - Mock Entry 20-3.mp4 + s200008.e0701 - Mock Entry 20-3.nfo + s200008.e0801 - Mock Entry 20-2-thumb.jpg + s200008.e0801 - Mock Entry 20-2.info.json + s200008.e0801 - Mock Entry 20-2.mp4 + s200008.e0801 - Mock Entry 20-2.nfo + s200008.e0802 - Mock Entry 20-1-thumb.jpg + s200008.e0802 - Mock Entry 20-1.info.json + s200008.e0802 - Mock Entry 20-1.mp4 + s200008.e0802 - Mock Entry 20-1.nfo +{output_directory}/Season 200108 + s200108.e0801 - Mock Entry 21-1-thumb.jpg + s200108.e0801 - Mock Entry 21-1.info.json + s200108.e0801 - Mock Entry 21-1.mp4 + s200108.e0801 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.txt new file mode 100644 index 00000000..b3777c57 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1.txt @@ -0,0 +1,130 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + title: Best Prebuilt TV Show by Date +{output_directory}/Season 2000 + s2000.e000001 - Mock Entry 20-3-thumb.jpg + s2000.e000001 - Mock Entry 20-3.info.json + s2000.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s2000.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2000 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s2000.e000002 - Mock Entry 20-2-thumb.jpg + s2000.e000002 - Mock Entry 20-2.info.json + s2000.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s2000.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2000 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s2000.e000003 - Mock Entry 20-1-thumb.jpg + s2000.e000003 - Mock Entry 20-1.info.json + s2000.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s2000.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2000 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 +{output_directory}/Season 2001 + s2001.e000004 - Mock Entry 21-1-thumb.jpg + s2001.e000004 - Mock Entry 21-1.info.json + s2001.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s2001.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2001 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1_reformatted_to_upload-year.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1_reformatted_to_upload-year.txt new file mode 100644 index 00000000..1a539b9a --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/download-index/is_yt_1_reformatted_to_upload-year.txt @@ -0,0 +1,145 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json +{output_directory}/Season 2020 + s2020.e000001 - Mock Entry 20-3-thumb.jpg + s2020.e000001 - Mock Entry 20-3.info.json + s2020.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2020 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000002 - Mock Entry 20-2-thumb.jpg + s2020.e000002 - Mock Entry 20-2.info.json + s2020.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000003 - Mock Entry 20-1-thumb.jpg + s2020.e000003 - Mock Entry 20-1.info.json + s2020.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s2020.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 +{output_directory}/Season 2021 + s2021.e000004 - Mock Entry 21-1-thumb.jpg + s2021.e000004 - Mock Entry 21-1.info.json + s2021.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s2021.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2021 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 2000 + s2000.e000001 - Mock Entry 20-3-thumb.jpg + s2000.e000001 - Mock Entry 20-3.info.json + s2000.e000001 - Mock Entry 20-3.mp4 + s2000.e000001 - Mock Entry 20-3.nfo + s2000.e000002 - Mock Entry 20-2-thumb.jpg + s2000.e000002 - Mock Entry 20-2.info.json + s2000.e000002 - Mock Entry 20-2.mp4 + s2000.e000002 - Mock Entry 20-2.nfo + s2000.e000003 - Mock Entry 20-1-thumb.jpg + s2000.e000003 - Mock Entry 20-1.info.json + s2000.e000003 - Mock Entry 20-1.mp4 + s2000.e000003 - Mock Entry 20-1.nfo +{output_directory}/Season 2001 + s2001.e000004 - Mock Entry 21-1-thumb.jpg + s2001.e000004 - Mock Entry 21-1.info.json + s2001.e000004 - Mock Entry 21-1.mp4 + s2001.e000004 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.txt new file mode 100644 index 00000000..d8106b98 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1.txt @@ -0,0 +1,130 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + title: Best Prebuilt TV Show by Date +{output_directory}/Season 2000 + s2000.e14698 - Mock Entry 20-1-thumb.jpg + s2000.e14698 - Mock Entry 20-1.info.json + s2000.e14698 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 14698 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s2000.e14698 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 14698 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2000 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s2000.e14699 - Mock Entry 20-2-thumb.jpg + s2000.e14699 - Mock Entry 20-2.info.json + s2000.e14699 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 14699 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s2000.e14699 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 14699 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2000 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s2000.e14799 - Mock Entry 20-3-thumb.jpg + s2000.e14799 - Mock Entry 20-3.info.json + s2000.e14799 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 14799 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s2000.e14799 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 14799 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2000 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 +{output_directory}/Season 2001 + s2001.e14699 - Mock Entry 21-1-thumb.jpg + s2001.e14699 - Mock Entry 21-1.info.json + s2001.e14699 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 14699 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s2001.e14699 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 14699 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2001 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1_reformatted_to_upload-year.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1_reformatted_to_upload-year.txt new file mode 100644 index 00000000..64e36c64 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day-reversed/is_yt_1_reformatted_to_upload-year.txt @@ -0,0 +1,145 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json +{output_directory}/Season 2020 + s2020.e000001 - Mock Entry 20-3-thumb.jpg + s2020.e000001 - Mock Entry 20-3.info.json + s2020.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2020 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000002 - Mock Entry 20-2-thumb.jpg + s2020.e000002 - Mock Entry 20-2.info.json + s2020.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000003 - Mock Entry 20-1-thumb.jpg + s2020.e000003 - Mock Entry 20-1.info.json + s2020.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s2020.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 +{output_directory}/Season 2021 + s2021.e000004 - Mock Entry 21-1-thumb.jpg + s2021.e000004 - Mock Entry 21-1.info.json + s2021.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s2021.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2021 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 2000 + s2000.e14698 - Mock Entry 20-1-thumb.jpg + s2000.e14698 - Mock Entry 20-1.info.json + s2000.e14698 - Mock Entry 20-1.mp4 + s2000.e14698 - Mock Entry 20-1.nfo + s2000.e14699 - Mock Entry 20-2-thumb.jpg + s2000.e14699 - Mock Entry 20-2.info.json + s2000.e14699 - Mock Entry 20-2.mp4 + s2000.e14699 - Mock Entry 20-2.nfo + s2000.e14799 - Mock Entry 20-3-thumb.jpg + s2000.e14799 - Mock Entry 20-3.info.json + s2000.e14799 - Mock Entry 20-3.mp4 + s2000.e14799 - Mock Entry 20-3.nfo +{output_directory}/Season 2001 + s2001.e14699 - Mock Entry 21-1-thumb.jpg + s2001.e14699 - Mock Entry 21-1.info.json + s2001.e14699 - Mock Entry 21-1.mp4 + s2001.e14699 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.txt new file mode 100644 index 00000000..364055d5 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1.txt @@ -0,0 +1,130 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + title: Best Prebuilt TV Show by Date +{output_directory}/Season 2000 + s2000.e080701 - Mock Entry 20-3-thumb.jpg + s2000.e080701 - Mock Entry 20-3.info.json + s2000.e080701 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 80701 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s2000.e080701 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 80701 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2000 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s2000.e080801 - Mock Entry 20-2-thumb.jpg + s2000.e080801 - Mock Entry 20-2.info.json + s2000.e080801 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 80801 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s2000.e080801 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 80801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2000 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s2000.e080802 - Mock Entry 20-1-thumb.jpg + s2000.e080802 - Mock Entry 20-1.info.json + s2000.e080802 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 80802 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s2000.e080802 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 80802 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2000 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 +{output_directory}/Season 2001 + s2001.e080801 - Mock Entry 21-1-thumb.jpg + s2001.e080801 - Mock Entry 21-1.info.json + s2001.e080801 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 80801 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s2001.e080801 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 80801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2001 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1_reformatted_to_upload-year.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1_reformatted_to_upload-year.txt new file mode 100644 index 00000000..ef01d6ff --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/release-year/release-month-day/is_yt_1_reformatted_to_upload-year.txt @@ -0,0 +1,145 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json +{output_directory}/Season 2020 + s2020.e000001 - Mock Entry 20-3-thumb.jpg + s2020.e000001 - Mock Entry 20-3.info.json + s2020.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2020 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000002 - Mock Entry 20-2-thumb.jpg + s2020.e000002 - Mock Entry 20-2.info.json + s2020.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000003 - Mock Entry 20-1-thumb.jpg + s2020.e000003 - Mock Entry 20-1.info.json + s2020.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s2020.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 +{output_directory}/Season 2021 + s2021.e000004 - Mock Entry 21-1-thumb.jpg + s2021.e000004 - Mock Entry 21-1.info.json + s2021.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s2021.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2021 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 2000 + s2000.e080701 - Mock Entry 20-3-thumb.jpg + s2000.e080701 - Mock Entry 20-3.info.json + s2000.e080701 - Mock Entry 20-3.mp4 + s2000.e080701 - Mock Entry 20-3.nfo + s2000.e080801 - Mock Entry 20-2-thumb.jpg + s2000.e080801 - Mock Entry 20-2.info.json + s2000.e080801 - Mock Entry 20-2.mp4 + s2000.e080801 - Mock Entry 20-2.nfo + s2000.e080802 - Mock Entry 20-1-thumb.jpg + s2000.e080802 - Mock Entry 20-1.info.json + s2000.e080802 - Mock Entry 20-1.mp4 + s2000.e080802 - Mock Entry 20-1.nfo +{output_directory}/Season 2001 + s2001.e080801 - Mock Entry 21-1-thumb.jpg + s2001.e080801 - Mock Entry 21-1.info.json + s2001.e080801 - Mock Entry 21-1.mp4 + s2001.e080801 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1_reformatted_to_upload-year.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year_month__episode_by_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year-month/upload-day/is_yt_1_reformatted_to_upload-year.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1_reformatted_to_upload-year.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_download_index/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/download-index/is_yt_1_reformatted_to_upload-year.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1_reformatted_to_upload-year.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day_reversed/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day-reversed/is_yt_1_reformatted_to_upload-year.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt b/tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Kodi/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt diff --git a/tests/resources/transaction_log_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt b/tests/resources/transaction_log_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/plex_tv_show_by_date/season_by_year__episode_by_month_day/is_yt_1_reformatted_to_season_by_year__episode_by_download_index.txt rename to tests/resources/transaction_log_summaries/integration/by-date/Plex/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt diff --git a/tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/jellyfin_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Jellyfin/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.txt new file mode 100644 index 00000000..7192b6c7 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1.txt @@ -0,0 +1 @@ +No new, modified, or removed files in '{output_directory}' \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt new file mode 100644 index 00000000..2d20fc29 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/does-not-exist/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt @@ -0,0 +1,4 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index_reversed/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_playlist_index/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/playlist-index/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.txt new file mode 100644 index 00000000..0e0cc670 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1.txt @@ -0,0 +1,134 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + season01-poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + namedseason: + attributes: + number: 1 + tag: Named Season 1 + title: Best Prebuilt TV Show Collection +{output_directory}/Season 01 + s01.e100052498 - Mock Entry 20-1-thumb.jpg + s01.e100052498 - Mock Entry 20-1.info.json + s01.e100052498 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 100052498 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s01.e100052498 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 100052498 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 1 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s01.e100052499 - Mock Entry 20-2-thumb.jpg + s01.e100052499 - Mock Entry 20-2.info.json + s01.e100052499 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 100052499 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s01.e100052499 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 100052499 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 1 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s01.e100052599 - Mock Entry 20-3-thumb.jpg + s01.e100052599 - Mock Entry 20-3.info.json + s01.e100052599 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 100052599 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s01.e100052599 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 100052599 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 1 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s01.e99052499 - Mock Entry 21-1-thumb.jpg + s01.e99052499 - Mock Entry 21-1.info.json + s01.e99052499 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 99052499 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s01.e99052499 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 99052499 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 1 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt new file mode 100644 index 00000000..a6ff607e --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt @@ -0,0 +1,143 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json +{output_directory}/Season 01 + s01.e000001 - Mock Entry 20-3-thumb.jpg + s01.e000001 - Mock Entry 20-3.info.json + s01.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 1 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e000002 - Mock Entry 20-2-thumb.jpg + s01.e000002 - Mock Entry 20-2.info.json + s01.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e000003 - Mock Entry 20-1-thumb.jpg + s01.e000003 - Mock Entry 20-1.info.json + s01.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e000004 - Mock Entry 21-1-thumb.jpg + s01.e000004 - Mock Entry 21-1.info.json + s01.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s01.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 1 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 01 + s01.e100052498 - Mock Entry 20-1-thumb.jpg + s01.e100052498 - Mock Entry 20-1.info.json + s01.e100052498 - Mock Entry 20-1.mp4 + s01.e100052498 - Mock Entry 20-1.nfo + s01.e100052499 - Mock Entry 20-2-thumb.jpg + s01.e100052499 - Mock Entry 20-2.info.json + s01.e100052499 - Mock Entry 20-2.mp4 + s01.e100052499 - Mock Entry 20-2.nfo + s01.e100052599 - Mock Entry 20-3-thumb.jpg + s01.e100052599 - Mock Entry 20-3.info.json + s01.e100052599 - Mock Entry 20-3.mp4 + s01.e100052599 - Mock Entry 20-3.nfo + s01.e99052499 - Mock Entry 21-1-thumb.jpg + s01.e99052499 - Mock Entry 21-1.info.json + s01.e99052499 - Mock Entry 21-1.mp4 + s01.e99052499 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.txt new file mode 100644 index 00000000..135d1231 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1.txt @@ -0,0 +1,257 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + season01-poster.jpg + season02-poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + namedseason: + - + attributes: + number: 1 + tag: Named Season 1 + - + attributes: + number: 2 + tag: Named Season 2 + title: Best Prebuilt TV Show Collection +{output_directory}/Season 01 + s01.e100052699 - Mock Entry 20-4-thumb.jpg + s01.e100052699 - Mock Entry 20-4.info.json + s01.e100052699 - Mock Entry 20-4.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-06 + episode_id: 100052699 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-4.com + + The Description + title: 2000-08-06 - Mock Entry 20-4 + year: 2000 + s01.e100052699 - Mock Entry 20-4.nfo + NFO tags: + episodedetails: + aired: 2000-08-06 + episode: 100052699 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-4.com + + The Description + season: 1 + title: 2000-08-06 - Mock Entry 20-4 + year: 2000 + s01.e100062698 - Mock Entry 20-5-thumb.jpg + s01.e100062698 - Mock Entry 20-5.info.json + s01.e100062698 - Mock Entry 20-5.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-07-06 + episode_id: 100062698 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-5.com + + The Description + title: 2000-07-06 - Mock Entry 20-5 + year: 2000 + s01.e100062698 - Mock Entry 20-5.nfo + NFO tags: + episodedetails: + aired: 2000-07-06 + episode: 100062698 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-5.com + + The Description + season: 1 + title: 2000-07-06 - Mock Entry 20-5 + year: 2000 + s01.e100062699 - Mock Entry 20-6-thumb.jpg + s01.e100062699 - Mock Entry 20-6.info.json + s01.e100062699 - Mock Entry 20-6.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-07-06 + episode_id: 100062699 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-6.com + + The Description + title: 2000-07-06 - Mock Entry 20-6 + year: 2000 + s01.e100062699 - Mock Entry 20-6.nfo + NFO tags: + episodedetails: + aired: 2000-07-06 + episode: 100062699 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-6.com + + The Description + season: 1 + title: 2000-07-06 - Mock Entry 20-6 + year: 2000 + s01.e100072599 - Mock Entry 20-7-thumb.jpg + s01.e100072599 - Mock Entry 20-7.info.json + s01.e100072599 - Mock Entry 20-7.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-06-06 + episode_id: 100072599 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-7.com + + The Description + title: 2000-06-06 - Mock Entry 20-7 + year: 2000 + s01.e100072599 - Mock Entry 20-7.nfo + NFO tags: + episodedetails: + aired: 2000-06-06 + episode: 100072599 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-7.com + + The Description + season: 1 + title: 2000-06-06 - Mock Entry 20-7 + year: 2000 +{output_directory}/Season 02 + s02.e100052498 - Mock Entry 20-1-thumb.jpg + s02.e100052498 - Mock Entry 20-1.info.json + s02.e100052498 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 100052498 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s02.e100052498 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 100052498 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s02.e100052499 - Mock Entry 20-2-thumb.jpg + s02.e100052499 - Mock Entry 20-2.info.json + s02.e100052499 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 100052499 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s02.e100052499 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 100052499 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s02.e100052599 - Mock Entry 20-3-thumb.jpg + s02.e100052599 - Mock Entry 20-3.info.json + s02.e100052599 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 100052599 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s02.e100052599 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 100052599 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s02.e99052499 - Mock Entry 21-1-thumb.jpg + s02.e99052499 - Mock Entry 21-1.info.json + s02.e99052499 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 99052499 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s02.e99052499 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 99052499 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt new file mode 100644 index 00000000..2d56f95a --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt @@ -0,0 +1,277 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json +{output_directory}/Season 01 + s01.e000001 - Mock Entry 20-7-thumb.jpg + s01.e000001 - Mock Entry 20-7.info.json + s01.e000001 - Mock Entry 20-7.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-06-06 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-7.com + + The Description + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e000001 - Mock Entry 20-7.nfo + NFO tags: + episodedetails: + aired: 2020-06-06 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-7.com + + The Description + season: 1 + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e000002 - Mock Entry 20-6-thumb.jpg + s01.e000002 - Mock Entry 20-6.info.json + s01.e000002 - Mock Entry 20-6.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-6.com + + The Description + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e000002 - Mock Entry 20-6.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-6.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e000003 - Mock Entry 20-5-thumb.jpg + s01.e000003 - Mock Entry 20-5.info.json + s01.e000003 - Mock Entry 20-5.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-5.com + + The Description + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e000003 - Mock Entry 20-5.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-5.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e000004 - Mock Entry 20-4-thumb.jpg + s01.e000004 - Mock Entry 20-4.info.json + s01.e000004 - Mock Entry 20-4.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-06 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-4.com + + The Description + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 + s01.e000004 - Mock Entry 20-4.nfo + NFO tags: + episodedetails: + aired: 2020-08-06 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-4.com + + The Description + season: 1 + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 +{output_directory}/Season 02 + s02.e000001 - Mock Entry 20-3-thumb.jpg + s02.e000001 - Mock Entry 20-3.info.json + s02.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e000002 - Mock Entry 20-2-thumb.jpg + s02.e000002 - Mock Entry 20-2.info.json + s02.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e000003 - Mock Entry 20-1-thumb.jpg + s02.e000003 - Mock Entry 20-1.info.json + s02.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e000004 - Mock Entry 21-1-thumb.jpg + s02.e000004 - Mock Entry 21-1.info.json + s02.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s02.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 01 + s01.e100052699 - Mock Entry 20-4-thumb.jpg + s01.e100052699 - Mock Entry 20-4.info.json + s01.e100052699 - Mock Entry 20-4.mp4 + s01.e100052699 - Mock Entry 20-4.nfo + s01.e100062698 - Mock Entry 20-5-thumb.jpg + s01.e100062698 - Mock Entry 20-5.info.json + s01.e100062698 - Mock Entry 20-5.mp4 + s01.e100062698 - Mock Entry 20-5.nfo + s01.e100062699 - Mock Entry 20-6-thumb.jpg + s01.e100062699 - Mock Entry 20-6.info.json + s01.e100062699 - Mock Entry 20-6.mp4 + s01.e100062699 - Mock Entry 20-6.nfo + s01.e100072599 - Mock Entry 20-7-thumb.jpg + s01.e100072599 - Mock Entry 20-7.info.json + s01.e100072599 - Mock Entry 20-7.mp4 + s01.e100072599 - Mock Entry 20-7.nfo +{output_directory}/Season 02 + s02.e100052498 - Mock Entry 20-1-thumb.jpg + s02.e100052498 - Mock Entry 20-1.info.json + s02.e100052498 - Mock Entry 20-1.mp4 + s02.e100052498 - Mock Entry 20-1.nfo + s02.e100052499 - Mock Entry 20-2-thumb.jpg + s02.e100052499 - Mock Entry 20-2.info.json + s02.e100052499 - Mock Entry 20-2.mp4 + s02.e100052499 - Mock Entry 20-2.nfo + s02.e100052599 - Mock Entry 20-3-thumb.jpg + s02.e100052599 - Mock Entry 20-3.info.json + s02.e100052599 - Mock Entry 20-3.mp4 + s02.e100052599 - Mock Entry 20-3.nfo + s02.e99052499 - Mock Entry 21-1-thumb.jpg + s02.e99052499 - Mock Entry 21-1.info.json + s02.e99052499 - Mock Entry 21-1.mp4 + s02.e99052499 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.txt new file mode 100644 index 00000000..cf5a8cd3 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1.txt @@ -0,0 +1,134 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + season01-poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + namedseason: + attributes: + number: 1 + tag: Named Season 1 + title: Best Prebuilt TV Show Collection +{output_directory}/Season 01 + s01.e00080701 - Mock Entry 20-3-thumb.jpg + s01.e00080701 - Mock Entry 20-3.info.json + s01.e00080701 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 0080701 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s01.e00080701 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 0080701 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 1 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s01.e00080801 - Mock Entry 20-2-thumb.jpg + s01.e00080801 - Mock Entry 20-2.info.json + s01.e00080801 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 0080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s01.e00080801 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 0080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 1 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s01.e00080802 - Mock Entry 20-1-thumb.jpg + s01.e00080802 - Mock Entry 20-1.info.json + s01.e00080802 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 0080802 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s01.e00080802 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 0080802 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 1 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s01.e01080801 - Mock Entry 21-1-thumb.jpg + s01.e01080801 - Mock Entry 21-1.info.json + s01.e01080801 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 1080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s01.e01080801 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 1080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 1 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt new file mode 100644 index 00000000..b2832b2a --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt @@ -0,0 +1,143 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json +{output_directory}/Season 01 + s01.e000001 - Mock Entry 20-3-thumb.jpg + s01.e000001 - Mock Entry 20-3.info.json + s01.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 1 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e000002 - Mock Entry 20-2-thumb.jpg + s01.e000002 - Mock Entry 20-2.info.json + s01.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e000003 - Mock Entry 20-1-thumb.jpg + s01.e000003 - Mock Entry 20-1.info.json + s01.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e000004 - Mock Entry 21-1-thumb.jpg + s01.e000004 - Mock Entry 21-1.info.json + s01.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s01.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 1 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 01 + s01.e00080701 - Mock Entry 20-3-thumb.jpg + s01.e00080701 - Mock Entry 20-3.info.json + s01.e00080701 - Mock Entry 20-3.mp4 + s01.e00080701 - Mock Entry 20-3.nfo + s01.e00080801 - Mock Entry 20-2-thumb.jpg + s01.e00080801 - Mock Entry 20-2.info.json + s01.e00080801 - Mock Entry 20-2.mp4 + s01.e00080801 - Mock Entry 20-2.nfo + s01.e00080802 - Mock Entry 20-1-thumb.jpg + s01.e00080802 - Mock Entry 20-1.info.json + s01.e00080802 - Mock Entry 20-1.mp4 + s01.e00080802 - Mock Entry 20-1.nfo + s01.e01080801 - Mock Entry 21-1-thumb.jpg + s01.e01080801 - Mock Entry 21-1.info.json + s01.e01080801 - Mock Entry 21-1.mp4 + s01.e01080801 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.txt new file mode 100644 index 00000000..c6da76b6 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1.txt @@ -0,0 +1,257 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + season01-poster.jpg + season02-poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + namedseason: + - + attributes: + number: 1 + tag: Named Season 1 + - + attributes: + number: 2 + tag: Named Season 2 + title: Best Prebuilt TV Show Collection +{output_directory}/Season 01 + s01.e00060601 - Mock Entry 20-7-thumb.jpg + s01.e00060601 - Mock Entry 20-7.info.json + s01.e00060601 - Mock Entry 20-7.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-06-06 + episode_id: 0060601 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-7.com + + The Description + title: 2000-06-06 - Mock Entry 20-7 + year: 2000 + s01.e00060601 - Mock Entry 20-7.nfo + NFO tags: + episodedetails: + aired: 2000-06-06 + episode: 0060601 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-7.com + + The Description + season: 1 + title: 2000-06-06 - Mock Entry 20-7 + year: 2000 + s01.e00070601 - Mock Entry 20-6-thumb.jpg + s01.e00070601 - Mock Entry 20-6.info.json + s01.e00070601 - Mock Entry 20-6.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-07-06 + episode_id: 0070601 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-6.com + + The Description + title: 2000-07-06 - Mock Entry 20-6 + year: 2000 + s01.e00070601 - Mock Entry 20-6.nfo + NFO tags: + episodedetails: + aired: 2000-07-06 + episode: 0070601 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-6.com + + The Description + season: 1 + title: 2000-07-06 - Mock Entry 20-6 + year: 2000 + s01.e00070602 - Mock Entry 20-5-thumb.jpg + s01.e00070602 - Mock Entry 20-5.info.json + s01.e00070602 - Mock Entry 20-5.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-07-06 + episode_id: 0070602 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-5.com + + The Description + title: 2000-07-06 - Mock Entry 20-5 + year: 2000 + s01.e00070602 - Mock Entry 20-5.nfo + NFO tags: + episodedetails: + aired: 2000-07-06 + episode: 0070602 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-5.com + + The Description + season: 1 + title: 2000-07-06 - Mock Entry 20-5 + year: 2000 + s01.e00080601 - Mock Entry 20-4-thumb.jpg + s01.e00080601 - Mock Entry 20-4.info.json + s01.e00080601 - Mock Entry 20-4.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-06 + episode_id: 0080601 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-4.com + + The Description + title: 2000-08-06 - Mock Entry 20-4 + year: 2000 + s01.e00080601 - Mock Entry 20-4.nfo + NFO tags: + episodedetails: + aired: 2000-08-06 + episode: 0080601 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-4.com + + The Description + season: 1 + title: 2000-08-06 - Mock Entry 20-4 + year: 2000 +{output_directory}/Season 02 + s02.e00080701 - Mock Entry 20-3-thumb.jpg + s02.e00080701 - Mock Entry 20-3.info.json + s02.e00080701 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-07 + episode_id: 0080701 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s02.e00080701 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2000-08-07 + episode: 0080701 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2 + title: 2000-08-07 - Mock Entry 20-3 + year: 2000 + s02.e00080801 - Mock Entry 20-2-thumb.jpg + s02.e00080801 - Mock Entry 20-2.info.json + s02.e00080801 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 0080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s02.e00080801 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 0080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2 + title: 2000-08-08 - Mock Entry 20-2 + year: 2000 + s02.e00080802 - Mock Entry 20-1-thumb.jpg + s02.e00080802 - Mock Entry 20-1.info.json + s02.e00080802 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2000-08-08 + episode_id: 0080802 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s02.e00080802 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2000-08-08 + episode: 0080802 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2 + title: 2000-08-08 - Mock Entry 20-1 + year: 2000 + s02.e01080801 - Mock Entry 21-1-thumb.jpg + s02.e01080801 - Mock Entry 21-1.info.json + s02.e01080801 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2001-08-08 + episode_id: 1080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 + s02.e01080801 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2001-08-08 + episode: 1080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2 + title: 2001-08-08 - Mock Entry 21-1 + year: 2001 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt new file mode 100644 index 00000000..2fc7ab5e --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Kodi/release-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt @@ -0,0 +1,277 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json +{output_directory}/Season 01 + s01.e000001 - Mock Entry 20-7-thumb.jpg + s01.e000001 - Mock Entry 20-7.info.json + s01.e000001 - Mock Entry 20-7.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-06-06 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-7.com + + The Description + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e000001 - Mock Entry 20-7.nfo + NFO tags: + episodedetails: + aired: 2020-06-06 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-7.com + + The Description + season: 1 + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e000002 - Mock Entry 20-6-thumb.jpg + s01.e000002 - Mock Entry 20-6.info.json + s01.e000002 - Mock Entry 20-6.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-6.com + + The Description + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e000002 - Mock Entry 20-6.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-6.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e000003 - Mock Entry 20-5-thumb.jpg + s01.e000003 - Mock Entry 20-5.info.json + s01.e000003 - Mock Entry 20-5.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-5.com + + The Description + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e000003 - Mock Entry 20-5.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-5.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e000004 - Mock Entry 20-4-thumb.jpg + s01.e000004 - Mock Entry 20-4.info.json + s01.e000004 - Mock Entry 20-4.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-06 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-4.com + + The Description + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 + s01.e000004 - Mock Entry 20-4.nfo + NFO tags: + episodedetails: + aired: 2020-08-06 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-4.com + + The Description + season: 1 + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 +{output_directory}/Season 02 + s02.e000001 - Mock Entry 20-3-thumb.jpg + s02.e000001 - Mock Entry 20-3.info.json + s02.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e000002 - Mock Entry 20-2-thumb.jpg + s02.e000002 - Mock Entry 20-2.info.json + s02.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e000003 - Mock Entry 20-1-thumb.jpg + s02.e000003 - Mock Entry 20-1.info.json + s02.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e000004 - Mock Entry 21-1-thumb.jpg + s02.e000004 - Mock Entry 21-1.info.json + s02.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s02.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 01 + s01.e00060601 - Mock Entry 20-7-thumb.jpg + s01.e00060601 - Mock Entry 20-7.info.json + s01.e00060601 - Mock Entry 20-7.mp4 + s01.e00060601 - Mock Entry 20-7.nfo + s01.e00070601 - Mock Entry 20-6-thumb.jpg + s01.e00070601 - Mock Entry 20-6.info.json + s01.e00070601 - Mock Entry 20-6.mp4 + s01.e00070601 - Mock Entry 20-6.nfo + s01.e00070602 - Mock Entry 20-5-thumb.jpg + s01.e00070602 - Mock Entry 20-5.info.json + s01.e00070602 - Mock Entry 20-5.mp4 + s01.e00070602 - Mock Entry 20-5.nfo + s01.e00080601 - Mock Entry 20-4-thumb.jpg + s01.e00080601 - Mock Entry 20-4.info.json + s01.e00080601 - Mock Entry 20-4.mp4 + s01.e00080601 - Mock Entry 20-4.nfo +{output_directory}/Season 02 + s02.e00080701 - Mock Entry 20-3-thumb.jpg + s02.e00080701 - Mock Entry 20-3.info.json + s02.e00080701 - Mock Entry 20-3.mp4 + s02.e00080701 - Mock Entry 20-3.nfo + s02.e00080801 - Mock Entry 20-2-thumb.jpg + s02.e00080801 - Mock Entry 20-2.info.json + s02.e00080801 - Mock Entry 20-2.mp4 + s02.e00080801 - Mock Entry 20-2.nfo + s02.e00080802 - Mock Entry 20-1-thumb.jpg + s02.e00080802 - Mock Entry 20-1.info.json + s02.e00080802 - Mock Entry 20-1.mp4 + s02.e00080802 - Mock Entry 20-1.nfo + s02.e01080801 - Mock Entry 21-1-thumb.jpg + s02.e01080801 - Mock Entry 21-1.info.json + s02.e01080801 - Mock Entry 21-1.mp4 + s02.e01080801 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day_reversed/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day-reversed/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/kodi_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Kodi/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_1/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt diff --git a/tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1.txt rename to tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1.txt diff --git a/tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt similarity index 100% rename from tests/resources/transaction_log_summaries/unit/plex_tv_show_collection/season_by_collection__episode_by_year_month_day/s_2/is_yt_1_reformatted_to_season_by_collection__episode_by_playlist_index_reversed.txt rename to tests/resources/transaction_log_summaries/integration/collection/Plex/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt From 66fd7cf41ca0fb7970149ef776b8cb54d7cfa928 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sat, 31 May 2025 12:15:57 -0700 Subject: [PATCH 46/48] [FEATURE] Add scripting print functions (#1230) Add the ability to print custom messages in override scripts. Adds the functions - `print` - `print_if_true` - `print_if_false` Will be used to make under-the-hood preset things more verbose. --- .../scripting/scripting_functions.rst | 32 +++++++++ src/ytdl_sub/script/functions/__init__.py | 2 + .../script/functions/print_functions.py | 67 +++++++++++++++++++ .../script/functions/test_print_functions.py | 58 ++++++++++++++++ 4 files changed, 159 insertions(+) create mode 100644 src/ytdl_sub/script/functions/print_functions.py create mode 100644 tests/unit/script/functions/test_print_functions.py diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index e2cf4e41..b36573de 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -523,6 +523,38 @@ sub ---------------------------------------------------------------------------------------------------- +Print Functions +--------------- + +print +~~~~~ +:spec: ``print(message: AnyArgument, passthrough: ReturnableArgument, level: Optional[Integer]) -> ReturnableArgument`` + +:description: + Print the ``message`` and return ``passthrough``. + Optionally can pass level, where < 0 is debug, 0 is info, 1 is warning, > 1 is error. + Defaults to info. + +print_if_false +~~~~~~~~~~~~~~ +:spec: ``print_if_false(message: AnyArgument, passthrough: ReturnableArgument, level: Optional[Integer]) -> ReturnableArgument`` + +:description: + Print the ``message`` if ``passthrough`` evaluates to ``false``. Return ``passthrough``. + Optionally can pass level, where < 0 is debug, 0 is info, 1 is warning, > 1 is error. + Defaults to info. + +print_if_true +~~~~~~~~~~~~~ +:spec: ``print_if_true(message: AnyArgument, passthrough: ReturnableArgument, level: Optional[Integer]) -> ReturnableArgument`` + +:description: + Print the ``message`` if ``passthrough`` evaluates to ``true``. Return ``passthrough``. + Optionally can pass level, where < 0 is debug, 0 is info, 1 is warning, > 1 is error. + Defaults to info. + +---------------------------------------------------------------------------------------------------- + Regex Functions --------------- diff --git a/src/ytdl_sub/script/functions/__init__.py b/src/ytdl_sub/script/functions/__init__.py index 5b98d24b..e43f7e28 100644 --- a/src/ytdl_sub/script/functions/__init__.py +++ b/src/ytdl_sub/script/functions/__init__.py @@ -9,6 +9,7 @@ from ytdl_sub.script.functions.error_functions import ErrorFunctions from ytdl_sub.script.functions.json_functions import JsonFunctions from ytdl_sub.script.functions.map_functions import MapFunctions from ytdl_sub.script.functions.numeric_functions import NumericFunctions +from ytdl_sub.script.functions.print_functions import PrintFunctions from ytdl_sub.script.functions.regex_functions import RegexFunctions from ytdl_sub.script.functions.string_functions import StringFunctions from ytdl_sub.script.types.resolvable import Resolvable @@ -26,6 +27,7 @@ class Functions( RegexFunctions, DateFunctions, JsonFunctions, + PrintFunctions, ): _custom_functions: Dict[str, Callable[..., Resolvable]] = {} diff --git a/src/ytdl_sub/script/functions/print_functions.py b/src/ytdl_sub/script/functions/print_functions.py new file mode 100644 index 00000000..a89bcd28 --- /dev/null +++ b/src/ytdl_sub/script/functions/print_functions.py @@ -0,0 +1,67 @@ +from typing import Optional + +from ytdl_sub.script.types.resolvable import AnyArgument +from ytdl_sub.script.types.resolvable import Integer +from ytdl_sub.script.types.resolvable import ReturnableArgument +from ytdl_sub.utils.logger import Logger + +logger = Logger.get(name="preset") + + +def _log(message: AnyArgument, level: Optional[Integer]) -> None: + if level is None: + logger.info(str(message)) + return + + level_value: int = level.native + if level_value < 0: + logger.debug(str(message)) + elif level_value == 0: + logger.info(str(message)) + elif level_value == 1: + logger.warning(str(message)) + else: # > 1 + logger.error(str(message)) + + +class PrintFunctions: + @staticmethod + def print( + message: AnyArgument, passthrough: ReturnableArgument, level: Optional[Integer] = None + ) -> ReturnableArgument: + """ + :description: + Print the ``message`` and return ``passthrough``. + Optionally can pass level, where < 0 is debug, 0 is info, 1 is warning, > 1 is error. + Defaults to info. + """ + _log(message=message, level=level) + return passthrough + + @staticmethod + def print_if_true( + message: AnyArgument, passthrough: ReturnableArgument, level: Optional[Integer] = None + ) -> ReturnableArgument: + """ + :description: + Print the ``message`` if ``passthrough`` evaluates to ``true``. Return ``passthrough``. + Optionally can pass level, where < 0 is debug, 0 is info, 1 is warning, > 1 is error. + Defaults to info. + """ + if passthrough.value: + _log(message=message, level=level) + return passthrough + + @staticmethod + def print_if_false( + message: AnyArgument, passthrough: ReturnableArgument, level: Optional[Integer] = None + ) -> ReturnableArgument: + """ + :description: + Print the ``message`` if ``passthrough`` evaluates to ``false``. Return ``passthrough``. + Optionally can pass level, where < 0 is debug, 0 is info, 1 is warning, > 1 is error. + Defaults to info. + """ + if not passthrough.value: + _log(message=message, level=level) + return passthrough diff --git a/tests/unit/script/functions/test_print_functions.py b/tests/unit/script/functions/test_print_functions.py new file mode 100644 index 00000000..a23f447d --- /dev/null +++ b/tests/unit/script/functions/test_print_functions.py @@ -0,0 +1,58 @@ +import logging +from typing import Any +from typing import Optional +from unittest.mock import patch + +import pytest +from unit.script.conftest import single_variable_output + + +class TestPrintFunctions: + @pytest.mark.parametrize( + "function_str, expected_print, expected_output", + [ + # print + ("{%print('hi mom', True)}", "hi mom", True), + ("{%print('this is great', [1, 2, 3])}", "this is great", [1, 2, 3]), + ("{%print([1, 2], [3, 4])}", "[1, 2]", [3, 4]), + # print_if_true + ("{%print_if_true('hi mom', True)}", "hi mom", True), + ("{%print_if_true('hi mom', False)}", None, False), + # print_if_false + ("{%print_if_false('hi mom', True)}", None, True), + ("{%print_if_false('hi mom', False)}", "hi mom", False), + ], + ) + def test_print_functions( + self, function_str: str, expected_print: Optional[str], expected_output: Any + ): + with patch.object(logging.Logger, "info") as mock_logger: + output = single_variable_output(function_str) + assert output == expected_output + + if expected_print is not None: + assert mock_logger.call_count == 1 + assert mock_logger.call_args.args[0] == expected_print + else: + assert mock_logger.call_count == 0 + + @pytest.mark.parametrize( + "function_str, expected_print, expected_output", + [ + # print + ("{%print('hi mom', True, LEVEL)}", "hi mom", True), + # print_if_true + ("{%print_if_true('hi mom', True, LEVEL)}", "hi mom", True), + # print_if_false + ("{%print_if_false('hi mom', False, LEVEL)}", "hi mom", False), + ], + ) + @pytest.mark.parametrize("level", [-1, 0, 1, 2]) + def test_levels(self, function_str: str, expected_print: str, expected_output: str, level: int): + level_mapping = {-1: "debug", 0: "info", 1: "warning", 2: "error"} + with patch.object(logging.Logger, level_mapping[level]) as mock_logger: + output = single_variable_output(function_str.replace("LEVEL", str(level))) + assert output == expected_output + + assert mock_logger.call_count == 1 + assert mock_logger.call_args.args[0] == expected_print From 0bd97dbe96015fdd93462b45bc86d902b167084d Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 1 Jun 2025 09:28:42 -0700 Subject: [PATCH 47/48] [FEATURE] release_date support for date_range (#1231) Adds the ability to toggle whether to use `upload_date` or `release_date` in the date_range plugin, which is used to cull older videos. ``` date_range: type: "upload_date" ``` If using the Only Recent preset, it will be automatically applied based on whether your season/episode ordering uses release date or upload date. Closes https://github.com/jmbannon/ytdl-sub/issues/1182 --- docs/source/config_reference/plugins.rst | 10 ++ src/ytdl_sub/plugins/date_range.py | 26 ++++- .../prebuilt_presets/tv_show/episode.yaml | 7 ++ .../tv_show/tv_show_by_date.yaml | 9 ++ .../tv_show/tv_show_collection.yaml | 10 ++ .../subscriptions/subscription_download.py | 47 +++++--- .../validators/string_select_validator.py | 15 +++ tests/conftest.py | 25 ++++ tests/integration/conftest.py | 1 - .../integration/plugins/test_file_convert.py | 1 - tests/unit/plugins/__init__.py | 0 tests/unit/plugins/test_date_range.py | 108 ++++++++++++++++++ 12 files changed, 237 insertions(+), 22 deletions(-) create mode 100644 tests/unit/plugins/__init__.py create mode 100644 tests/unit/plugins/test_date_range.py diff --git a/docs/source/config_reference/plugins.rst b/docs/source/config_reference/plugins.rst index 4825f0f7..0eec34ea 100644 --- a/docs/source/config_reference/plugins.rst +++ b/docs/source/config_reference/plugins.rst @@ -151,6 +151,8 @@ granularity possible. date_range: before: "now" after: "today-2weeks" + breaks: True + type: "upload_date" ``after`` @@ -183,6 +185,14 @@ granularity possible. is enabled or not via Boolean. +``type`` + +:expected type: Optional[OverridesFormatter] +:description: + Which type of date to use. Must be either ``upload_date`` or ``release_date``. + Defaults to ``upload_date``. + + ---------------------------------------------------------------------------------------------------- download diff --git a/src/ytdl_sub/plugins/date_range.py b/src/ytdl_sub/plugins/date_range.py index b8b73711..34370a1a 100644 --- a/src/ytdl_sub/plugins/date_range.py +++ b/src/ytdl_sub/plugins/date_range.py @@ -1,5 +1,6 @@ from typing import List from typing import Optional +from typing import Set from typing import Tuple from ytdl_sub.config.plugin.plugin import Plugin @@ -7,6 +8,11 @@ from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.utils.datetime import to_date_str from ytdl_sub.validators.string_datetime import StringDatetimeValidator from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator +from ytdl_sub.validators.string_select_validator import OverridesStringSelectValidator + + +class DateRangeType(OverridesStringSelectValidator): + _select_values: Set[str] = {"upload_date", "release_date"} class DateRangeOptions(ToggleableOptionsDictValidator): @@ -30,9 +36,11 @@ class DateRangeOptions(ToggleableOptionsDictValidator): date_range: before: "now" after: "today-2weeks" + breaks: True + type: "upload_date" """ - _optional_keys = {"enable", "before", "after", "breaks"} + _optional_keys = {"enable", "before", "after", "breaks", "type"} def __init__(self, name, value): super().__init__(name, value) @@ -41,6 +49,7 @@ class DateRangeOptions(ToggleableOptionsDictValidator): self._breaks = self._validate_key_if_present( "breaks", OverridesBooleanFormatterValidator, default="True" ) + self._type = self._validate_key("type", DateRangeType, default="upload_date") @property def before(self) -> Optional[StringDatetimeValidator]: @@ -70,6 +79,16 @@ class DateRangeOptions(ToggleableOptionsDictValidator): """ return self._breaks + @property + def type(self) -> DateRangeType: + """ + :expected type: Optional[OverridesFormatter] + :description: + Which type of date to use. Must be either ``upload_date`` or ``release_date``. + Defaults to ``upload_date``. + """ + return self._type + class DateRangePlugin(Plugin[DateRangeOptions]): plugin_options_type = DateRangeOptions @@ -83,17 +102,18 @@ class DateRangePlugin(Plugin[DateRangeOptions]): match_filters: List[str] = [] breaking_match_filters: List[str] = [] + date_type: str = self.overrides.apply_formatter(formatter=self.plugin_options.type) if self.plugin_options.before: before_str = to_date_str( date_validator=self.plugin_options.before, overrides=self.overrides ) - match_filters.append(f"upload_date < {before_str}") + match_filters.append(f"{date_type} < {before_str}") if self.plugin_options.after: after_str = to_date_str( date_validator=self.plugin_options.after, overrides=self.overrides ) - after_filter = f"upload_date >= {after_str}" + after_filter = f"{date_type} >= {after_str}" if self.overrides.evaluate_boolean(self.plugin_options.breaks): breaking_match_filters.append(after_filter) else: diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml index 4e9ccc7d..fe39e5cf 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/episode.yaml @@ -17,6 +17,9 @@ presets: chapters: embed_chapters: True + date_range: + type: "{tv_show_date_range_type}" + overrides: # MUST DEFINE: # tv_show_directory @@ -45,3 +48,7 @@ presets: episode_file_path: "{season_directory_name_sanitized}/{episode_file_name_sanitized}" thumbnail_file_name: "{episode_file_path}-thumb.jpg" episode_year: "{%slice(episode_date_standardized, 0, 4)}" + + # Used to determine which date type to use if `Only Recent` preset + # is applied + tv_show_date_range_type: "upload_date" diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml index db12b9d0..d2056b9d 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml @@ -117,6 +117,15 @@ presets: ) } + tv_show_date_range_type: >- + { + %if( + %contains(tv_show_by_date_season_ordering, "release"), + "release_date", + "upload_date" + ) + } + ##################################### season/episode pairing validation "%ordering_pair_eq": >- 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 71a81dc6..4d77d0a4 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 @@ -71,6 +71,16 @@ presets: ) } + tv_show_date_range_type: >- + { + %if( + %contains(tv_show_collection_episode_ordering, "release"), + "release_date", + "upload_date" + ) + } + + ### LEGACY PRESETS season_by_collection__episode_by_year_month_day: diff --git a/src/ytdl_sub/subscriptions/subscription_download.py b/src/ytdl_sub/subscriptions/subscription_download.py index 9acabda4..2fd9c89e 100644 --- a/src/ytdl_sub/subscriptions/subscription_download.py +++ b/src/ytdl_sub/subscriptions/subscription_download.py @@ -349,6 +349,34 @@ class SubscriptionDownload(BaseSubscription, ABC): return self.download_archive.get_file_handler_transaction_log() + def get_ytdl_options( + self, plugins: Optional[List[Plugin]], dry_run: bool + ) -> SubscriptionYTDLOptions: + """ + Parameters + ---------- + plugins + Optional. If not provided, will reinitialize them + dry_run + Whether its dry run or not + + Returns + ------- + SubscriptionYTDLOptions + Both metadata and download ytdl-options + """ + if plugins is None: + plugins = self._initialize_plugins() + + return SubscriptionYTDLOptions( + preset=self._preset_options, + plugins=plugins, + enhanced_download_archive=self.download_archive, + overrides=self.overrides, + working_directory=self.working_directory, + dry_run=dry_run, + ) + def download(self, dry_run: bool = False) -> FileHandlerTransactionLog: """ Performs the subscription download @@ -368,14 +396,7 @@ class SubscriptionDownload(BaseSubscription, ABC): logging.info("Skipping %s", self.name) return FileHandlerTransactionLog() - subscription_ytdl_options = SubscriptionYTDLOptions( - preset=self._preset_options, - plugins=plugins, - enhanced_download_archive=self.download_archive, - overrides=self.overrides, - working_directory=self.working_directory, - dry_run=dry_run, - ) + subscription_ytdl_options = self.get_ytdl_options(plugins=plugins, dry_run=dry_run) downloader = MultiUrlDownloader( options=self.downloader_options, @@ -420,15 +441,7 @@ class SubscriptionDownload(BaseSubscription, ABC): self.download_archive.reinitialize(dry_run=dry_run) plugins = self._initialize_plugins() - - subscription_ytdl_options = SubscriptionYTDLOptions( - preset=self._preset_options, - plugins=plugins, - enhanced_download_archive=self.download_archive, - overrides=self.overrides, - working_directory=self.working_directory, - dry_run=dry_run, - ) + subscription_ytdl_options = self.get_ytdl_options(plugins=plugins, dry_run=dry_run) # Re-add the original downloader class' plugins plugins.extend( diff --git a/src/ytdl_sub/validators/string_select_validator.py b/src/ytdl_sub/validators/string_select_validator.py index 24fe767d..9f28fcd4 100644 --- a/src/ytdl_sub/validators/string_select_validator.py +++ b/src/ytdl_sub/validators/string_select_validator.py @@ -1,5 +1,6 @@ from typing import Set +from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator from ytdl_sub.validators.validators import StringValidator @@ -17,3 +18,17 @@ class StringSelectValidator(StringValidator): raise self._validation_exception( f"Must be one of the following values: {', '.join(self._select_values)}" ) + + +class OverridesStringSelectValidator(OverridesStringFormatterValidator): + _expected_value_type_name = "overrides select" + + _select_values: Set[str] = set() + + def post_process(self, resolved: str) -> str: + if resolved not in self._select_values: + raise self._validation_exception( + f"Must be one of the following values: {', '.join(sorted(self._select_values))}" + ) + + return resolved diff --git a/tests/conftest.py b/tests/conftest.py index 12ba38a9..aabbba8d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,6 +12,7 @@ from typing import Callable from typing import Dict from typing import List from typing import Optional +from typing import Tuple from unittest.mock import patch import pytest @@ -272,3 +273,27 @@ def mock_run_from_cli(args: str) -> List[Subscription]: args_list = ["ytdl-sub"] + shlex.split(args) with patch.object(sys, "argv", args_list): return main() + + +def get_match_filters( + subscription: Subscription, dry_run: bool, download_filters: bool +) -> Tuple[List[str], List[str]]: + """ + Util function to get match filters from a subscription. + + Returns + ------- + match_filters, breaking_match_filters + """ + options = subscription.get_ytdl_options(plugins=None, dry_run=dry_run) + options_dict = ( + options.download_builder().to_dict() + if download_filters + else options.metadata_builder().to_dict() + ) + if "match_filter" not in options_dict: + return [], [] + + match_filter_str = repr(options_dict["match_filter"]) + out = eval(match_filter_str.split("(", maxsplit=1)[-1].split(")")[0]) + return out diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 621ad68f..fbd26c4c 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -1,6 +1,5 @@ import contextlib import os -import shutil from pathlib import Path from typing import Callable from typing import Dict diff --git a/tests/integration/plugins/test_file_convert.py b/tests/integration/plugins/test_file_convert.py index 740cea5b..06980b22 100644 --- a/tests/integration/plugins/test_file_convert.py +++ b/tests/integration/plugins/test_file_convert.py @@ -4,7 +4,6 @@ import pytest from expected_download import assert_expected_downloads from expected_transaction_log import assert_transaction_log_matches -from ytdl_sub.entries.entry import ytdl_sub_chapters_from_comments from ytdl_sub.subscriptions.subscription import Subscription diff --git a/tests/unit/plugins/__init__.py b/tests/unit/plugins/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/plugins/test_date_range.py b/tests/unit/plugins/test_date_range.py new file mode 100644 index 00000000..a024d8e2 --- /dev/null +++ b/tests/unit/plugins/test_date_range.py @@ -0,0 +1,108 @@ +import re +from typing import Any +from typing import Dict + +import pytest +from conftest import get_match_filters + +from ytdl_sub.config.config_file import ConfigFile +from ytdl_sub.subscriptions.subscription import Subscription +from ytdl_sub.utils.exceptions import ValidationException + + +@pytest.fixture +def preset_dict(output_directory) -> Dict[str, Any]: + return { + "download": "https://your.name.here", + "output_options": {"output_directory": output_directory, "file_name": "will_error.mp4"}, + } + + +class TestDateRange: + @pytest.mark.parametrize("date_range_type", ["upload_date", "release_date"]) + def test_date_range_type( + self, + default_config: ConfigFile, + preset_dict: Dict[str, Any], + output_directory: str, + date_range_type: str, + ): + preset_dict["date_range"] = { + "before": "20250530", + "after": "20250510", + "type": date_range_type, + } + sub = Subscription.from_dict( + config=default_config, + preset_name="test_date_range", + preset_dict=preset_dict, + ) + + metadata_filter, metadata_breaking_filter = get_match_filters( + subscription=sub, dry_run=False, download_filters=False + ) + assert metadata_filter == [ + f"!is_live & !is_upcoming & !post_live & {date_range_type} < 20250530" + ] + assert metadata_breaking_filter == [f"{date_range_type} >= 20250510"] + + download_filter, download_breaking_filter = get_match_filters( + subscription=sub, dry_run=False, download_filters=True + ) + assert not download_filter + assert not download_breaking_filter + + def test_date_range_breaks_false( + self, + default_config: ConfigFile, + preset_dict: Dict[str, Any], + output_directory: str, + ): + preset_dict["date_range"] = { + "before": "20250530", + "after": "20250510", + "breaks": False, + } + sub = Subscription.from_dict( + config=default_config, + preset_name="test_date_range", + preset_dict=preset_dict, + ) + + metadata_filter, metadata_breaking_filter = get_match_filters( + subscription=sub, dry_run=False, download_filters=False + ) + assert metadata_filter == [ + f"!is_live & !is_upcoming & !post_live & upload_date < 20250530 & upload_date >= 20250510" + ] + assert not metadata_breaking_filter + + download_filter, download_breaking_filter = get_match_filters( + subscription=sub, dry_run=False, download_filters=True + ) + assert not download_filter + assert not download_breaking_filter + + def test_date_range_invalid_type( + self, + default_config: ConfigFile, + preset_dict: Dict[str, Any], + output_directory: str, + ): + preset_dict["date_range"] = { + "before": "20250530", + "after": "20250510", + "type": "no", + } + + error_msg = ( + "Validation error in test_date_range.date_range.type: " + "Must be one of the following values: release_date, upload_date" + ) + + with pytest.raises(ValidationException, match=re.escape(error_msg)): + Subscription.from_dict( + config=default_config, + preset_name="test_date_range", + preset_dict=preset_dict, + ).download(dry_run=False) From a68d5e4539ecab9e253983250843e91b99f52d10 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 1 Jun 2025 09:56:48 -0700 Subject: [PATCH 48/48] [FEATURE] Emby prebuilt presets (#1232) Gives Emby first class support by creating prebuilt presets for each variant, including - `Emby TV Show by Date` - `Emby TV Show Collection` - `Emby Music Videos` Emby is identical to Jellyfin except in TV Show Collection, where it requires a `season.nfo`. A new plugin `StaticNfoTags` has been created to create those. Huge thanks to @Kamaroth92 for the initial code for this feature! --- README.md | 6 +- docs/source/config_reference/plugins.rst | 76 +++++ docs/source/prebuilt_presets/tv_shows.rst | 16 +- examples/tv_show_subscriptions.yaml | 2 + src/ytdl_sub/config/plugin/plugin_mapping.py | 3 + src/ytdl_sub/plugins/static_nfo_tags.py | 70 +++++ .../prebuilt_presets/music_videos/__init__.py | 1 + .../music_videos/music_videos.yaml | 3 + .../prebuilt_presets/tv_show/__init__.py | 10 +- .../tv_show/tv_show_by_date.yaml | 3 + .../tv_show/tv_show_collection.yaml | 13 + .../download-index/is_yt_1_migrated.json | 22 ++ .../upload-year/upload-month-day/is_yt_1.json | 22 ++ .../s_1/is_yt_1_migrated.json | 24 ++ .../s_2/is_yt_1_migrated.json | 42 +++ .../upload-year-month-day/s_1/is_yt_1.json | 24 ++ .../upload-year-month-day/s_2/is_yt_1.json | 42 +++ .../multi_url_False.json | 19 ++ .../multi_url_True.json | 23 ++ .../unit/music_videos/Emby Music Videos.json | 19 ++ .../upload-year/upload-month-day/is_yt_1.txt | 130 ++++++++ .../is_yt_1_reformatted_to_upload-year.txt | 145 +++++++++ .../upload-year-month-day/s_1/is_yt_1.txt | 138 +++++++++ ...reformatted_to_playlist-index-reversed.txt | 143 +++++++++ .../upload-year-month-day/s_2/is_yt_1.txt | 265 +++++++++++++++++ ...reformatted_to_playlist-index-reversed.txt | 277 ++++++++++++++++++ .../multi_url_False.txt | 77 +++++ .../multi_url_True.txt | 95 ++++++ .../unit/music_videos/Emby Music Videos.txt | 77 +++++ 29 files changed, 1772 insertions(+), 15 deletions(-) create mode 100644 src/ytdl_sub/plugins/static_nfo_tags.py create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/download-index/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_1/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_2/is_yt_1_migrated.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.json create mode 100644 tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.json create mode 100644 tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.json create mode 100644 tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos.json create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.txt create mode 100644 tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt create mode 100644 tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.txt create mode 100644 tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.txt create mode 100644 tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos.txt diff --git a/README.md b/README.md index 01fd005c..3ba8ab5f 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ __preset__: cookiefile: "/config/cookie.txt" ################################################################### -# TV Show Presets. Can replace Plex with Plex/Jellyfin/Kodi +# TV Show Presets. Can replace Plex with Plex/Jellyfin/Emby/Kodi Plex TV Show by Date: @@ -106,7 +106,7 @@ Plex TV Show Collection: s02_url: "https://www.youtube.com/playlist?list=PLE62gWlWZk5NWVAVuf0Lm9jdv_-_KXs0W" ################################################################### -# Music Presets. Can replace Plex with Plex/Jellyfin/Kodi +# Music Presets. YouTube Releases: = Jazz: # Sets genre tag to "Jazz" @@ -128,7 +128,7 @@ Bandcamp: "Emily Hopkins": "https://emilyharpist.bandcamp.com/" ################################################################### -# Music Video Presets +# Music Video Presets. Can replace Plex with Plex/Jellyfin/Kodi "Plex Music Videos": = Pop: # Sets genre tag to "Pop" "Rick Astley": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc" diff --git a/docs/source/config_reference/plugins.rst b/docs/source/config_reference/plugins.rst index 0eec34ea..7329b171 100644 --- a/docs/source/config_reference/plugins.rst +++ b/docs/source/config_reference/plugins.rst @@ -828,6 +828,82 @@ used with no modifications. set to the entry's title and ``chapter_index``, ``chapter_count`` are both set to 1. +---------------------------------------------------------------------------------------------------- + +static_nfo_tags +--------------- +Adds an NFO file for every entry, but does not link it to an entry in the download archive. +This is intended to produce ``season.nfo``s in each season directory. Each entry within a +season will overwrite this file with its season name. If the entry gets deleted from ytdl-sub, +this file will remain since it's not linked. + +Usage: + +.. code-block:: yaml + + presets: + my_example_preset: + static_nfo_tags: + # required + nfo_name: "season.nfo" + nfo_root: "season" + tags: + title: "My custom season name!" + # optional + kodi_safe: False + +``enable`` + +:expected type: Optional[OverridesFormatter] +:description: + Can typically be left undefined to always default to enable. For preset convenience, + this field can be set using an override variable to easily toggle whether this plugin + is enabled or not via Boolean. + + +``kodi_safe`` + +:expected type: OverridesBooleanFormatterValidator +:description: + Defaults to False. Kodi does not support > 3-byte unicode characters, which include + emojis and some foreign language characters. Setting this to True will replace those + characters with '□'. + + +``nfo_name`` + +:expected type: EntryFormatter +:description: + The NFO file name. + + +``nfo_root`` + +:expected type: EntryFormatter +:description: + The root tag of the NFO's XML. In the usage above, it would look like + + .. code-block:: xml + + + + + + +``tags`` + +:expected type: NfoTags +:description: + Tags within the nfo_root tag. In the usage above, it would look like + + .. code-block:: xml + + + + My custom season name! + + + ---------------------------------------------------------------------------------------------------- subtitles diff --git a/docs/source/prebuilt_presets/tv_shows.rst b/docs/source/prebuilt_presets/tv_shows.rst index 9cf0f92b..c8afe6d9 100644 --- a/docs/source/prebuilt_presets/tv_shows.rst +++ b/docs/source/prebuilt_presets/tv_shows.rst @@ -9,16 +9,22 @@ Player-Specific Presets The following actions are taken based on the indicated player: +Kodi +-------- +* Everything that the Jellyfin version does +* Enables ``kodi_safe`` NFOs, replacing 4-byte unicode characters that break kodi with ``□`` Jellyfin -------- * Places any season-specific poster art in the main show folder * Generates NFO tags -Kodi --------- -* Everything that the Jellyfin version does -* Enables ``kodi_safe`` NFOs, replacing 4-byte unicode characters that break kodi with ``□`` +Emby +---- +* Places any season-specific poster art in the main show folder +* Generates NFO tags + + * For named seasons, creates a ``season.nfo`` file per season Plex -------- @@ -39,6 +45,7 @@ Must define ``tv_show_directory``. Available presets: * ``Kodi TV Show by Date`` * ``Jellyfin TV Show by Date`` +* ``Emby TV Show by Date`` * ``Plex TV Show by Date`` .. code-block:: yaml @@ -147,6 +154,7 @@ Must define ``tv_show_directory``. Available presets: * ``Kodi TV Show Collection`` * ``Jellyfin TV Show Collection`` +* ``Emby TV Show Collection`` * ``Plex TV Show Collection`` .. code-block:: yaml diff --git a/examples/tv_show_subscriptions.yaml b/examples/tv_show_subscriptions.yaml index eb88e4da..9ec60ad2 100644 --- a/examples/tv_show_subscriptions.yaml +++ b/examples/tv_show_subscriptions.yaml @@ -31,6 +31,7 @@ __preset__: # Choose the player you intend to use by setting the top-level key to be either: # - Plex TV Show by Date: # - Jellyfin TV Show by Date: +# - Emby TV Show by Date: # - Kodi TV Show by Date: Plex TV Show by Date: @@ -64,6 +65,7 @@ Plex TV Show by Date: # Choose the player you intend to use by setting the top-level key to be either: # - Plex TV Show Collection: # - Jellyfin TV Show Collection: +# - Emby TV Show Collection: # - Kodi TV Show Collection: Plex TV Show Collection: = Music: diff --git a/src/ytdl_sub/config/plugin/plugin_mapping.py b/src/ytdl_sub/config/plugin/plugin_mapping.py index 316096b2..b52bb776 100644 --- a/src/ytdl_sub/config/plugin/plugin_mapping.py +++ b/src/ytdl_sub/config/plugin/plugin_mapping.py @@ -24,6 +24,7 @@ from ytdl_sub.plugins.music_tags import MusicTagsPlugin from ytdl_sub.plugins.nfo_tags import NfoTagsPlugin from ytdl_sub.plugins.output_directory_nfo_tags import OutputDirectoryNfoTagsPlugin from ytdl_sub.plugins.split_by_chapters import SplitByChaptersPlugin +from ytdl_sub.plugins.static_nfo_tags import StaticNfoTagsPlugin from ytdl_sub.plugins.subtitles import SubtitlesPlugin from ytdl_sub.plugins.throttle_protection import ThrottleProtectionPlugin from ytdl_sub.plugins.video_tags import VideoTagsPlugin @@ -46,6 +47,7 @@ class PluginMapping: "video_tags": VideoTagsPlugin, "nfo_tags": NfoTagsPlugin, "output_directory_nfo_tags": OutputDirectoryNfoTagsPlugin, + "static_nfo_tags": StaticNfoTagsPlugin, "subtitles": SubtitlesPlugin, "chapters": ChaptersPlugin, "split_by_chapters": SplitByChaptersPlugin, @@ -83,6 +85,7 @@ class PluginMapping: MusicTagsPlugin, VideoTagsPlugin, NfoTagsPlugin, + StaticNfoTagsPlugin, EmbedThumbnailPlugin, ] diff --git a/src/ytdl_sub/plugins/static_nfo_tags.py b/src/ytdl_sub/plugins/static_nfo_tags.py new file mode 100644 index 00000000..e4c1dbea --- /dev/null +++ b/src/ytdl_sub/plugins/static_nfo_tags.py @@ -0,0 +1,70 @@ +from ytdl_sub.entries.entry import Entry +from ytdl_sub.plugins.nfo_tags import NfoTagsValidator +from ytdl_sub.plugins.nfo_tags import SharedNfoTagsOptions +from ytdl_sub.plugins.nfo_tags import SharedNfoTagsPlugin +from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator + + +class StaticNfoTagsOptions(SharedNfoTagsOptions): + """ + Adds an NFO file for every entry, but does not link it to an entry in the download archive. + This is intended to produce ``season.nfo``s in each season directory. Each entry within a + season will overwrite this file with its season name. If the entry gets deleted from ytdl-sub, + this file will remain since it's not linked. + + Usage: + + .. code-block:: yaml + + presets: + my_example_preset: + static_nfo_tags: + # required + nfo_name: "season.nfo" + nfo_root: "season" + tags: + title: "My custom season name!" + # optional + kodi_safe: False + """ + + @property + def nfo_root(self) -> StringFormatterValidator: + """ + :expected type: EntryFormatter + :description: + The root tag of the NFO's XML. In the usage above, it would look like + + .. code-block:: xml + + + + + """ + return self._nfo_root + + @property + def tags(self) -> NfoTagsValidator: + """ + :expected type: NfoTags + :description: + Tags within the nfo_root tag. In the usage above, it would look like + + .. code-block:: xml + + + + My custom season name! + + """ + return self._tags + + +class StaticNfoTagsPlugin(SharedNfoTagsPlugin): + plugin_options_type = StaticNfoTagsOptions + + def post_process_entry(self, entry: Entry) -> None: + """ + Creates the NFO from each entry, but does not link/save it to the entry. + """ + self._create_nfo(entry=entry, save_to_entry=False) diff --git a/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py b/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py index ae128998..76b18443 100644 --- a/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py +++ b/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py @@ -8,6 +8,7 @@ class MusicVideoPresets(PrebuiltPresets): preset_names = { "Kodi Music Videos", "Jellyfin Music Videos", + "Emby Music Videos", "Plex Music Videos", } diff --git a/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml b/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml index dcacd330..4860a2b8 100644 --- a/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml +++ b/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml @@ -7,6 +7,9 @@ presets: - "_music_video_nfo" - "_music_video_tags" + "Emby Music Videos": + preset: "Jellyfin Music Videos" + "Kodi Music Videos": preset: - "_kodi_base" diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py b/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py index 841e1713..0e10c448 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py +++ b/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py @@ -8,6 +8,7 @@ class TvShowByDatePresets(PrebuiltPresets): preset_names = { "Kodi TV Show by Date", "Jellyfin TV Show by Date", + "Emby TV Show by Date", "Plex TV Show by Date", } @@ -16,13 +17,6 @@ class TvShowCollectionPresets(PrebuiltPresets): preset_names = { "Kodi TV Show Collection", "Jellyfin TV Show Collection", + "Emby TV Show Collection", "Plex TV Show Collection", } - - -class TvShowCollectionOldPresets(PrebuiltPresets): - preset_names = { - "kodi_tv_show_collection", - "jellyfin_tv_show_collection", - "plex_tv_show_collection", - } diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml index d2056b9d..7f5fe531 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show_by_date.yaml @@ -31,6 +31,9 @@ presets: - "plex_tv_show_by_date" - "season_by_year__episode_by_month_day" + "Emby TV Show by Date": + preset: "Jellyfin TV Show by Date" + #################################################################################################### # TV show from one or more sources. Uses {url}'s avatar and banner as poster and fanart 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 4d77d0a4..70c0fd9d 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 @@ -18,7 +18,20 @@ presets: - "plex_tv_show_collection" - "season_by_collection__episode_by_year_month_day" + "Emby TV Show Collection": + preset: "Jellyfin TV Show Collection" + + # Emby cannot read seasons from tv_show.nfo + # Create explicit season NFOs in each season dir + static_nfo_tags: + nfo_name: "{season_directory_name_sanitized}/season.nfo" + nfo_root: "season" + tags: + title: "{collection_season_name}" + + ################## + # Legacy names kodi_tv_show_collection: preset: diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/download-index/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/download-index/is_yt_1_migrated.json new file mode 100644 index 00000000..c8541f52 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/download-index/is_yt_1_migrated.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json": "456d8882fc5e35d74f19b386d1d9a059", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.mp4": "1d0714fb3ca4d31a0f88492a06a6142d", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000001 - Mock Entry 20-3.nfo": "dbe61f2c8ae41041773f713ba5376726", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.mp4": "a8f3f8580989f3927606bf6060a64e30", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000002 - Mock Entry 20-2.nfo": "0f071078c9fa2569bbcb998664d40681", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.mp4": "265b1104b382fd157a123842e49fcdfd", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e000003 - Mock Entry 20-1.nfo": "837a61dca11bbe1874ea07cb8ef8a7c9", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.mp4": "09fa4599fd48836c6c0da0760c306006", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e000004 - Mock Entry 21-1.nfo": "8ee3845c514a411425b7e9198666b61c", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.json new file mode 100644 index 00000000..33848fb2 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.json @@ -0,0 +1,22 @@ +{ + "Best Prebuilt TV Show by Date/.ytdl-sub-subscription_test-download-archive.json": "e30d83126c2c6981c936ed894a6f159b", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.mp4": "c712d7fd5dfdb9bb6c2be99f7c796c6f", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080701 - Mock Entry 20-3.nfo": "7c0f2a9d38bf617377e474fcb9bf2bc2", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.mp4": "7ec7ac1923053c4b5653bbfb8924fdc6", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080801 - Mock Entry 20-2.nfo": "1f4dec756555ee345cd9d6489b63e070", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.mp4": "414c243016f406451c790757949173aa", + "Best Prebuilt TV Show by Date/Season 2020/s2020.e080802 - Mock Entry 20-1.nfo": "f6f704ae3ae0c4055590a147eb425609", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.mp4": "e2f858efd08ac82749fd01db65d8341e", + "Best Prebuilt TV Show by Date/Season 2021/s2021.e080801 - Mock Entry 21-1.nfo": "c6e0d368bfe9d70134e5a2ff2d3dccc6", + "Best Prebuilt TV Show by Date/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show by Date/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show by Date/tvshow.nfo": "2439ebc18e46a67064956cb940c992e9" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_1/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_1/is_yt_1_migrated.json new file mode 100644 index 00000000..69b5d7c7 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_1/is_yt_1_migrated.json @@ -0,0 +1,24 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "809885e6c29bba06215b840516628090", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-3.nfo": "ddf2763f976aaa79199bddbfd3b66501", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-2.nfo": "cda58b9d5b7ee05d5e4d5144ebfe0f94", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-1.nfo": "4d5775492f2731cb5dc04a84ebcb029d", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 21-1.nfo": "2980b224863465a8b8a465c9d381d1f4", + "Best Prebuilt TV Show Collection/Season 01/season.nfo": "979f2563199124cc419039135ed81841", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_2/is_yt_1_migrated.json b/tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_2/is_yt_1_migrated.json new file mode 100644 index 00000000..4aa39535 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Emby/playlist-index-reversed/s_2/is_yt_1_migrated.json @@ -0,0 +1,42 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json": "7331c3a7cc0b43cd547b82af4ec35a3f", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.mp4": "6390603e1f9642ea573f25179b42f6af", + "Best Prebuilt TV Show Collection/Season 01/s01.e000001 - Mock Entry 20-7.nfo": "42ad110e3f608de3edb94735631d39a7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.mp4": "179e310bd4de1638d84b6da787ff9fa8", + "Best Prebuilt TV Show Collection/Season 01/s01.e000002 - Mock Entry 20-6.nfo": "ea4dee97b5bb9e49cb72f0942f851feb", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.mp4": "3c412f47cb87e820138fb8909c672216", + "Best Prebuilt TV Show Collection/Season 01/s01.e000003 - Mock Entry 20-5.nfo": "7f71bd60012d850ece38fa644eeddc5e", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.mp4": "8409a144e67c50573bae29bf76431d76", + "Best Prebuilt TV Show Collection/Season 01/s01.e000004 - Mock Entry 20-4.nfo": "c487f013b8d5adc399a793bc803b898f", + "Best Prebuilt TV Show Collection/Season 01/season.nfo": "979f2563199124cc419039135ed81841", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.mp4": "e107a93fa177c5f8594ccc3e023db8e8", + "Best Prebuilt TV Show Collection/Season 02/s02.e000001 - Mock Entry 20-3.nfo": "4eedc1c0e99858530e6228001d024766", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.mp4": "2788e6b165908e6d52d7d771859b085e", + "Best Prebuilt TV Show Collection/Season 02/s02.e000002 - Mock Entry 20-2.nfo": "cc1541a65508fcbfd9f024042cb6b6ce", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.mp4": "6f0fd7cb3b3c49a8cf7baa6657cb5148", + "Best Prebuilt TV Show Collection/Season 02/s02.e000003 - Mock Entry 20-1.nfo": "d5fa573faf1d29c367117917417df62c", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.mp4": "6a983aa1b5dff65c54bd5f0b78003e07", + "Best Prebuilt TV Show Collection/Season 02/s02.e000004 - Mock Entry 21-1.nfo": "6c40cd5d13c8d088e57906e809a591f8", + "Best Prebuilt TV Show Collection/Season 02/season.nfo": "9445cf70a039402e01cf7ac607dd7d21", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.json new file mode 100644 index 00000000..05e46280 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.json @@ -0,0 +1,24 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "ede1deeba072bae50f7f7039deca0543", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080701 - Mock Entry 20-3.nfo": "043c6de15ab09f32e64414d1f4a8a89c", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080801 - Mock Entry 20-2.nfo": "4fb018858502fe2c7a0d3dcb89145a8d", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080802 - Mock Entry 20-1.nfo": "6ac2ee3bd87b453d56bd90b42bbf52a0", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/Season 01/s01.e21080801 - Mock Entry 21-1.nfo": "d54ba1888f0083f8de6f401e399ad379", + "Best Prebuilt TV Show Collection/Season 01/season.nfo": "979f2563199124cc419039135ed81841", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "a3f1061135b7aa0c25e5176a271d32f0" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.json b/tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.json new file mode 100644 index 00000000..3417dd91 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.json @@ -0,0 +1,42 @@ +{ + "Best Prebuilt TV Show Collection/.ytdl-sub-subscription_test-download-archive.json": "9b9e26ff3d036f450501bf5adb979aeb", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.mp4": "fab0f2d0a74558a86b3935c6b962ebe3", + "Best Prebuilt TV Show Collection/Season 01/s01.e20060601 - Mock Entry 20-7.nfo": "9ceac835c0166bf4f7354106379e6d17", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.mp4": "9c2569c62ff81f067fe3d91324942c11", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070601 - Mock Entry 20-6.nfo": "35f15e5437cae813095fe2ca3bd2ca18", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.mp4": "921e686edbf2a2e11f8d3eba9ef32592", + "Best Prebuilt TV Show Collection/Season 01/s01.e20070602 - Mock Entry 20-5.nfo": "9aa69e4c86bb282ac57b2024ec2fbd34", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.mp4": "a9fae3eca046637910a6e79aae4a8354", + "Best Prebuilt TV Show Collection/Season 01/s01.e20080601 - Mock Entry 20-4.nfo": "709533b6b8f501196db0d98dfe2b2b16", + "Best Prebuilt TV Show Collection/Season 01/season.nfo": "979f2563199124cc419039135ed81841", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.mp4": "a874866ad7096eb3bf31c72ea3315354", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080701 - Mock Entry 20-3.nfo": "05f34cd0e6be4b09ea96134faec892f6", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.mp4": "fe6fcf8bfc13c0913ad1509703b447f1", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080801 - Mock Entry 20-2.nfo": "54b4f84daf25626703f7b3a36b0dea49", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.mp4": "1d0f1081b402ebea9aeedf75f891c811", + "Best Prebuilt TV Show Collection/Season 02/s02.e20080802 - Mock Entry 20-1.nfo": "3d2644161e57b94cfac5e95732864cc3", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1-thumb.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.info.json": "INFO_JSON", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.mp4": "e5a844cc2c8fe19037afdf0692731414", + "Best Prebuilt TV Show Collection/Season 02/s02.e21080801 - Mock Entry 21-1.nfo": "fd91adb2089d0fcdbb2e568a10ac880e", + "Best Prebuilt TV Show Collection/Season 02/season.nfo": "9445cf70a039402e01cf7ac607dd7d21", + "Best Prebuilt TV Show Collection/fanart.jpg": "15c9a67b554f415a662fdf7a3340cd61", + "Best Prebuilt TV Show Collection/poster.jpg": "0b0fdbe56bab3e3fdda18730588d742a", + "Best Prebuilt TV Show Collection/season01-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/season02-poster.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "Best Prebuilt TV Show Collection/tvshow.nfo": "61943a17325c5188475651ca7c68446d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.json new file mode 100644 index 00000000..c29e6056 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.json @@ -0,0 +1,19 @@ +{ + ".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed", + "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", + "subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1", + "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", + "subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405", + "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", + "subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352", + "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", + "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4", + "subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.json new file mode 100644 index 00000000..e970dc97 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.json @@ -0,0 +1,23 @@ +{ + ".ytdl-sub-subscription_test-download-archive.json": "bcb2e8e8139f5bf589e027f841aa9449", + "subscription_test/Custom Title.info.json": "INFO_JSON", + "subscription_test/Custom Title.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Custom Title.mp4": "59b7b4ed1419fa43a2faff470b764bd2", + "subscription_test/Custom Title.nfo": "996f3993b2ba8a0614bef294492dde65", + "subscription_test/Mock Entry 20-4.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-4.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-4.mp4": "67a47bc3b9583a1d99040afc2589bfe6", + "subscription_test/Mock Entry 20-4.nfo": "1e7cb1a09c15f155623f6cd796e874ff", + "subscription_test/Mock Entry 20-5.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-5.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-5.mp4": "ae8d22fe6de7ee75a80508e53d2aaaae", + "subscription_test/Mock Entry 20-5.nfo": "f6100f194ae3c3b24211ff515d97ccdf", + "subscription_test/Mock Entry 20-6.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-6.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-6.mp4": "0c4c6f12b8e7993e34d9ba1dce605683", + "subscription_test/Mock Entry 20-6.nfo": "f51ae05104f5b98531535e75d623f941", + "subscription_test/Mock Entry 20-7.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-7.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-7.mp4": "d9fd30536ff349030467e25fa611055e", + "subscription_test/Mock Entry 20-7.nfo": "852c02ea3ab196d808854ee94a9313d2" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos.json new file mode 100644 index 00000000..c29e6056 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Emby Music Videos.json @@ -0,0 +1,19 @@ +{ + ".ytdl-sub-subscription_test-download-archive.json": "b98a30417f259daeec888e1a5047b9ed", + "subscription_test/Mock Entry 20-1.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-1.mp4": "a164f7c885a335e7ab0c4ccf0ed38ee0", + "subscription_test/Mock Entry 20-1.nfo": "68a6a9e51a12e75d4c68e6e644b409d1", + "subscription_test/Mock Entry 20-2.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-2.mp4": "eaa5e5207d1a9a98d9aac10ca55adb1b", + "subscription_test/Mock Entry 20-2.nfo": "1cbe51945c1a7a9ced0eb1222e9d2405", + "subscription_test/Mock Entry 20-3.info.json": "INFO_JSON", + "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-3.mp4": "3486772701dbed59f44b5028e96ec0e0", + "subscription_test/Mock Entry 20-3.nfo": "ef07f30d3e882de3f7cb3ad675125352", + "subscription_test/Mock Entry 21-1.info.json": "INFO_JSON", + "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 21-1.mp4": "dedfd5373815d94c5187c5b27a6312f4", + "subscription_test/Mock Entry 21-1.nfo": "dc714fd9f3c3729f74927ad245b50d9d" +} \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.txt new file mode 100644 index 00000000..b89836ef --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1.txt @@ -0,0 +1,130 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + title: Best Prebuilt TV Show by Date +{output_directory}/Season 2020 + s2020.e080701 - Mock Entry 20-3-thumb.jpg + s2020.e080701 - Mock Entry 20-3.info.json + s2020.e080701 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 80701 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e080701 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 80701 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2020 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e080801 - Mock Entry 20-2-thumb.jpg + s2020.e080801 - Mock Entry 20-2.info.json + s2020.e080801 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 80801 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e080801 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 80801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e080802 - Mock Entry 20-1-thumb.jpg + s2020.e080802 - Mock Entry 20-1.info.json + s2020.e080802 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 80802 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s2020.e080802 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 80802 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 +{output_directory}/Season 2021 + s2021.e080801 - Mock Entry 21-1-thumb.jpg + s2021.e080801 - Mock Entry 21-1.info.json + s2021.e080801 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 80801 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s2021.e080801 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 80801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2021 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt b/tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt new file mode 100644 index 00000000..3ff899a3 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/by-date/Emby/upload-year/upload-month-day/is_yt_1_reformatted_to_upload-year.txt @@ -0,0 +1,145 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show by Date-download-archive.json +{output_directory}/Season 2020 + s2020.e000001 - Mock Entry 20-3-thumb.jpg + s2020.e000001 - Mock Entry 20-3.info.json + s2020.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2020 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s2020.e000002 - Mock Entry 20-2-thumb.jpg + s2020.e000002 - Mock Entry 20-2.info.json + s2020.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s2020.e000003 - Mock Entry 20-1-thumb.jpg + s2020.e000003 - Mock Entry 20-1.info.json + s2020.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s2020.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2020 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 +{output_directory}/Season 2021 + s2021.e000004 - Mock Entry 21-1-thumb.jpg + s2021.e000004 - Mock Entry 21-1.info.json + s2021.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show by Date + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s2021.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2021 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 2020 + s2020.e080701 - Mock Entry 20-3-thumb.jpg + s2020.e080701 - Mock Entry 20-3.info.json + s2020.e080701 - Mock Entry 20-3.mp4 + s2020.e080701 - Mock Entry 20-3.nfo + s2020.e080801 - Mock Entry 20-2-thumb.jpg + s2020.e080801 - Mock Entry 20-2.info.json + s2020.e080801 - Mock Entry 20-2.mp4 + s2020.e080801 - Mock Entry 20-2.nfo + s2020.e080802 - Mock Entry 20-1-thumb.jpg + s2020.e080802 - Mock Entry 20-1.info.json + s2020.e080802 - Mock Entry 20-1.mp4 + s2020.e080802 - Mock Entry 20-1.nfo +{output_directory}/Season 2021 + s2021.e080801 - Mock Entry 21-1-thumb.jpg + s2021.e080801 - Mock Entry 21-1.info.json + s2021.e080801 - Mock Entry 21-1.mp4 + s2021.e080801 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.txt new file mode 100644 index 00000000..f1082093 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1.txt @@ -0,0 +1,138 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + season01-poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + namedseason: + attributes: + number: 1 + tag: Named Season 1 + title: Best Prebuilt TV Show Collection +{output_directory}/Season 01 + s01.e20080701 - Mock Entry 20-3-thumb.jpg + s01.e20080701 - Mock Entry 20-3.info.json + s01.e20080701 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 20080701 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e20080701 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 20080701 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 1 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e20080801 - Mock Entry 20-2-thumb.jpg + s01.e20080801 - Mock Entry 20-2.info.json + s01.e20080801 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 20080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e20080801 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 20080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e20080802 - Mock Entry 20-1-thumb.jpg + s01.e20080802 - Mock Entry 20-1.info.json + s01.e20080802 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 20080802 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e20080802 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 20080802 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e21080801 - Mock Entry 21-1-thumb.jpg + s01.e21080801 - Mock Entry 21-1.info.json + s01.e21080801 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 21080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s01.e21080801 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 21080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 1 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + season.nfo + NFO tags: + season: + title: Named Season 1 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt new file mode 100644 index 00000000..8d6a047e --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_1/is_yt_1_reformatted_to_playlist-index-reversed.txt @@ -0,0 +1,143 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json +{output_directory}/Season 01 + s01.e000001 - Mock Entry 20-3-thumb.jpg + s01.e000001 - Mock Entry 20-3.info.json + s01.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 1 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s01.e000002 - Mock Entry 20-2-thumb.jpg + s01.e000002 - Mock Entry 20-2.info.json + s01.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s01.e000003 - Mock Entry 20-1-thumb.jpg + s01.e000003 - Mock Entry 20-1.info.json + s01.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 1 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s01.e000004 - Mock Entry 21-1-thumb.jpg + s01.e000004 - Mock Entry 21-1.info.json + s01.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s01.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 1 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 01 + s01.e20080701 - Mock Entry 20-3-thumb.jpg + s01.e20080701 - Mock Entry 20-3.info.json + s01.e20080701 - Mock Entry 20-3.mp4 + s01.e20080701 - Mock Entry 20-3.nfo + s01.e20080801 - Mock Entry 20-2-thumb.jpg + s01.e20080801 - Mock Entry 20-2.info.json + s01.e20080801 - Mock Entry 20-2.mp4 + s01.e20080801 - Mock Entry 20-2.nfo + s01.e20080802 - Mock Entry 20-1-thumb.jpg + s01.e20080802 - Mock Entry 20-1.info.json + s01.e20080802 - Mock Entry 20-1.mp4 + s01.e20080802 - Mock Entry 20-1.nfo + s01.e21080801 - Mock Entry 21-1-thumb.jpg + s01.e21080801 - Mock Entry 21-1.info.json + s01.e21080801 - Mock Entry 21-1.mp4 + s01.e21080801 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.txt b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.txt new file mode 100644 index 00000000..6633a28b --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1.txt @@ -0,0 +1,265 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json + fanart.jpg + poster.jpg + season01-poster.jpg + season02-poster.jpg + tvshow.nfo + NFO tags: + tvshow: + genre: ytdl-sub + mpaa: TV-14 + namedseason: + - + attributes: + number: 1 + tag: Named Season 1 + - + attributes: + number: 2 + tag: Named Season 2 + title: Best Prebuilt TV Show Collection +{output_directory}/Season 01 + s01.e20060601 - Mock Entry 20-7-thumb.jpg + s01.e20060601 - Mock Entry 20-7.info.json + s01.e20060601 - Mock Entry 20-7.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-06-06 + episode_id: 20060601 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-7.com + + The Description + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e20060601 - Mock Entry 20-7.nfo + NFO tags: + episodedetails: + aired: 2020-06-06 + episode: 20060601 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-7.com + + The Description + season: 1 + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e20070601 - Mock Entry 20-6-thumb.jpg + s01.e20070601 - Mock Entry 20-6.info.json + s01.e20070601 - Mock Entry 20-6.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 20070601 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-6.com + + The Description + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e20070601 - Mock Entry 20-6.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 20070601 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-6.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e20070602 - Mock Entry 20-5-thumb.jpg + s01.e20070602 - Mock Entry 20-5.info.json + s01.e20070602 - Mock Entry 20-5.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 20070602 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-5.com + + The Description + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e20070602 - Mock Entry 20-5.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 20070602 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-5.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e20080601 - Mock Entry 20-4-thumb.jpg + s01.e20080601 - Mock Entry 20-4.info.json + s01.e20080601 - Mock Entry 20-4.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-06 + episode_id: 20080601 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-4.com + + The Description + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 + s01.e20080601 - Mock Entry 20-4.nfo + NFO tags: + episodedetails: + aired: 2020-08-06 + episode: 20080601 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-4.com + + The Description + season: 1 + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 + season.nfo + NFO tags: + season: + title: Named Season 1 +{output_directory}/Season 02 + s02.e20080701 - Mock Entry 20-3-thumb.jpg + s02.e20080701 - Mock Entry 20-3.info.json + s02.e20080701 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 20080701 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e20080701 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 20080701 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e20080801 - Mock Entry 20-2-thumb.jpg + s02.e20080801 - Mock Entry 20-2.info.json + s02.e20080801 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 20080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e20080801 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 20080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e20080802 - Mock Entry 20-1-thumb.jpg + s02.e20080802 - Mock Entry 20-1.info.json + s02.e20080802 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 20080802 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e20080802 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 20080802 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e21080801 - Mock Entry 21-1-thumb.jpg + s02.e21080801 - Mock Entry 21-1.info.json + s02.e21080801 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 21080801 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s02.e21080801 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 21080801 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + season.nfo + NFO tags: + season: + title: Named Season 2 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt new file mode 100644 index 00000000..af9f7f22 --- /dev/null +++ b/tests/resources/transaction_log_summaries/integration/collection/Emby/upload-year-month-day/s_2/is_yt_1_reformatted_to_playlist-index-reversed.txt @@ -0,0 +1,277 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-Best Prebuilt TV Show Collection-download-archive.json +{output_directory}/Season 01 + s01.e000001 - Mock Entry 20-7-thumb.jpg + s01.e000001 - Mock Entry 20-7.info.json + s01.e000001 - Mock Entry 20-7.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-06-06 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-7.com + + The Description + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e000001 - Mock Entry 20-7.nfo + NFO tags: + episodedetails: + aired: 2020-06-06 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-7.com + + The Description + season: 1 + title: 2020-06-06 - Mock Entry 20-7 + year: 2020 + s01.e000002 - Mock Entry 20-6-thumb.jpg + s01.e000002 - Mock Entry 20-6.info.json + s01.e000002 - Mock Entry 20-6.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-6.com + + The Description + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e000002 - Mock Entry 20-6.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-6.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-6 + year: 2020 + s01.e000003 - Mock Entry 20-5-thumb.jpg + s01.e000003 - Mock Entry 20-5.info.json + s01.e000003 - Mock Entry 20-5.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-07-06 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-5.com + + The Description + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e000003 - Mock Entry 20-5.nfo + NFO tags: + episodedetails: + aired: 2020-07-06 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-5.com + + The Description + season: 1 + title: 2020-07-06 - Mock Entry 20-5 + year: 2020 + s01.e000004 - Mock Entry 20-4-thumb.jpg + s01.e000004 - Mock Entry 20-4.info.json + s01.e000004 - Mock Entry 20-4.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-06 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-4.com + + The Description + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 + s01.e000004 - Mock Entry 20-4.nfo + NFO tags: + episodedetails: + aired: 2020-08-06 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-4.com + + The Description + season: 1 + title: 2020-08-06 - Mock Entry 20-4 + year: 2020 +{output_directory}/Season 02 + s02.e000001 - Mock Entry 20-3-thumb.jpg + s02.e000001 - Mock Entry 20-3.info.json + s02.e000001 - Mock Entry 20-3.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-07 + episode_id: 1 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-3.com + + The Description + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e000001 - Mock Entry 20-3.nfo + NFO tags: + episodedetails: + aired: 2020-08-07 + episode: 1 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-3.com + + The Description + season: 2 + title: 2020-08-07 - Mock Entry 20-3 + year: 2020 + s02.e000002 - Mock Entry 20-2-thumb.jpg + s02.e000002 - Mock Entry 20-2.info.json + s02.e000002 - Mock Entry 20-2.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 2 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-2.com + + The Description + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e000002 - Mock Entry 20-2.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 2 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-2.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-2 + year: 2020 + s02.e000003 - Mock Entry 20-1-thumb.jpg + s02.e000003 - Mock Entry 20-1.info.json + s02.e000003 - Mock Entry 20-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2020-08-08 + episode_id: 3 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://20-1.com + + The Description + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e000003 - Mock Entry 20-1.nfo + NFO tags: + episodedetails: + aired: 2020-08-08 + episode: 3 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://20-1.com + + The Description + season: 2 + title: 2020-08-08 - Mock Entry 20-1 + year: 2020 + s02.e000004 - Mock Entry 21-1-thumb.jpg + s02.e000004 - Mock Entry 21-1.info.json + s02.e000004 - Mock Entry 21-1.mp4 + Video Tags: + contentRating: TV-14 + date: 2021-08-08 + episode_id: 4 + genre: ytdl-sub + show: Best Prebuilt TV Show Collection + synopsis: + https://21-1.com + + The Description + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + s02.e000004 - Mock Entry 21-1.nfo + NFO tags: + episodedetails: + aired: 2021-08-08 + episode: 4 + genre: ytdl-sub + mpaa: TV-14 + plot: + https://21-1.com + + The Description + season: 2 + title: 2021-08-08 - Mock Entry 21-1 + year: 2021 + +Files removed: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/Season 01 + s01.e20060601 - Mock Entry 20-7-thumb.jpg + s01.e20060601 - Mock Entry 20-7.info.json + s01.e20060601 - Mock Entry 20-7.mp4 + s01.e20060601 - Mock Entry 20-7.nfo + s01.e20070601 - Mock Entry 20-6-thumb.jpg + s01.e20070601 - Mock Entry 20-6.info.json + s01.e20070601 - Mock Entry 20-6.mp4 + s01.e20070601 - Mock Entry 20-6.nfo + s01.e20070602 - Mock Entry 20-5-thumb.jpg + s01.e20070602 - Mock Entry 20-5.info.json + s01.e20070602 - Mock Entry 20-5.mp4 + s01.e20070602 - Mock Entry 20-5.nfo + s01.e20080601 - Mock Entry 20-4-thumb.jpg + s01.e20080601 - Mock Entry 20-4.info.json + s01.e20080601 - Mock Entry 20-4.mp4 + s01.e20080601 - Mock Entry 20-4.nfo +{output_directory}/Season 02 + s02.e20080701 - Mock Entry 20-3-thumb.jpg + s02.e20080701 - Mock Entry 20-3.info.json + s02.e20080701 - Mock Entry 20-3.mp4 + s02.e20080701 - Mock Entry 20-3.nfo + s02.e20080801 - Mock Entry 20-2-thumb.jpg + s02.e20080801 - Mock Entry 20-2.info.json + s02.e20080801 - Mock Entry 20-2.mp4 + s02.e20080801 - Mock Entry 20-2.nfo + s02.e20080802 - Mock Entry 20-1-thumb.jpg + s02.e20080802 - Mock Entry 20-1.info.json + s02.e20080802 - Mock Entry 20-1.mp4 + s02.e20080802 - Mock Entry 20-1.nfo + s02.e21080801 - Mock Entry 21-1-thumb.jpg + s02.e21080801 - Mock Entry 21-1.info.json + s02.e21080801 - Mock Entry 21-1.mp4 + s02.e21080801 - Mock Entry 21-1.nfo \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.txt new file mode 100644 index 00000000..52e2c27d --- /dev/null +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_False.txt @@ -0,0 +1,77 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/subscription_test + Mock Entry 20-1.info.json + Mock Entry 20-1.jpg + Mock Entry 20-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-1 + year: 2020 + Mock Entry 20-1.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-1 + Mock Entry 20-2.info.json + Mock Entry 20-2.jpg + Mock Entry 20-2.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-2 + year: 2020 + Mock Entry 20-2.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-2 + Mock Entry 20-3.info.json + Mock Entry 20-3.jpg + Mock Entry 20-3.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-07 + title: Mock Entry 20-3 + year: 2020 + Mock Entry 20-3.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-07 + title: Mock Entry 20-3 + Mock Entry 21-1.info.json + Mock Entry 21-1.jpg + Mock Entry 21-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2021-08-08 + title: Mock Entry 21-1 + year: 2021 + Mock Entry 21-1.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2021-08-08 + title: Mock Entry 21-1 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.txt new file mode 100644 index 00000000..49e609e1 --- /dev/null +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos Categorized/multi_url_True.txt @@ -0,0 +1,95 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/subscription_test + Custom Title.info.json + Custom Title.jpg + Custom Title.mp4 + Video Tags: + album: Concerts + artist: subscription_test + genre: ytdl-sub + premiered: 2021-08-08 + title: Custom Title + year: 2021 + Custom Title.nfo + NFO tags: + musicvideo: + album: Concerts + artist: subscription_test + genre: ytdl-sub + premiered: 2021-08-08 + title: Custom Title + Mock Entry 20-4.info.json + Mock Entry 20-4.jpg + Mock Entry 20-4.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-06 + title: Mock Entry 20-4 + year: 2020 + Mock Entry 20-4.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-06 + title: Mock Entry 20-4 + Mock Entry 20-5.info.json + Mock Entry 20-5.jpg + Mock Entry 20-5.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-07-06 + title: Mock Entry 20-5 + year: 2020 + Mock Entry 20-5.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-07-06 + title: Mock Entry 20-5 + Mock Entry 20-6.info.json + Mock Entry 20-6.jpg + Mock Entry 20-6.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-07-06 + title: Mock Entry 20-6 + year: 2020 + Mock Entry 20-6.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-07-06 + title: Mock Entry 20-6 + Mock Entry 20-7.info.json + Mock Entry 20-7.jpg + Mock Entry 20-7.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-06-06 + title: Mock Entry 20-7 + year: 2020 + Mock Entry 20-7.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-06-06 + title: Mock Entry 20-7 \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos.txt new file mode 100644 index 00000000..52e2c27d --- /dev/null +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Emby Music Videos.txt @@ -0,0 +1,77 @@ +Files created: +---------------------------------------- +{output_directory} + .ytdl-sub-subscription_test-download-archive.json +{output_directory}/subscription_test + Mock Entry 20-1.info.json + Mock Entry 20-1.jpg + Mock Entry 20-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-1 + year: 2020 + Mock Entry 20-1.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-1 + Mock Entry 20-2.info.json + Mock Entry 20-2.jpg + Mock Entry 20-2.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-2 + year: 2020 + Mock Entry 20-2.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-08 + title: Mock Entry 20-2 + Mock Entry 20-3.info.json + Mock Entry 20-3.jpg + Mock Entry 20-3.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-07 + title: Mock Entry 20-3 + year: 2020 + Mock Entry 20-3.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2020-08-07 + title: Mock Entry 20-3 + Mock Entry 21-1.info.json + Mock Entry 21-1.jpg + Mock Entry 21-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2021-08-08 + title: Mock Entry 21-1 + year: 2021 + Mock Entry 21-1.nfo + NFO tags: + musicvideo: + album: Music Videos + artist: subscription_test + genre: ytdl-sub + premiered: 2021-08-08 + title: Mock Entry 21-1 \ No newline at end of file