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