diff --git a/src/ytdl_sub/prebuilt_presets/helpers/players.yaml b/src/ytdl_sub/prebuilt_presets/helpers/players.yaml index a0d62694..a83fb213 100644 --- a/src/ytdl_sub/prebuilt_presets/helpers/players.yaml +++ b/src/ytdl_sub/prebuilt_presets/helpers/players.yaml @@ -19,3 +19,8 @@ presets: overrides: file_uid: "{uid_sanitized_plex}" file_title: "{title_sanitized_plex}" + + _plex_video_base: + preset: + - "_plex_base" + format: "(bv*[ext=mp4][vcodec~='^((he|a)vc|h26[45])']+ba[ext=m4a]) / (bv[ext=mp4]*+ba[ext=m4a]/b)" \ No newline at end of file diff --git a/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py b/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py new file mode 100644 index 00000000..35a9b013 --- /dev/null +++ b/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py @@ -0,0 +1,9 @@ +from ytdl_sub.prebuilt_presets import PrebuiltPresets + + +class MusicVideoPresets(PrebuiltPresets): + preset_names = { + "Kodi Music Videos", + "Jellyfin Music Videos", + "Plex Music Videos", + } diff --git a/src/ytdl_sub/prebuilt_presets/music_videos/kodi_music_videos.yaml b/src/ytdl_sub/prebuilt_presets/music_videos/kodi_music_videos.yaml deleted file mode 100644 index 9de23e5c..00000000 --- a/src/ytdl_sub/prebuilt_presets/music_videos/kodi_music_videos.yaml +++ /dev/null @@ -1,29 +0,0 @@ -presets: - # TODO: Update this - kodi_music_video: - download: - - "{music_video_url}" - - output_options: - output_directory: "{music_video_directory}" - file_name: "{music_video_file_name}.{ext}" - thumbnail_name: "{music_video_file_name}-thumb.jpg" - - nfo_tags: - nfo_name: "{music_video_name}.nfo" - nfo_root: "musicvideo" - kodi_safe: True - tags: - artist: "{music_video_artist}" - title: "{music_video_title}" - album: "{music_video_album}" - year: "{music_video_year}" - - overrides: -# MUST DEFINE: -# music_video_artist -# music_video_directory - music_video_title: "{title}" - music_video_album: "Music Videos" - music_video_year: "{upload_year}" - music_video_file_name: "{artist_sanitized}/{music_video_year} - {music_video_title_sanitized}" diff --git a/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml b/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml new file mode 100644 index 00000000..641fcfef --- /dev/null +++ b/src/ytdl_sub/prebuilt_presets/music_videos/music_videos.yaml @@ -0,0 +1,71 @@ +presets: + _music_video_base: + download: + - "{url}" + + output_options: + output_directory: "{music_video_directory}" + file_name: "{music_video_file_name}.{ext}" + thumbnail_name: "{music_video_file_name}.jpg" + + overrides: +# MUST DEFINE: +# music_video_directory + + # Defaults + music_video_genre_default: "ytdl-sub" + music_video_album_default: "Music Videos" + + # Subscription overrides + subscription_indent_1: "{music_video_genre_default}" + url: "{subscription_value}" + + # Music Video Overrides + music_video_title: "{title}" + music_video_album: "{music_video_album_default}" + music_video_artist: "{subscription_name}" + music_video_year: "{upload_year}" + music_video_date: "{upload_date_standardized}" + music_video_genre: "{subscription_indent_1}" + + # Directory Overrides + music_video_file_name: "{music_video_artist_sanitized}/{music_video_title_sanitized}" + + _music_video_nfo: + nfo_tags: + nfo_name: "{music_video_file_name}.nfo" + nfo_root: "musicvideo" + tags: + artist: "{music_video_artist}" + title: "{music_video_title}" + album: "{music_video_album}" + # Kodi v20 to not use year, so removing + premiered: "{music_video_date}" + + _music_video_tags: + video_tags: + artist: "{music_video_artist}" + title: "{music_video_title}" + album: "{music_video_album}" + year: "{music_video_year}" + premiered: "{music_video_date}" + + "Jellyfin Music Videos": + preset: + - "_base" + - "_music_video_base" + - "_music_video_nfo" + - "_music_video_tags" + + "Kodi Music Videos": + preset: + - "_kodi_base" + - "_music_video_base" + - "_music_video_nfo" + - "_music_video_tags" + + "Plex Music Videos": + preset: + - "_plex_video_base" + - "_music_video_base" + - "_music_video_tags" \ No newline at end of file diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml index 09e3cfe7..b64ed080 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml +++ b/src/ytdl_sub/prebuilt_presets/tv_show/tv_show.yaml @@ -3,10 +3,9 @@ presets: _plex_tv_show: # Default Highest Resolution, No AV1, which is not currently supported by plex preset: - - "_plex_base" + - "_plex_video_base" - "_episode_base" - "_episode_video_tags" - format: "(bv*[ext=mp4][vcodec~='^((he|a)vc|h26[45])']+ba[ext=m4a]) / (bv[ext=mp4]*+ba[ext=m4a]/b)" overrides: tv_show_poster_file_name: "poster.jpg" tv_show_fanart_file_name: "fanart.jpg" 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 new file mode 100644 index 00000000..7a8264e1 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Jellyfin Music Videos.json @@ -0,0 +1,14 @@ +{ + "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-1.mp4": "5404e6d81e626fd47acce084205f00e5", + "subscription_test/Mock Entry 20-1.nfo": "7541e471c3ace8c8f2c943df8fe906cf", + "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-2.mp4": "a4468591d27db0138c3e268eb680f3fc", + "subscription_test/Mock Entry 20-2.nfo": "6053acb34368b91b3c794d082b3e5fe1", + "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-3.mp4": "9402798c0344f17f4312c022f5ff720f", + "subscription_test/Mock Entry 20-3.nfo": "a0f78a99335d2f53d379ca4ec0e492eb", + "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 21-1.mp4": "d937ef9c52386799115f66f74df2a89e", + "subscription_test/Mock Entry 21-1.nfo": "dc2dfb1c6e33679221a52bb37b8adf1c" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos.json new file mode 100644 index 00000000..7a8264e1 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Kodi Music Videos.json @@ -0,0 +1,14 @@ +{ + "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-1.mp4": "5404e6d81e626fd47acce084205f00e5", + "subscription_test/Mock Entry 20-1.nfo": "7541e471c3ace8c8f2c943df8fe906cf", + "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-2.mp4": "a4468591d27db0138c3e268eb680f3fc", + "subscription_test/Mock Entry 20-2.nfo": "6053acb34368b91b3c794d082b3e5fe1", + "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-3.mp4": "9402798c0344f17f4312c022f5ff720f", + "subscription_test/Mock Entry 20-3.nfo": "a0f78a99335d2f53d379ca4ec0e492eb", + "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 21-1.mp4": "d937ef9c52386799115f66f74df2a89e", + "subscription_test/Mock Entry 21-1.nfo": "dc2dfb1c6e33679221a52bb37b8adf1c" +} \ No newline at end of file diff --git a/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos.json b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos.json new file mode 100644 index 00000000..6ff8c9d7 --- /dev/null +++ b/tests/resources/expected_downloads_summaries/unit/music_videos/Plex Music Videos.json @@ -0,0 +1,10 @@ +{ + "subscription_test/Mock Entry 20-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-1.mp4": "5404e6d81e626fd47acce084205f00e5", + "subscription_test/Mock Entry 20-2.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-2.mp4": "a4468591d27db0138c3e268eb680f3fc", + "subscription_test/Mock Entry 20-3.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 20-3.mp4": "9402798c0344f17f4312c022f5ff720f", + "subscription_test/Mock Entry 21-1.jpg": "e80c508c4818454300133fe1dc1a9cd7", + "subscription_test/Mock Entry 21-1.mp4": "d937ef9c52386799115f66f74df2a89e" +} \ No newline at end of file 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 new file mode 100644 index 00000000..9e772b4f --- /dev/null +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Jellyfin Music Videos.txt @@ -0,0 +1,63 @@ +Files created: +---------------------------------------- +{output_directory}/subscription_test + Mock Entry 20-1.jpg + Mock Entry 20-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + premiered: 2020-08-08 + title: Mock Entry 20-1 + Mock Entry 20-2.jpg + Mock Entry 20-2.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + premiered: 2020-08-08 + title: Mock Entry 20-2 + Mock Entry 20-3.jpg + Mock Entry 20-3.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + premiered: 2020-08-07 + title: Mock Entry 20-3 + Mock Entry 21-1.jpg + Mock Entry 21-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + 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/Kodi Music Videos.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Kodi Music Videos.txt new file mode 100644 index 00000000..9e772b4f --- /dev/null +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Kodi Music Videos.txt @@ -0,0 +1,63 @@ +Files created: +---------------------------------------- +{output_directory}/subscription_test + Mock Entry 20-1.jpg + Mock Entry 20-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + premiered: 2020-08-08 + title: Mock Entry 20-1 + Mock Entry 20-2.jpg + Mock Entry 20-2.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + premiered: 2020-08-08 + title: Mock Entry 20-2 + Mock Entry 20-3.jpg + Mock Entry 20-3.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + premiered: 2020-08-07 + title: Mock Entry 20-3 + Mock Entry 21-1.jpg + Mock Entry 21-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + 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 + 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/Plex Music Videos.txt b/tests/resources/transaction_log_summaries/unit/music_videos/Plex Music Videos.txt new file mode 100644 index 00000000..0a948aec --- /dev/null +++ b/tests/resources/transaction_log_summaries/unit/music_videos/Plex Music Videos.txt @@ -0,0 +1,35 @@ +Files created: +---------------------------------------- +{output_directory}/subscription_test + Mock Entry 20-1.jpg + Mock Entry 20-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + premiered: 2020-08-08 + title: Mock Entry 20-1 + year: 2020 + Mock Entry 20-2.jpg + Mock Entry 20-2.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + premiered: 2020-08-08 + title: Mock Entry 20-2 + year: 2020 + Mock Entry 20-3.jpg + Mock Entry 20-3.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + premiered: 2020-08-07 + title: Mock Entry 20-3 + year: 2020 + Mock Entry 21-1.jpg + Mock Entry 21-1.mp4 + Video Tags: + album: Music Videos + artist: subscription_test + premiered: 2021-08-08 + title: Mock Entry 21-1 + year: 2021 \ No newline at end of file diff --git a/tests/unit/prebuilt_presets/test_prebuilt_presets.py b/tests/unit/prebuilt_presets/test_prebuilt_presets.py index 03225dca..155f7cc8 100644 --- a/tests/unit/prebuilt_presets/test_prebuilt_presets.py +++ b/tests/unit/prebuilt_presets/test_prebuilt_presets.py @@ -7,6 +7,7 @@ from expected_download import assert_expected_downloads from expected_transaction_log import assert_transaction_log_matches from ytdl_sub.prebuilt_presets.music import MusicPresets +from ytdl_sub.prebuilt_presets.music_videos import MusicVideoPresets from ytdl_sub.prebuilt_presets.tv_show import TvShowByDateEpisodeFormattingPresets from ytdl_sub.prebuilt_presets.tv_show import TvShowByDatePresets from ytdl_sub.prebuilt_presets.tv_show import TvShowCollectionEpisodeFormattingPresets @@ -411,3 +412,67 @@ class TestPrebuiltMusicPresets: dry_run=False, expected_download_summary_file_name=f"{expected_summary_name}.json", ) + + +@pytest.mark.parametrize("music_video_preset", MusicVideoPresets.preset_names) +class TestPrebuiltMusicVideoPresets: + def test_compilation( + self, + config, + music_video_preset: str, + ): + _ = Subscription.from_dict( + config=config, + preset_name="preset_test", + preset_dict={ + "preset": [ + music_video_preset, + ], + "overrides": { + "music_video_directory": "/music_videos", + "subscription_value": "https://your.name.here", + }, + }, + ) + + def test_presets_run( + self, + config, + subscription_name, + output_directory, + mock_download_collection_entries, + music_video_preset: str, + ): + expected_summary_name = f"unit/music_videos/{music_video_preset}" + + preset_dict = { + "preset": [ + music_video_preset, + ], + "overrides": { + "url": "https://your.name.here", + "music_video_directory": output_directory, + }, + } + + subscription = Subscription.from_dict( + config=config, + preset_name=subscription_name, + preset_dict=preset_dict, + ) + + with mock_download_collection_entries( + is_youtube_channel=False, num_urls=1, is_extracted_audio=False + ): + transaction_log = subscription.download(dry_run=False) + + assert_transaction_log_matches( + output_directory=output_directory, + transaction_log=transaction_log, + transaction_log_summary_file_name=f"{expected_summary_name}.txt", + ) + assert_expected_downloads( + output_directory=output_directory, + dry_run=False, + expected_download_summary_file_name=f"{expected_summary_name}.json", + )