From 325d229061339fe01d8f22ea0365fd4f8ef33820 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Fri, 10 May 2024 19:57:48 -0700 Subject: [PATCH 1/8] [BUGFIX] Fix usage of ~ in paths (#981) Fixes path with tildes in them, i.e. `~/videos/youtube` --- .../scripting/scripting_functions.rst | 2 +- src/ytdl_sub/config/config_validator.py | 5 ++++- src/ytdl_sub/entries/script/custom_functions.py | 4 ++-- tests/unit/config/test_config_file.py | 14 ++++++++++++++ tests/unit/config/test_preset.py | 16 ++++++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index d5948fb5..ebb777d4 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -716,7 +716,7 @@ to_native_filepath :spec: ``to_native_filepath(filepath: String) -> String`` Convert any unix-based path separators ('/') with the OS's native -separator. +separator. In addition, expand ~ to absolute directories. truncate_filepath_if_too_long ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/src/ytdl_sub/config/config_validator.py b/src/ytdl_sub/config/config_validator.py index ff18b3fc..55a91f55 100644 --- a/src/ytdl_sub/config/config_validator.py +++ b/src/ytdl_sub/config/config_validator.py @@ -1,3 +1,5 @@ +import os +import posixpath from typing import Any from typing import Dict from typing import Optional @@ -147,7 +149,8 @@ class ConfigOptions(StrictDictValidator): The directory to temporarily store downloaded files before moving them into their final directory. Defaults to .ytdl-sub-working-directory """ - return self._working_directory.value + # Expands tildas to actual paths, use native os sep + return os.path.expanduser(self._working_directory.value.replace(posixpath.sep, os.sep)) @property def umask(self) -> Optional[str]: diff --git a/src/ytdl_sub/entries/script/custom_functions.py b/src/ytdl_sub/entries/script/custom_functions.py index 690095de..ded8c54f 100644 --- a/src/ytdl_sub/entries/script/custom_functions.py +++ b/src/ytdl_sub/entries/script/custom_functions.py @@ -36,9 +36,9 @@ class CustomFunctions: def to_native_filepath(filepath: String) -> String: """ Convert any unix-based path separators ('/') with the OS's native - separator. + separator. In addition, expand ~ to absolute directories. """ - return String(filepath.value.replace(posixpath.sep, os.sep)) + return String(os.path.expanduser(filepath.value.replace(posixpath.sep, os.sep))) @staticmethod def truncate_filepath_if_too_long(filepath: String) -> String: diff --git a/tests/unit/config/test_config_file.py b/tests/unit/config/test_config_file.py index 352ead2d..f18a41e0 100644 --- a/tests/unit/config/test_config_file.py +++ b/tests/unit/config/test_config_file.py @@ -1,4 +1,6 @@ +import os.path import re +from pathlib import Path from typing import Dict from typing import Optional @@ -94,6 +96,18 @@ class TestConfigFilePartiallyValidatesPresets: }, ) + def test_config_file_working_dir_home_dir(self): + out = ConfigFile( + name="test_tilda", + value={ + "configuration": {"working_directory": "~/working/dir"}, + }, + ) + + assert out.config_options.working_directory == str( + Path(os.path.expanduser("~")) / "working" / "dir" + ) + @pytest.mark.parametrize( "preset_dict", [ diff --git a/tests/unit/config/test_preset.py b/tests/unit/config/test_preset.py index de651ada..cb3c0b81 100644 --- a/tests/unit/config/test_preset.py +++ b/tests/unit/config/test_preset.py @@ -1,4 +1,6 @@ +import os.path import re +from pathlib import Path import pytest @@ -37,6 +39,20 @@ class TestPreset: }, ) + def test_preset_with_output_directory_tilda(self, config_file, output_options, youtube_video): + out = Preset( + config=config_file, + name="test", + value={ + "download": youtube_video, + "output_options": {"output_directory": "~/output/dir", "file_name": "{dne_var}"}, + "overrides": {"dne_var": "not dne"}, + }, + ) + assert out.overrides.apply_formatter(out.output_options.output_directory) == str( + Path(os.path.expanduser("~")) / "output" / "dir" + ) + def test_preset_parent(self, config_file, output_options, youtube_video): preset = Preset( config=config_file, From 8461f5f229b77a9c144310162dcaa30343e5d5d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 19:40:17 -0700 Subject: [PATCH 2/8] [DEV] Bump pylint from 3.1.0 to 3.1.1 (#987) Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.1.0...v3.1.1) --- 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 b58a8723..1c3baea3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.4.2", "isort==5.13.2", - "pylint==3.1.0", + "pylint==3.1.1", ] docs = [ "sphinx~=7.0", From 02db0c41a5cbdc9e558b52727b049d47ce51d450 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 16:17:21 -0700 Subject: [PATCH 3/8] [DEV] Bump pylint from 3.1.1 to 3.2.0 (#988) Bumps [pylint](https://github.com/pylint-dev/pylint) from 3.1.1 to 3.2.0. - [Release notes](https://github.com/pylint-dev/pylint/releases) - [Commits](https://github.com/pylint-dev/pylint/compare/v3.1.1...v3.2.0) --- updated-dependencies: - dependency-name: pylint 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 1c3baea3..756ed8b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.4.2", "isort==5.13.2", - "pylint==3.1.1", + "pylint==3.2.0", ] docs = [ "sphinx~=7.0", From 87f9378d33f324a657c0ad0879ec4f918ac6d978 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 19:48:22 -0700 Subject: [PATCH 4/8] [BACKEND] Bump yt-dlp from 2024.04.09 to 2024.5.27 (#994) Bumps [yt-dlp](https://github.com/yt-dlp/yt-dlp) from 2024.04.09 to 2024.5.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/2024.04.09...2024.05.27) --- updated-dependencies: - dependency-name: yt-dlp 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 756ed8b0..841a1743 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "yt-dlp==2024.04.09", + "yt-dlp==2024.5.27", "colorama~=0.4", "mergedeep~=1.3", "mediafile~=0.12", From ed969b84d21ac055fc13b5ed8e20229353869b36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 17:04:26 -0700 Subject: [PATCH 5/8] [DEV] Bump pylint from 3.2.0 to 3.2.2 (#991) 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 841a1743..ce803f71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ test = [ lint = [ "black==24.4.2", "isort==5.13.2", - "pylint==3.2.0", + "pylint==3.2.2", ] docs = [ "sphinx~=7.0", From 74625c293d56a223663e41fa7ad7b0ecaf13c552 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 2 Jun 2024 00:05:44 -0700 Subject: [PATCH 6/8] [DEV] Update fixtures (#995) * [DEV] Update fixtures * thumbs fixed, longer timeout * ugh * fanart --- src/ytdl_sub/utils/thumbnail.py | 3 +- .../bandcamp/test_artist_url.json | 13 +- .../chapters/test_chapters_from_comments.json | 2 +- .../test_match_filters_partial.json | 2 +- .../plugins/test_audio_extract_playlist.json | 2 +- .../test_chapters_sb_and_embedded_subs.json | 2 +- .../youtube/test_channel_full.json | 2 +- .../youtube/test_playlist.json | 2 +- .../test_playlist_archive_migrated.json | 2 +- .../bandcamp/test_artist_url.txt | 116 +++++++++--------- .../chapters/test_chapters_from_comments.txt | 10 ++ 11 files changed, 81 insertions(+), 75 deletions(-) diff --git a/src/ytdl_sub/utils/thumbnail.py b/src/ytdl_sub/utils/thumbnail.py index a999f01c..8f7ba153 100644 --- a/src/ytdl_sub/utils/thumbnail.py +++ b/src/ytdl_sub/utils/thumbnail.py @@ -72,8 +72,7 @@ def download_and_convert_url_thumbnail( if not thumbnail_url: return None - # timeout after 8 seconds - with urlopen(thumbnail_url, timeout=1.0) as file: + with urlopen(thumbnail_url, timeout=7.0) as file: with tempfile.NamedTemporaryFile(delete=False) as thumbnail: thumbnail.write(file.read()) diff --git a/tests/resources/expected_downloads_summaries/bandcamp/test_artist_url.json b/tests/resources/expected_downloads_summaries/bandcamp/test_artist_url.json index f56b6371..268b0aab 100644 --- a/tests/resources/expected_downloads_summaries/bandcamp/test_artist_url.json +++ b/tests/resources/expected_downloads_summaries/bandcamp/test_artist_url.json @@ -1,10 +1,5 @@ { - ".ytdl-sub-Sithu Aye-download-archive.json": "1c4bcf58581eac1851be92ee29a3c4d7", - "Sithu Aye/[2021] 10 Years: Remixes and Reimaginings/01 - Double Helix Reimagined.mp3": "ac0e6a2936c309765c69a4c98c42ad10", - "Sithu Aye/[2021] 10 Years: Remixes and Reimaginings/02 - Skye Reimagined.mp3": "38387bd0ec5fc229e30b1a8ce5b9cddb", - "Sithu Aye/[2021] 10 Years: Remixes and Reimaginings/03 - Baryofusion.mp3": "344dbb939b09713dcc33894a8b1b8459", - "Sithu Aye/[2021] 10 Years: Remixes and Reimaginings/04 - Mandalay Reimagined.mp3": "9bacbd5166a740c06d3329dcfae0d9aa", - "Sithu Aye/[2021] 10 Years: Remixes and Reimaginings/folder.jpg": "bf6f70d51557a71b69fed85b2cb476f0", + ".ytdl-sub-Sithu Aye-download-archive.json": "93ad50c4f4cca753f40c46bc6e31cabf", "Sithu Aye/[2022] Re:Invent the Universe (10th Anniversary Remaster)/01 - Invent the Universe.mp3": "482e97a4f9a30aa4413f45f5f3f5dbba", "Sithu Aye/[2022] Re:Invent the Universe (10th Anniversary Remaster)/02 - Grand Unification (feat. David Maxim Micic).mp3": "34e43fd80b4c61295abbb8b794e523a7", "Sithu Aye/[2022] Re:Invent the Universe (10th Anniversary Remaster)/03 - Expansion.mp3": "0ba4b8ef65e274cbf065b6f0a5f444e5", @@ -16,6 +11,10 @@ "Sithu Aye/[2022] Re:Invent the Universe (10th Anniversary Remaster)/09 - Formation.mp3": "d588ed8edc324ea657abb2be96d557a1", "Sithu Aye/[2022] Re:Invent the Universe (10th Anniversary Remaster)/10 - Pale Blue Dot.mp3": "8245d285ba2403bf512f83c4a585eb81", "Sithu Aye/[2022] Re:Invent the Universe (10th Anniversary Remaster)/folder.jpg": "d8cffeca026afaa619f641a95143f803", - "Sithu Aye/[2024] Kindness/01 - Run it Down.mp3": "9570867fd53419c1297411c9bf877a62", + "Sithu Aye/[2024] Kindness/01 - Run it Down.mp3": "227c366845913f3476ae83fce0b72c56", + "Sithu Aye/[2024] Kindness/02 - Zero Sum Groove.mp3": "0bd3b51acefc2a363309a8f94dd146d7", + "Sithu Aye/[2024] Kindness/03 - Obsidian.mp3": "2a6b87e1ab5a69fc6c4503dc0dd03623", + "Sithu Aye/[2024] Kindness/04 - Fear is the Kindness Killer.mp3": "4593d02a83f722d481846552554d13ba", + "Sithu Aye/[2024] Kindness/05 - Ghost;Cleanse.mp3": "f89156a892b597be9b594ce10131ab60", "Sithu Aye/[2024] Kindness/folder.jpg": "8f72c9acb1a2e49fcbdc2624a46b229c" } \ 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 38d69b12..fc5ff67b 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 @@ -1,6 +1,6 @@ { ".ytdl-sub-chapters_from_comments-download-archive.json": "2510b2ff3c54aa4813a4f23ea079e1ec", "JMC/Move 78 - Automated Improvisation [Full Album].jpg": "c12e6a6f242680d1096a1a99d74a62c6", - "JMC/Move 78 - Automated Improvisation [Full Album].mp4": "63119bd17a035574263aeec188e11d5e", + "JMC/Move 78 - Automated Improvisation [Full Album].mp4": "fbe825bf5fb8ce193d47c3da3540e815", "JMC/Move 78 - Automated Improvisation [Full Album].nfo": "039268e97673a6f2b391772ec3b52fac" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json b/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json index 2a6691fb..31e5109d 100644 --- a/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json +++ b/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json @@ -1,6 +1,6 @@ { ".ytdl-sub-match_filter_test-download-archive.json": "30f10646149d9eea4eb970749f352f7d", "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].jpg": "e7830aa8a64b0cde65ba3f7e5fc56530", - "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].mp4": "f17a540070964a199b35f981561d94e4", + "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].mp4": "a0dc417dbf369c47bbac571bdb18e0e4", "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].nfo": "d85f4500bb5d8a2425d734a23b5a944c" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/test_audio_extract_playlist.json b/tests/resources/expected_downloads_summaries/plugins/test_audio_extract_playlist.json index 83ed5f8b..7075adc2 100644 --- a/tests/resources/expected_downloads_summaries/plugins/test_audio_extract_playlist.json +++ b/tests/resources/expected_downloads_summaries/plugins/test_audio_extract_playlist.json @@ -1,6 +1,6 @@ { ".ytdl-sub-multiple_songs_test-download-archive.json": "54237df5e00d1598dfd39f341ee03d75", - "Project Zombie/[2011] Jesse's Minecraft Server/01 - Jesse's Minecraft Server [Trailer - Mar.21].ogg": "9e53a68a39f290899a3dce03fdca6490", + "Project Zombie/[2011] Jesse's Minecraft Server/01 - Jesse's Minecraft Server [Trailer - Mar.21].ogg": "221dab6e9d6840a0b4b7bb24444c87ff", "Project Zombie/[2011] Jesse's Minecraft Server/02 - Jesse's Minecraft Server [Trailer - Feb.27].ogg": "02dc8e368de9555d062bde31dcc82852", "Project Zombie/[2011] Jesse's Minecraft Server/03 - Jesse's Minecraft Server [Trailer - Feb.1].ogg": "c808e1da2bccd419201eeeffc32c3729", "Project Zombie/[2011] Jesse's Minecraft Server/folder.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530" diff --git a/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json b/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json index dcf23c96..8c0c2b41 100644 --- a/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json +++ b/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json @@ -1,6 +1,6 @@ { ".ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json": "2cb4b9586fd5bb7f1fed76ed9195e6e4", "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.jpg": "b5353a824a4800cc26f884e3025ed969", - "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4": "0539ff781c824f17ae3ffbd7dc830a8f", + "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4": "19889ac778397147e55fe640c9a0f490", "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.nfo": "ae73ec18a9f0e5a54c90061ccd32e7f4" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/youtube/test_channel_full.json b/tests/resources/expected_downloads_summaries/youtube/test_channel_full.json index 7b5e7b2f..a1024507 100644 --- a/tests/resources/expected_downloads_summaries/youtube/test_channel_full.json +++ b/tests/resources/expected_downloads_summaries/youtube/test_channel_full.json @@ -18,7 +18,7 @@ "Project ⧸ Zombie/Season 2011/s2011.e022701 - Jesse's Minecraft Server [Trailer - Feb.27].nfo": "20af231e30a035fb2bc0c946f4b4026d", "Project ⧸ Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530", "Project ⧸ Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON", - "Project ⧸ Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "eac3dfce44c2a723f2fc74e9552aa510", + "Project ⧸ Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "7df8f1469adb02f1aecfbb049276cae7", "Project ⧸ Zombie/Season 2011/s2011.e032101 - Jesse's Minecraft Server [Trailer - Mar.21].nfo": "f8bdc463c0cb2ffdc82aba2bcc27ad5d", "Project ⧸ Zombie/Season 2011/s2011.e052901 - Project Zombie |Official Trailer| (IP: mc.projectzombie.beastnode.net)-thumb.jpg": "c956192a379b3661595c9920972d4819", "Project ⧸ Zombie/Season 2011/s2011.e052901 - Project Zombie |Official Trailer| (IP: mc.projectzombie.beastnode.net).info.json": "INFO_JSON", diff --git a/tests/resources/expected_downloads_summaries/youtube/test_playlist.json b/tests/resources/expected_downloads_summaries/youtube/test_playlist.json index d7ed7312..91b6495d 100644 --- a/tests/resources/expected_downloads_summaries/youtube/test_playlist.json +++ b/tests/resources/expected_downloads_summaries/youtube/test_playlist.json @@ -10,7 +10,7 @@ "JMC/Season 01/s01.e11022701 - Jesse's Minecraft Server [Trailer - Feb.27].nfo": "da7645e8826586388ae0d8278ef6a1c1", "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530", "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON", - "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "dc04853870bbb811f6b312e20b58253b", + "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "91f22944f797513fcda9856e244dd3b3", "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].nfo": "c56083e2f3545fa2cafc4d67cbfdacf8", "JMC/fanart.jpg": "129c6639b47299bc48062f0365e670ee", "JMC/poster.jpg": "5de28eea5a921a041452ab3ce1041f73", diff --git a/tests/resources/expected_downloads_summaries/youtube/test_playlist_archive_migrated.json b/tests/resources/expected_downloads_summaries/youtube/test_playlist_archive_migrated.json index a35908dc..50f91133 100644 --- a/tests/resources/expected_downloads_summaries/youtube/test_playlist_archive_migrated.json +++ b/tests/resources/expected_downloads_summaries/youtube/test_playlist_archive_migrated.json @@ -10,7 +10,7 @@ "JMC/Season 01/s01.e11022701 - Jesse's Minecraft Server [Trailer - Feb.27].nfo": "da7645e8826586388ae0d8278ef6a1c1", "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21]-thumb.jpg": "e7830aa8a64b0cde65ba3f7e5fc56530", "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON", - "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "dc04853870bbb811f6b312e20b58253b", + "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].mp4": "91f22944f797513fcda9856e244dd3b3", "JMC/Season 01/s01.e11032101 - Jesse's Minecraft Server [Trailer - Mar.21].nfo": "c56083e2f3545fa2cafc4d67cbfdacf8", "JMC/fanart.jpg": "129c6639b47299bc48062f0365e670ee", "JMC/poster.jpg": "5de28eea5a921a041452ab3ce1041f73", diff --git a/tests/resources/transaction_log_summaries/bandcamp/test_artist_url.txt b/tests/resources/transaction_log_summaries/bandcamp/test_artist_url.txt index 60d1e689..b5a0cc29 100644 --- a/tests/resources/transaction_log_summaries/bandcamp/test_artist_url.txt +++ b/tests/resources/transaction_log_summaries/bandcamp/test_artist_url.txt @@ -2,64 +2,6 @@ Files created: ---------------------------------------- {output_directory} .ytdl-sub-Sithu Aye-download-archive.json -{output_directory}/Sithu Aye/[2021] 10 Years: Remixes and Reimaginings - 01 - Double Helix Reimagined.mp3 - Music Tags: - album: 10 Years: Remixes and Reimaginings - albumartist: Sithu Aye - albumartists: Sithu Aye - artist: Sithu Aye - artists: Sithu Aye - date: 2021-11-26 - genres: Progressive Metal - original_date: 2021-11-26 - title: Double Helix Reimagined - track: 1 - tracktotal: 10 - year: 2021 - 02 - Skye Reimagined.mp3 - Music Tags: - album: 10 Years: Remixes and Reimaginings - albumartist: Sithu Aye - albumartists: Sithu Aye - artist: Sithu Aye - artists: Sithu Aye - date: 2021-11-26 - genres: Progressive Metal - original_date: 2021-11-26 - title: Skye Reimagined - track: 2 - tracktotal: 10 - year: 2021 - 03 - Baryofusion.mp3 - Music Tags: - album: 10 Years: Remixes and Reimaginings - albumartist: Sithu Aye - albumartists: Sithu Aye - artist: Sithu Aye - artists: Sithu Aye - date: 2021-11-26 - genres: Progressive Metal - original_date: 2021-11-26 - title: Baryofusion - track: 3 - tracktotal: 10 - year: 2021 - 04 - Mandalay Reimagined.mp3 - Music Tags: - album: 10 Years: Remixes and Reimaginings - albumartist: Sithu Aye - albumartists: Sithu Aye - artist: Sithu Aye - artists: Sithu Aye - date: 2021-11-26 - genres: Progressive Metal - original_date: 2021-11-26 - title: Mandalay Reimagined - track: 4 - tracktotal: 10 - year: 2021 - folder.jpg {output_directory}/Sithu Aye/[2022] Re:Invent the Universe (10th Anniversary Remaster) 01 - Invent the Universe.mp3 Music Tags: @@ -215,6 +157,62 @@ Files created: original_date: 2024-03-23 title: Run it Down track: 1 - tracktotal: 1 + tracktotal: 5 + year: 2024 + 02 - Zero Sum Groove.mp3 + Music Tags: + album: Kindness + albumartist: Sithu Aye + albumartists: Sithu Aye + artist: Sithu Aye + artists: Sithu Aye + date: 2024-03-23 + genres: Progressive Metal + original_date: 2024-03-23 + title: Zero Sum Groove + track: 2 + tracktotal: 5 + year: 2024 + 03 - Obsidian.mp3 + Music Tags: + album: Kindness + albumartist: Sithu Aye + albumartists: Sithu Aye + artist: Sithu Aye + artists: Sithu Aye + date: 2024-03-23 + genres: Progressive Metal + original_date: 2024-03-23 + title: Obsidian + track: 3 + tracktotal: 5 + year: 2024 + 04 - Fear is the Kindness Killer.mp3 + Music Tags: + album: Kindness + albumartist: Sithu Aye + albumartists: Sithu Aye + artist: Sithu Aye + artists: Sithu Aye + date: 2024-03-23 + genres: Progressive Metal + original_date: 2024-03-23 + title: Fear is the Kindness Killer + track: 4 + tracktotal: 5 + year: 2024 + 05 - Ghost;Cleanse.mp3 + Music Tags: + album: Kindness + albumartist: Sithu Aye + albumartists: Sithu Aye + artist: Sithu Aye + artists: Sithu Aye + date: 2024-03-23 + genres: Progressive Metal + original_date: 2024-03-23 + title: Ghost;Cleanse + track: 5 + tracktotal: 5 year: 2024 folder.jpg \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt b/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt index 007c19b8..cdbbfa60 100644 --- a/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt +++ b/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt @@ -5,6 +5,16 @@ Files created: {output_directory}/JMC Move 78 - Automated Improvisation [Full Album].jpg Move 78 - Automated Improvisation [Full Album].mp4 + Chapters from comments: + 0:00: 01. The Lonely Tears of Lee Seedol + 4:30: 02. But What If We're Wrong + 9:16: 03. Follow the Earworm Pt.2 + 12:25: 04. Keyword Salad + 16:48: 05. Ultra Natural + 20:47: 06. Flight Instructions + 25:46: 07. Dawn of the Useless Class + 29:58: 08. Schnitzel Whisperer + 32:16: 09. Teilo Embedded subtitles with lang(s) en, de Video Tags: album: Music Videos From 30a2ad7a638c84d6b79e77e5162e8d2f92a1f1e4 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 2 Jun 2024 10:53:19 -0700 Subject: [PATCH 7/8] [BUGFIX] Prevent corrupt writes to download archive (#983) Attempts to make writes to the download archive safer (https://github.com/jmbannon/ytdl-sub/issues/982). `ytdl-sub` will now *copy* the download archive from the working directory to the output directory with a temp name, then perform a *move* to store it with its final expected name. This will drastically lower the window of time where the process could die mid-write and corrupt it on the next read. --- .../subscriptions/subscription_download.py | 2 +- .../subscription_ytdl_options.py | 4 +++- src/ytdl_sub/utils/file_handler.py | 6 +++++- .../enhanced_download_archive.py | 20 +++++++++++++++---- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/ytdl_sub/subscriptions/subscription_download.py b/src/ytdl_sub/subscriptions/subscription_download.py index 1655a633..95108ece 100644 --- a/src/ytdl_sub/subscriptions/subscription_download.py +++ b/src/ytdl_sub/subscriptions/subscription_download.py @@ -161,7 +161,7 @@ class SubscriptionDownload(BaseSubscription, ABC): ) self.download_archive.save_download_mappings() - FileHandler.delete(self.download_archive.working_file_path) + FileHandler.delete(self.download_archive.working_ytdl_file_path) @contextlib.contextmanager def _remove_empty_directories_in_output_directory(self): diff --git a/src/ytdl_sub/subscriptions/subscription_ytdl_options.py b/src/ytdl_sub/subscriptions/subscription_ytdl_options.py index 230134db..1cc6f317 100644 --- a/src/ytdl_sub/subscriptions/subscription_ytdl_options.py +++ b/src/ytdl_sub/subscriptions/subscription_ytdl_options.py @@ -89,7 +89,9 @@ class SubscriptionYTDLOptions: ytdl_options = {} if self._preset.output_options.maintain_download_archive: - ytdl_options["download_archive"] = self._enhanced_download_archive.working_file_path + ytdl_options["download_archive"] = ( + self._enhanced_download_archive.working_ytdl_file_path + ) if self._preset.output_options.keep_max_files: keep_max_files = int( self._overrides.apply_formatter(self._preset.output_options.keep_max_files) diff --git a/src/ytdl_sub/utils/file_handler.py b/src/ytdl_sub/utils/file_handler.py index 646d44e1..faa7d2dc 100644 --- a/src/ytdl_sub/utils/file_handler.py +++ b/src/ytdl_sub/utils/file_handler.py @@ -385,7 +385,11 @@ class FileHandler: dst_file_path Destination file """ - shutil.copyfile(src=src_file_path, dst=dst_file_path) + # Perform the copy by first writing to a temp file, then moving it. + # This tries to prevent corrupted writes if the processed dies mid-write, + atomic_dst = f"{dst_file_path}-ytdl-sub-incomplete" + shutil.copyfile(src=src_file_path, dst=atomic_dst) + shutil.move(src=atomic_dst, dst=dst_file_path) @classmethod def move(cls, src_file_path: Union[str, Path], dst_file_path: Union[str, Path]): diff --git a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py index 616fe2f9..ec155245 100644 --- a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +++ b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py @@ -506,10 +506,19 @@ class EnhancedDownloadArchive: """ Returns ------- - The download mapping's file path in the working directory. + The download mapping's file path in the working directory for ytdl usage """ return str(Path(self.working_directory) / self.file_name) + @property + def working_ytdl_file_path(self) -> str: + """ + Returns + ------- + The download mapping's file path in the working directory for ytdl usage + """ + return f"{self.working_file_path}-ytdl-archive" + @property def mapping(self) -> DownloadMappings: """ @@ -541,7 +550,7 @@ class EnhancedDownloadArchive: return self # Otherwise, create a ytdl download archive file in the working directory. - self.mapping.to_download_archive().to_file(self.working_file_path) + self.mapping.to_download_archive().to_file(self.working_ytdl_file_path) return self @@ -603,15 +612,18 @@ class EnhancedDownloadArchive: if self._migrated_file_name: self._download_mapping.to_file(output_json_file=self.working_file_path) self.save_file_to_output_directory( - file_name=self.file_name, output_file_name=self._migrated_file_name + file_name=self.file_name, output_file_name=self._migrated_file_name, copy_file=True ) + FileHandler.delete(file_path=self.working_file_path) + # and delete the old one if the name differs if self._file_name != self._migrated_file_name: self.delete_file_from_output_directory(file_name=self.file_name) # Otherwise, only save if there are changes to the transaction log elif not self.get_file_handler_transaction_log().is_empty: self._download_mapping.to_file(output_json_file=self.working_file_path) - self.save_file_to_output_directory(file_name=self.file_name) + self.save_file_to_output_directory(file_name=self.file_name, copy_file=True) + FileHandler.delete(file_path=self.working_file_path) return self def delete_file_from_output_directory(self, file_name: str): From 6e31ad360032a62e8404ac13252454a7b40e8c2d Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Sun, 2 Jun 2024 10:57:32 -0700 Subject: [PATCH 8/8] [BACKEND] Include .info.json files for Music video presets (#996) Music video presets now include .info.json files by default --- .../prebuilt_presets/music_videos/music_video_base.yaml | 1 + .../plugins/chapters/test_chapters_from_comments.json | 3 ++- .../plugins/file_convert/output.json | 5 +++-- .../plugins/file_convert/output_custom_ffmpeg.json | 3 ++- .../plugins/match_filters/test_match_filters_partial.json | 3 ++- .../plugins/test_chapters_sb_and_embedded_subs.json | 3 ++- .../plugins/test_subtitles_embedded.json | 3 ++- .../plugins/test_subtitles_embedded_and_file.json | 3 ++- .../unit/music_videos/Jellyfin Music Videos.json | 6 +++++- .../unit/music_videos/Kodi Music Videos.json | 6 +++++- .../unit/music_videos/Plex Music Videos.json | 6 +++++- .../expected_downloads_summaries/youtube/test_video.json | 1 + .../youtube/test_video_cli.json | 1 + .../youtube/test_video_missing_thumb.json | 1 + .../plugins/chapters/test_chapters_from_comments.txt | 1 + .../plugins/file_convert/output.txt | 1 + .../plugins/file_convert/output_custom_ffmpeg.txt | 1 + .../plugins/match_filters/test_match_filters_partial.txt | 1 + .../transaction_log_summaries/plugins/nfo_tags/test_nfo.txt | 1 + .../plugins/nfo_tags/test_nfo_kodi_safe.txt | 1 + .../plugins/test_chapters_sb_and_embedded_subs.txt | 1 + .../transaction_log_summaries/plugins/test_regex.txt | 2 ++ .../plugins/test_regex_exclude.txt | 1 + .../plugins/test_regex_match_and_exclude.txt | 1 + .../plugins/test_regex_overrides.txt | 1 + .../plugins/test_subtitles_embedded.txt | 1 + .../plugins/test_subtitles_embedded_and_file.txt | 1 + .../unit/music_videos/Jellyfin Music Videos.txt | 4 ++++ .../unit/music_videos/Kodi Music Videos.txt | 4 ++++ .../unit/music_videos/Plex Music Videos.txt | 4 ++++ .../transaction_log_summaries/youtube/test_video.txt | 1 + .../transaction_log_summaries/youtube/test_video_cli.txt | 1 + .../youtube/test_video_missing_thumb.txt | 1 + 33 files changed, 63 insertions(+), 11 deletions(-) diff --git a/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml b/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml index 9f85dd46..ac810745 100644 --- a/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml +++ b/src/ytdl_sub/prebuilt_presets/music_videos/music_video_base.yaml @@ -7,6 +7,7 @@ presets: output_directory: "{music_video_directory}" file_name: "{music_video_file_name}.{ext}" thumbnail_name: "{music_video_file_name}.jpg" + info_json_name: "{music_video_file_name}.{info_json_ext}" maintain_download_archive: True ytdl_options: 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 fc5ff67b..d7ca529e 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 @@ -1,5 +1,6 @@ { - ".ytdl-sub-chapters_from_comments-download-archive.json": "2510b2ff3c54aa4813a4f23ea079e1ec", + ".ytdl-sub-chapters_from_comments-download-archive.json": "70bc3bb62af3a344b0256e1d3b98dcb0", + "JMC/Move 78 - Automated Improvisation [Full Album].info.json": "INFO_JSON", "JMC/Move 78 - Automated Improvisation [Full Album].jpg": "c12e6a6f242680d1096a1a99d74a62c6", "JMC/Move 78 - Automated Improvisation [Full Album].mp4": "fbe825bf5fb8ce193d47c3da3540e815", "JMC/Move 78 - Automated Improvisation [Full Album].nfo": "039268e97673a6f2b391772ec3b52fac" diff --git a/tests/resources/expected_downloads_summaries/plugins/file_convert/output.json b/tests/resources/expected_downloads_summaries/plugins/file_convert/output.json index 019997af..3d9d244f 100644 --- a/tests/resources/expected_downloads_summaries/plugins/file_convert/output.json +++ b/tests/resources/expected_downloads_summaries/plugins/file_convert/output.json @@ -1,6 +1,7 @@ { - ".ytdl-sub-file_convert_test-download-archive.json": "f720289a704349fbe38ef5ed451af724", + ".ytdl-sub-file_convert_test-download-archive.json": "36ac81b6a021c1479a588477d74afd38", + "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "INFO_JSON", "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg": "662fcaadf6e80d63591bac19a5fdffb0", - "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4": "24f5057254471bc6ecc3056e91af1444", + "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4": "7609c4f53565aa8f9eac50ad755b5c47", "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.nfo": "752e6b6eea853c8a1f62faa4b841b292" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/plugins/file_convert/output_custom_ffmpeg.json b/tests/resources/expected_downloads_summaries/plugins/file_convert/output_custom_ffmpeg.json index 361a6c30..b82a93ce 100644 --- a/tests/resources/expected_downloads_summaries/plugins/file_convert/output_custom_ffmpeg.json +++ b/tests/resources/expected_downloads_summaries/plugins/file_convert/output_custom_ffmpeg.json @@ -1,5 +1,6 @@ { - ".ytdl-sub-file_convert_test-download-archive.json": "8fa4bf42c9686f8520ce107e48b73215", + ".ytdl-sub-file_convert_test-download-archive.json": "83e57376a260ab3a58978dee4a06df4a", + "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json": "INFO_JSON", "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg": "662fcaadf6e80d63591bac19a5fdffb0", "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mkv": "175320a51dc3efcea84daebec3c1d7e1", "file_convert_test/When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.nfo": "752e6b6eea853c8a1f62faa4b841b292" diff --git a/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json b/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json index 31e5109d..3eeb24ed 100644 --- a/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json +++ b/tests/resources/expected_downloads_summaries/plugins/match_filters/test_match_filters_partial.json @@ -1,5 +1,6 @@ { - ".ytdl-sub-match_filter_test-download-archive.json": "30f10646149d9eea4eb970749f352f7d", + ".ytdl-sub-match_filter_test-download-archive.json": "c2154694d771b47e7878622851b379b7", + "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].info.json": "INFO_JSON", "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].jpg": "e7830aa8a64b0cde65ba3f7e5fc56530", "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].mp4": "a0dc417dbf369c47bbac571bdb18e0e4", "match_filter_test/Jesse's Minecraft Server [Trailer - Mar.21].nfo": "d85f4500bb5d8a2425d734a23b5a944c" diff --git a/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json b/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json index 8c0c2b41..675ae0ec 100644 --- a/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json +++ b/tests/resources/expected_downloads_summaries/plugins/test_chapters_sb_and_embedded_subs.json @@ -1,5 +1,6 @@ { - ".ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json": "2cb4b9586fd5bb7f1fed76ed9195e6e4", + ".ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json": "53eda1f626aaec8814ff005bf8d46ef7", + "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.info.json": "INFO_JSON", "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.jpg": "b5353a824a4800cc26f884e3025ed969", "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4": "19889ac778397147e55fe640c9a0f490", "JMC/This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.nfo": "ae73ec18a9f0e5a54c90061ccd32e7f4" diff --git a/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded.json b/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded.json index 74a88813..b219d9fd 100644 --- a/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded.json +++ b/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded.json @@ -1,5 +1,6 @@ { - ".ytdl-sub-subtitles_embedded_test-download-archive.json": "a74ecea9f7844be23f470bbe702788f3", + ".ytdl-sub-subtitles_embedded_test-download-archive.json": "538f36d011bb6077de044263d511a45b", + "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json": "INFO_JSON", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.jpg": "50ee47c80f679029f5d3503bb91b045a", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.mp4": "f90f3bb948014420931c337b09007a18", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.nfo": "e6ac56ce52c747e2e271f12208f9a538" diff --git a/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded_and_file.json b/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded_and_file.json index 7c4baeb6..4c288220 100644 --- a/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded_and_file.json +++ b/tests/resources/expected_downloads_summaries/plugins/test_subtitles_embedded_and_file.json @@ -1,7 +1,8 @@ { - ".ytdl-sub-subtitles_embedded_and_file_test-download-archive.json": "a05bbc3b8851e92da10c67cd9acb32d0", + ".ytdl-sub-subtitles_embedded_and_file_test-download-archive.json": "470a4652395e01c970aaa40fe8fcea6c", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.de.srt": "b343c3bb9257b7ee7ba38f570a115b37", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.en.srt": "fe8c6ee92cae6e059fd80fd61691adbe", + "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json": "INFO_JSON", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.jpg": "50ee47c80f679029f5d3503bb91b045a", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.mp4": "f90f3bb948014420931c337b09007a18", "JMC/YouTube Rewind 2019: For the Record | #YouTubeRewind.nfo": "e6ac56ce52c747e2e271f12208f9a538" 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 60381877..72e4fbce 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 @@ -1,14 +1,18 @@ { - ".ytdl-sub-subscription_test-download-archive.json": "d9f5fdb6fc3fc3c3bf87772c406448ec", + ".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.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.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.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.nfo": "dc714fd9f3c3729f74927ad245b50d9d" 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 60381877..72e4fbce 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 @@ -1,14 +1,18 @@ { - ".ytdl-sub-subscription_test-download-archive.json": "d9f5fdb6fc3fc3c3bf87772c406448ec", + ".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.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.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.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.nfo": "dc714fd9f3c3729f74927ad245b50d9d" 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 b2bc1dda..78727e67 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 @@ -1,11 +1,15 @@ { - ".ytdl-sub-subscription_test-download-archive.json": "7d31b00238ca1f66c5e7f4735ca7aa87", + ".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-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-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 21-1.info.json": "INFO_JSON", "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", "subscription_test/Mock Entry 21-1.mp4": "079832b6e49b283d80be402c9c928b90" } \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/youtube/test_video.json b/tests/resources/expected_downloads_summaries/youtube/test_video.json index dd69c218..f4690775 100644 --- a/tests/resources/expected_downloads_summaries/youtube/test_video.json +++ b/tests/resources/expected_downloads_summaries/youtube/test_video.json @@ -1,4 +1,5 @@ { + "JMC/Oblivion Mod "Falcor" p.1.info.json": "INFO_JSON", "JMC/Oblivion Mod "Falcor" p.1.jpg": "fb95b510681676e81c321171fc23143e", "JMC/Oblivion Mod "Falcor" p.1.mp4": "318faf3eb1d7666491553cdfd2a2e9fb", "JMC/Oblivion Mod "Falcor" p.1.nfo": "58c2be339869b5d071c1758d55c72ddb" diff --git a/tests/resources/expected_downloads_summaries/youtube/test_video_cli.json b/tests/resources/expected_downloads_summaries/youtube/test_video_cli.json index dd69c218..f4690775 100644 --- a/tests/resources/expected_downloads_summaries/youtube/test_video_cli.json +++ b/tests/resources/expected_downloads_summaries/youtube/test_video_cli.json @@ -1,4 +1,5 @@ { + "JMC/Oblivion Mod "Falcor" p.1.info.json": "INFO_JSON", "JMC/Oblivion Mod "Falcor" p.1.jpg": "fb95b510681676e81c321171fc23143e", "JMC/Oblivion Mod "Falcor" p.1.mp4": "318faf3eb1d7666491553cdfd2a2e9fb", "JMC/Oblivion Mod "Falcor" p.1.nfo": "58c2be339869b5d071c1758d55c72ddb" diff --git a/tests/resources/expected_downloads_summaries/youtube/test_video_missing_thumb.json b/tests/resources/expected_downloads_summaries/youtube/test_video_missing_thumb.json index bf1811b0..b1eec149 100644 --- a/tests/resources/expected_downloads_summaries/youtube/test_video_missing_thumb.json +++ b/tests/resources/expected_downloads_summaries/youtube/test_video_missing_thumb.json @@ -1,4 +1,5 @@ { + "JMC/Oblivion Mod "Falcor" p.1.info.json": "INFO_JSON", "JMC/Oblivion Mod "Falcor" p.1.mp4": "d3bdda5ec6822ea3b4b4bd8908eb327a", "JMC/Oblivion Mod "Falcor" p.1.nfo": "58c2be339869b5d071c1758d55c72ddb" } \ No newline at end of file diff --git a/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt b/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt index cdbbfa60..40f060d6 100644 --- a/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt +++ b/tests/resources/transaction_log_summaries/plugins/chapters/test_chapters_from_comments.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-chapters_from_comments-download-archive.json {output_directory}/JMC + Move 78 - Automated Improvisation [Full Album].info.json Move 78 - Automated Improvisation [Full Album].jpg Move 78 - Automated Improvisation [Full Album].mp4 Chapters from comments: diff --git a/tests/resources/transaction_log_summaries/plugins/file_convert/output.txt b/tests/resources/transaction_log_summaries/plugins/file_convert/output.txt index e5550820..6f9d3c13 100644 --- a/tests/resources/transaction_log_summaries/plugins/file_convert/output.txt +++ b/tests/resources/transaction_log_summaries/plugins/file_convert/output.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-file_convert_test-download-archive.json {output_directory}/file_convert_test + When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/file_convert/output_custom_ffmpeg.txt b/tests/resources/transaction_log_summaries/plugins/file_convert/output_custom_ffmpeg.txt index d42cf277..4b82d0b4 100644 --- a/tests/resources/transaction_log_summaries/plugins/file_convert/output_custom_ffmpeg.txt +++ b/tests/resources/transaction_log_summaries/plugins/file_convert/output_custom_ffmpeg.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-file_convert_test-download-archive.json {output_directory}/file_convert_test + When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.info.json When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.jpg When you hear Hugh Jackman is returning as Wolverine in Deadpool 3.mkv Converted from mp4 diff --git a/tests/resources/transaction_log_summaries/plugins/match_filters/test_match_filters_partial.txt b/tests/resources/transaction_log_summaries/plugins/match_filters/test_match_filters_partial.txt index 89645782..74b7e886 100644 --- a/tests/resources/transaction_log_summaries/plugins/match_filters/test_match_filters_partial.txt +++ b/tests/resources/transaction_log_summaries/plugins/match_filters/test_match_filters_partial.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-match_filter_test-download-archive.json {output_directory}/match_filter_test + Jesse's Minecraft Server [Trailer - Mar.21].info.json Jesse's Minecraft Server [Trailer - Mar.21].jpg Jesse's Minecraft Server [Trailer - Mar.21].mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo.txt b/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo.txt index 268f1451..7db40b0e 100644 --- a/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo.txt +++ b/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo.txt @@ -35,6 +35,7 @@ Files created: the tag 🎸🎸 {output_directory}/kodi_safe_xml + Can you hear the difference? 🎸🔥 #shorts.info.json Can you hear the difference? 🎸🔥 #shorts.jpg Can you hear the difference? 🎸🔥 #shorts.mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo_kodi_safe.txt b/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo_kodi_safe.txt index 12d167e5..7438981f 100644 --- a/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo_kodi_safe.txt +++ b/tests/resources/transaction_log_summaries/plugins/nfo_tags/test_nfo_kodi_safe.txt @@ -35,6 +35,7 @@ Files created: the tag □□ {output_directory}/kodi_safe_xml + Can you hear the difference? 🎸🔥 #shorts.info.json Can you hear the difference? 🎸🔥 #shorts.jpg Can you hear the difference? 🎸🔥 #shorts.mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/test_chapters_sb_and_embedded_subs.txt b/tests/resources/transaction_log_summaries/plugins/test_chapters_sb_and_embedded_subs.txt index 8aa485cd..8315936f 100644 --- a/tests/resources/transaction_log_summaries/plugins/test_chapters_sb_and_embedded_subs.txt +++ b/tests/resources/transaction_log_summaries/plugins/test_chapters_sb_and_embedded_subs.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-sponsorblock_with_embedded_subs_test-download-archive.json {output_directory}/JMC + This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.info.json This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.jpg This GPU SLIDES into this Case! - Silverstone SUGO 16 ITX Case.mp4 Embedded Chapters: diff --git a/tests/resources/transaction_log_summaries/plugins/test_regex.txt b/tests/resources/transaction_log_summaries/plugins/test_regex.txt index 3ec6c7c9..02113654 100644 --- a/tests/resources/transaction_log_summaries/plugins/test_regex.txt +++ b/tests/resources/transaction_log_summaries/plugins/test_regex.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-regex_capture_playlist_test-download-archive.json {output_directory}/regex_capture_playlist_test + Jesse's Minecraft Server [Trailer - Feb.1].info.json Jesse's Minecraft Server [Trailer - Feb.1].jpg Jesse's Minecraft Server [Trailer - Feb.1].mp4 Video Tags: @@ -27,6 +28,7 @@ Files created: title_cap_1_sanitized: Trailer title_cap_2: Feb.1 upload_date_both_caps: First and Second containing in regex default + Jesse's Minecraft Server [Trailer - Feb.27].info.json Jesse's Minecraft Server [Trailer - Feb.27].jpg Jesse's Minecraft Server [Trailer - Feb.27].mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/test_regex_exclude.txt b/tests/resources/transaction_log_summaries/plugins/test_regex_exclude.txt index 7bdf2485..6ea8e91a 100644 --- a/tests/resources/transaction_log_summaries/plugins/test_regex_exclude.txt +++ b/tests/resources/transaction_log_summaries/plugins/test_regex_exclude.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-regex_exclude_playlist_test-download-archive.json {output_directory}/regex_exclude_playlist_test + Jesse's Minecraft Server [Trailer - Mar.21].info.json Jesse's Minecraft Server [Trailer - Mar.21].jpg Jesse's Minecraft Server [Trailer - Mar.21].mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/test_regex_match_and_exclude.txt b/tests/resources/transaction_log_summaries/plugins/test_regex_match_and_exclude.txt index 74f9b7c9..683f6dfd 100644 --- a/tests/resources/transaction_log_summaries/plugins/test_regex_match_and_exclude.txt +++ b/tests/resources/transaction_log_summaries/plugins/test_regex_match_and_exclude.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-regex_match_and_exclude_playlist_test-download-archive.json {output_directory}/regex_match_and_exclude_playlist_test + Jesse's Minecraft Server [Trailer - Feb.1].info.json Jesse's Minecraft Server [Trailer - Feb.1].jpg Jesse's Minecraft Server [Trailer - Feb.1].mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/test_regex_overrides.txt b/tests/resources/transaction_log_summaries/plugins/test_regex_overrides.txt index f8444df7..82c0644a 100644 --- a/tests/resources/transaction_log_summaries/plugins/test_regex_overrides.txt +++ b/tests/resources/transaction_log_summaries/plugins/test_regex_overrides.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-regex_using_overrides_test-download-archive.json {output_directory}/regex_using_overrides_test + Jesse's Minecraft Server [Trailer - Mar.21].info.json Jesse's Minecraft Server [Trailer - Mar.21].jpg Jesse's Minecraft Server [Trailer - Mar.21].mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded.txt b/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded.txt index c4b02af2..8831a18c 100644 --- a/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded.txt +++ b/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded.txt @@ -3,6 +3,7 @@ Files created: {output_directory} .ytdl-sub-subtitles_embedded_test-download-archive.json {output_directory}/JMC + YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json YouTube Rewind 2019: For the Record | #YouTubeRewind.jpg YouTube Rewind 2019: For the Record | #YouTubeRewind.mp4 Embedded subtitles with lang(s) en, de diff --git a/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded_and_file.txt b/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded_and_file.txt index c466b11f..3d2996df 100644 --- a/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded_and_file.txt +++ b/tests/resources/transaction_log_summaries/plugins/test_subtitles_embedded_and_file.txt @@ -5,6 +5,7 @@ Files created: {output_directory}/JMC YouTube Rewind 2019: For the Record | #YouTubeRewind.de.srt YouTube Rewind 2019: For the Record | #YouTubeRewind.en.srt + YouTube Rewind 2019: For the Record | #YouTubeRewind.info.json YouTube Rewind 2019: For the Record | #YouTubeRewind.jpg YouTube Rewind 2019: For the Record | #YouTubeRewind.mp4 Embedded subtitles with lang(s) en, de diff --git a/tests/resources/transaction_log_summaries/unit/music_videos/Jellyfin Music Videos.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Jellyfin Music Videos.txt index b1440018..52e2c27d 100644 --- a/tests/resources/transaction_log_summaries/unit/music_videos/Jellyfin Music Videos.txt +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Jellyfin Music Videos.txt @@ -3,6 +3,7 @@ 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: @@ -20,6 +21,7 @@ Files created: 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: @@ -37,6 +39,7 @@ Files created: 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: @@ -54,6 +57,7 @@ Files created: 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: diff --git a/tests/resources/transaction_log_summaries/unit/music_videos/Kodi Music Videos.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Kodi Music Videos.txt index b1440018..52e2c27d 100644 --- a/tests/resources/transaction_log_summaries/unit/music_videos/Kodi Music Videos.txt +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Kodi Music Videos.txt @@ -3,6 +3,7 @@ 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: @@ -20,6 +21,7 @@ Files created: 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: @@ -37,6 +39,7 @@ Files created: 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: @@ -54,6 +57,7 @@ Files created: 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: diff --git a/tests/resources/transaction_log_summaries/unit/music_videos/Plex Music Videos.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Plex Music Videos.txt index 32813f22..520d916d 100644 --- a/tests/resources/transaction_log_summaries/unit/music_videos/Plex Music Videos.txt +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Plex Music Videos.txt @@ -3,6 +3,7 @@ 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: @@ -12,6 +13,7 @@ Files created: premiered: 2020-08-08 title: Mock Entry 20-1 year: 2020 + Mock Entry 20-2.info.json Mock Entry 20-2.jpg Mock Entry 20-2.mp4 Video Tags: @@ -21,6 +23,7 @@ Files created: premiered: 2020-08-08 title: Mock Entry 20-2 year: 2020 + Mock Entry 20-3.info.json Mock Entry 20-3.jpg Mock Entry 20-3.mp4 Video Tags: @@ -30,6 +33,7 @@ Files created: premiered: 2020-08-07 title: Mock Entry 20-3 year: 2020 + Mock Entry 21-1.info.json Mock Entry 21-1.jpg Mock Entry 21-1.mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/youtube/test_video.txt b/tests/resources/transaction_log_summaries/youtube/test_video.txt index 48cb51eb..97392956 100644 --- a/tests/resources/transaction_log_summaries/youtube/test_video.txt +++ b/tests/resources/transaction_log_summaries/youtube/test_video.txt @@ -1,6 +1,7 @@ Files created: ---------------------------------------- {output_directory}/JMC + Oblivion Mod "Falcor" p.1.info.json Oblivion Mod "Falcor" p.1.jpg Oblivion Mod "Falcor" p.1.mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/youtube/test_video_cli.txt b/tests/resources/transaction_log_summaries/youtube/test_video_cli.txt index 48cb51eb..97392956 100644 --- a/tests/resources/transaction_log_summaries/youtube/test_video_cli.txt +++ b/tests/resources/transaction_log_summaries/youtube/test_video_cli.txt @@ -1,6 +1,7 @@ Files created: ---------------------------------------- {output_directory}/JMC + Oblivion Mod "Falcor" p.1.info.json Oblivion Mod "Falcor" p.1.jpg Oblivion Mod "Falcor" p.1.mp4 Video Tags: diff --git a/tests/resources/transaction_log_summaries/youtube/test_video_missing_thumb.txt b/tests/resources/transaction_log_summaries/youtube/test_video_missing_thumb.txt index 2c196a39..ccd7b91c 100644 --- a/tests/resources/transaction_log_summaries/youtube/test_video_missing_thumb.txt +++ b/tests/resources/transaction_log_summaries/youtube/test_video_missing_thumb.txt @@ -1,6 +1,7 @@ Files created: ---------------------------------------- {output_directory}/JMC + Oblivion Mod "Falcor" p.1.info.json Oblivion Mod "Falcor" p.1.mp4 Video Tags: album: Music Videos