music video test, need to update no config
This commit is contained in:
parent
abbf9d2068
commit
ed27c84853
12 changed files with 71 additions and 124 deletions
|
|
@ -10,7 +10,7 @@
|
||||||
# 02 - Another Track.mp3
|
# 02 - Another Track.mp3
|
||||||
# folder.jpg
|
# folder.jpg
|
||||||
|
|
||||||
# Overrides to the prebuilt presets
|
# Override variables globally for all subscriptions
|
||||||
__preset__:
|
__preset__:
|
||||||
overrides:
|
overrides:
|
||||||
music_directory: "/music"
|
music_directory: "/music"
|
||||||
|
|
|
||||||
25
examples/music_video_subscriptions.yaml
Normal file
25
examples/music_video_subscriptions.yaml
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Files will be stored in the form of:
|
||||||
|
#
|
||||||
|
# music_videos/
|
||||||
|
# Elton John/
|
||||||
|
# Elton John - Rocketman.jpg
|
||||||
|
# Elton John - Rocketman.mp4
|
||||||
|
# System of a Down/
|
||||||
|
# System of a Down - Chop Suey.jpg
|
||||||
|
# System of a Down - Chop Suey.mp4
|
||||||
|
# ...
|
||||||
|
|
||||||
|
# Override variables globally for all subscriptions
|
||||||
|
__preset__:
|
||||||
|
overrides:
|
||||||
|
music_video_directory: "/music_videos"
|
||||||
|
|
||||||
|
# Choose between Jellyfin/Kodi/Plex Music Videos
|
||||||
|
# "Jellyfin Music Videos":
|
||||||
|
# "Kodi Music Videos":
|
||||||
|
"Plex Music Videos":
|
||||||
|
= Pop: # Sets genre tag to "Pop"
|
||||||
|
"Rick Astley": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc"
|
||||||
|
"Michael Jackson": "https://www.youtube.com/playlist?list=OLAK5uy_mnY03zP6abNWH929q2XhGzWD_2uKJ_n8E"
|
||||||
|
= Blues:
|
||||||
|
"Eric Clapton": "https://www.youtube.com/playlist?list=PLABGggHhsbEeaRtdzqnxYoEINsJE_4GF4"
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
# This example shows how to download and format a music video OR playlist
|
|
||||||
# of music videos to display in Kodi as a music video. The format will
|
|
||||||
# look like:
|
|
||||||
#
|
|
||||||
# /path/to/Music Videos
|
|
||||||
# Elton John/
|
|
||||||
# Elton John - Rocketman-thumb.jpg
|
|
||||||
# Elton John - Rocketman.mp4
|
|
||||||
# Elton John - Rocketman.nfo
|
|
||||||
# System of a Down/
|
|
||||||
# System of a Down - Chop Suey-thumb.jpg
|
|
||||||
# System of a Down - Chop Suey.mp4
|
|
||||||
# System of a Down - Chop Suey.nfo
|
|
||||||
# ...
|
|
||||||
#
|
|
||||||
configuration:
|
|
||||||
working_directory: '.ytdl-sub-downloads'
|
|
||||||
|
|
||||||
presets:
|
|
||||||
music_video:
|
|
||||||
# We will only use a single URL to download music video(s).
|
|
||||||
# Make {url} an override variable to set later.
|
|
||||||
download:
|
|
||||||
- "{url}"
|
|
||||||
|
|
||||||
# For advanced YTDL users only; any YTDL parameter can be set here.
|
|
||||||
# To download age-restricted videos, you will need to set your cookie
|
|
||||||
# file here as a ytdl parameter. For more info, see
|
|
||||||
# https://ytdl-sub.readthedocs.io/en/latest/faq.html#download-age-restricted-youtube-videos
|
|
||||||
ytdl_options:
|
|
||||||
# cookiefile: "path/to/cookie_file.txt
|
|
||||||
break_on_existing: True # Stop downloads if it already exists
|
|
||||||
|
|
||||||
# For each video downloaded, set the file and thumbnail name here.
|
|
||||||
# We set both with {music_video_name}, which is a variable we define in
|
|
||||||
# the overrides section further below to represent consistent naming format.
|
|
||||||
output_options:
|
|
||||||
output_directory: "{music_video_directory}"
|
|
||||||
file_name: "{music_video_name}.{ext}"
|
|
||||||
thumbnail_name: "{music_video_name}-thumb.jpg"
|
|
||||||
info_json_name: "{music_video_name}.{info_json_ext}"
|
|
||||||
maintain_download_archive: True
|
|
||||||
|
|
||||||
# For each video downloaded, add a music video NFO file for it. Populate it
|
|
||||||
# with tags that Kodi will read and use to display it in the music or music
|
|
||||||
# videos section.
|
|
||||||
nfo_tags:
|
|
||||||
nfo_name: "{music_video_name}.nfo"
|
|
||||||
nfo_root: "musicvideo"
|
|
||||||
tags:
|
|
||||||
artist: "{artist}"
|
|
||||||
title: "{title}"
|
|
||||||
album: "Music Videos"
|
|
||||||
year: "{upload_year}"
|
|
||||||
|
|
||||||
# Overrides is a section where we can define our own variables, and use them in
|
|
||||||
# any other section. We define our music video directory and episode file name
|
|
||||||
# here, which gets reused above for the video, thumbnail, and NFO file.
|
|
||||||
# Recommended to override the artist variable since {channel} is not always
|
|
||||||
# the artist's exact name.
|
|
||||||
overrides:
|
|
||||||
music_video_directory: "path/to/Music Videos"
|
|
||||||
music_video_name: "{artist_sanitized}/{artist_sanitized} - {title_sanitized}"
|
|
||||||
artist: "{channel}"
|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
###############################################################################
|
|
||||||
# DOWNLOAD MUSIC VIDEO PLAYLIST
|
|
||||||
john_smith:
|
|
||||||
preset: "music_video"
|
|
||||||
overrides:
|
|
||||||
url: "https://youtube.com/playlist?list=UCsvn_Po0SmunchJYtttWpOxMg"
|
|
||||||
artist: "John Smith and the Instrument Players"
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# DOWNLOAD SINGLE MUSIC VIDEO VIA CLI
|
|
||||||
|
|
||||||
# It is not always ideal to download all of an artist's music videos.
|
|
||||||
# Maybe you only like one song of theirs. We can reuse our preset
|
|
||||||
# to download a single video instead.
|
|
||||||
#
|
|
||||||
# Of course, defining yaml configuration to download a single video once
|
|
||||||
# and never again seems weird. Instead, we can perform this download via
|
|
||||||
# command-line:
|
|
||||||
#
|
|
||||||
# ytdl-sub dl \
|
|
||||||
# --preset "music_video" \
|
|
||||||
# --overrides.url "https://youtube.com/watch?v=QhY6r6oAErg" \
|
|
||||||
# --overrides.artist "John Smith and the Instrument Players"
|
|
||||||
#
|
|
||||||
|
|
@ -7,6 +7,10 @@ presets:
|
||||||
output_directory: "{music_video_directory}"
|
output_directory: "{music_video_directory}"
|
||||||
file_name: "{music_video_file_name}.{ext}"
|
file_name: "{music_video_file_name}.{ext}"
|
||||||
thumbnail_name: "{music_video_file_name}.jpg"
|
thumbnail_name: "{music_video_file_name}.jpg"
|
||||||
|
maintain_download_archive: True
|
||||||
|
|
||||||
|
ytdl_options:
|
||||||
|
break_on_existing: True
|
||||||
|
|
||||||
overrides:
|
overrides:
|
||||||
# MUST DEFINE:
|
# MUST DEFINE:
|
||||||
|
|
|
||||||
|
|
@ -157,19 +157,9 @@ def _load_config(config_path: Path, working_directory: str) -> ConfigFile:
|
||||||
return ConfigFile.from_dict(config_dict)
|
return ConfigFile.from_dict(config_dict)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
|
||||||
def music_video_config_path() -> Path:
|
|
||||||
return Path("examples/music_videos_config.yaml")
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
|
||||||
def music_video_config(music_video_config_path, working_directory) -> ConfigFile:
|
|
||||||
return _load_config(music_video_config_path, working_directory)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def music_video_subscription_path() -> Path:
|
def music_video_subscription_path() -> Path:
|
||||||
return Path("examples/music_videos_subscriptions.yaml")
|
return Path("examples/music_video_subscriptions.yaml")
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
|
|
@ -185,7 +175,7 @@ def tv_show_subscriptions_path() -> Path:
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def music_audio_config(working_directory) -> ConfigFile:
|
def default_config(working_directory) -> ConfigFile:
|
||||||
return ConfigFile.from_dict({"configuration": {"working_directory": working_directory}})
|
return ConfigFile.from_dict({"configuration": {"working_directory": working_directory}})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,14 +29,14 @@ class TestBandcamp:
|
||||||
def test_prebuilt_preset_download(
|
def test_prebuilt_preset_download(
|
||||||
self,
|
self,
|
||||||
subscription_dict,
|
subscription_dict,
|
||||||
music_audio_config,
|
default_config,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
discography_subscription = Subscription.from_dict(
|
discography_subscription = Subscription.from_dict(
|
||||||
preset_dict=subscription_dict,
|
preset_dict=subscription_dict,
|
||||||
preset_name="Sithu Aye",
|
preset_name="Sithu Aye",
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
)
|
)
|
||||||
transaction_log = discography_subscription.download(dry_run=dry_run)
|
transaction_log = discography_subscription.download(dry_run=dry_run)
|
||||||
assert_transaction_log_matches(
|
assert_transaction_log_matches(
|
||||||
|
|
|
||||||
|
|
@ -71,13 +71,13 @@ class TestAudioExtract:
|
||||||
@pytest.mark.parametrize("dry_run", [True, False])
|
@pytest.mark.parametrize("dry_run", [True, False])
|
||||||
def test_audio_extract_single_song_old_format(
|
def test_audio_extract_single_song_old_format(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
single_preset_dict_old_format,
|
single_preset_dict_old_format,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="single_song_test",
|
preset_name="single_song_test",
|
||||||
preset_dict=single_preset_dict_old_format,
|
preset_dict=single_preset_dict_old_format,
|
||||||
)
|
)
|
||||||
|
|
@ -97,13 +97,13 @@ class TestAudioExtract:
|
||||||
@pytest.mark.parametrize("dry_run", [False])
|
@pytest.mark.parametrize("dry_run", [False])
|
||||||
def test_audio_extract_single_song(
|
def test_audio_extract_single_song(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
single_preset_dict,
|
single_preset_dict,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="single_song_test",
|
preset_name="single_song_test",
|
||||||
preset_dict=single_preset_dict,
|
preset_dict=single_preset_dict,
|
||||||
)
|
)
|
||||||
|
|
@ -123,13 +123,13 @@ class TestAudioExtract:
|
||||||
@pytest.mark.parametrize("dry_run", [True, False])
|
@pytest.mark.parametrize("dry_run", [True, False])
|
||||||
def test_audio_extract_single_song_best_format(
|
def test_audio_extract_single_song_best_format(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
single_best_format_preset_dict,
|
single_best_format_preset_dict,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="single_song_best_test",
|
preset_name="single_song_best_test",
|
||||||
preset_dict=single_best_format_preset_dict,
|
preset_dict=single_best_format_preset_dict,
|
||||||
)
|
)
|
||||||
|
|
@ -149,13 +149,13 @@ class TestAudioExtract:
|
||||||
@pytest.mark.parametrize("dry_run", [True, False])
|
@pytest.mark.parametrize("dry_run", [True, False])
|
||||||
def test_audio_extract_multiple_songs(
|
def test_audio_extract_multiple_songs(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
youtube_release_preset_dict,
|
youtube_release_preset_dict,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="multiple_songs_test",
|
preset_name="multiple_songs_test",
|
||||||
preset_dict=youtube_release_preset_dict,
|
preset_dict=youtube_release_preset_dict,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -23,12 +23,12 @@ def single_song_video_dict(output_directory):
|
||||||
class TestMusicTags:
|
class TestMusicTags:
|
||||||
def test_music_tags_errors_on_video(
|
def test_music_tags_errors_on_video(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
single_song_video_dict,
|
single_song_video_dict,
|
||||||
output_directory,
|
output_directory,
|
||||||
):
|
):
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="single_song_test",
|
preset_name="single_song_test",
|
||||||
preset_dict=single_song_video_dict,
|
preset_dict=single_song_video_dict,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -70,13 +70,13 @@ class TestSplitByChapters:
|
||||||
@pytest.mark.parametrize("dry_run", [True, False])
|
@pytest.mark.parametrize("dry_run", [True, False])
|
||||||
def test_video_with_chapters(
|
def test_video_with_chapters(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
yt_album_as_chapters_preset_dict,
|
yt_album_as_chapters_preset_dict,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="Proved Records",
|
preset_name="Proved Records",
|
||||||
preset_dict=yt_album_as_chapters_preset_dict,
|
preset_dict=yt_album_as_chapters_preset_dict,
|
||||||
)
|
)
|
||||||
|
|
@ -100,13 +100,13 @@ class TestSplitByChapters:
|
||||||
@pytest.mark.parametrize("dry_run", [True, False])
|
@pytest.mark.parametrize("dry_run", [True, False])
|
||||||
def test_video_with_chapters_and_regex(
|
def test_video_with_chapters_and_regex(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
yt_album_as_chapters_with_regex_preset_dict,
|
yt_album_as_chapters_with_regex_preset_dict,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="split_by_chapters_with_regex_video_preset",
|
preset_name="split_by_chapters_with_regex_video_preset",
|
||||||
preset_dict=yt_album_as_chapters_with_regex_preset_dict,
|
preset_dict=yt_album_as_chapters_with_regex_preset_dict,
|
||||||
)
|
)
|
||||||
|
|
@ -127,7 +127,7 @@ class TestSplitByChapters:
|
||||||
@pytest.mark.parametrize("when_no_chapters", ["pass", "drop", "error"])
|
@pytest.mark.parametrize("when_no_chapters", ["pass", "drop", "error"])
|
||||||
def test_video_with_no_chapters_and_regex(
|
def test_video_with_no_chapters_and_regex(
|
||||||
self,
|
self,
|
||||||
music_audio_config,
|
default_config,
|
||||||
yt_album_as_chapters_with_regex_preset_dict,
|
yt_album_as_chapters_with_regex_preset_dict,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
|
|
@ -142,7 +142,7 @@ class TestSplitByChapters:
|
||||||
)
|
)
|
||||||
|
|
||||||
subscription = Subscription.from_dict(
|
subscription = Subscription.from_dict(
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
preset_name="split_by_chapters_with_regex_video_no_chapters",
|
preset_name="split_by_chapters_with_regex_video_no_chapters",
|
||||||
preset_dict=yt_album_as_chapters_with_regex_preset_dict,
|
preset_dict=yt_album_as_chapters_with_regex_preset_dict,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -28,14 +28,14 @@ class TestSoundcloudDiscography:
|
||||||
def test_discography_download(
|
def test_discography_download(
|
||||||
self,
|
self,
|
||||||
subscription_dict,
|
subscription_dict,
|
||||||
music_audio_config,
|
default_config,
|
||||||
output_directory,
|
output_directory,
|
||||||
dry_run,
|
dry_run,
|
||||||
):
|
):
|
||||||
discography_subscription = Subscription.from_dict(
|
discography_subscription = Subscription.from_dict(
|
||||||
preset_dict=subscription_dict,
|
preset_dict=subscription_dict,
|
||||||
preset_name="j_b",
|
preset_name="j_b",
|
||||||
config=music_audio_config,
|
config=default_config,
|
||||||
)
|
)
|
||||||
transaction_log = discography_subscription.download(dry_run=dry_run)
|
transaction_log = discography_subscription.download(dry_run=dry_run)
|
||||||
assert_transaction_log_matches(
|
assert_transaction_log_matches(
|
||||||
|
|
|
||||||
|
|
@ -368,9 +368,9 @@ def test_tv_show_subscriptions(
|
||||||
assert jake_train_overrides["subscription_indent_2"] == "TV-Y"
|
assert jake_train_overrides["subscription_indent_2"] == "TV-Y"
|
||||||
|
|
||||||
|
|
||||||
def test_music_subscriptions(music_audio_config: ConfigFile, music_subscriptions_path: Path):
|
def test_music_subscriptions(default_config: ConfigFile, music_subscriptions_path: Path):
|
||||||
subs = Subscription.from_file_path(
|
subs = Subscription.from_file_path(
|
||||||
config=music_audio_config, subscription_path=music_subscriptions_path
|
config=default_config, subscription_path=music_subscriptions_path
|
||||||
)
|
)
|
||||||
|
|
||||||
assert len(subs) == 14
|
assert len(subs) == 14
|
||||||
|
|
@ -380,3 +380,20 @@ def test_music_subscriptions(music_audio_config: ConfigFile, music_subscriptions
|
||||||
assert monk["subscription_name"] == "Stan Getz"
|
assert monk["subscription_name"] == "Stan Getz"
|
||||||
assert monk["subscription_value"] == "https://www.youtube.com/@stangetzofficial/releases"
|
assert monk["subscription_value"] == "https://www.youtube.com/@stangetzofficial/releases"
|
||||||
assert monk["subscription_indent_1"] == "Jazz"
|
assert monk["subscription_indent_1"] == "Jazz"
|
||||||
|
|
||||||
|
|
||||||
|
def test_music_video_subscriptions(default_config: ConfigFile, music_video_subscription_path: Path):
|
||||||
|
subs = Subscription.from_file_path(
|
||||||
|
config=default_config, subscription_path=music_video_subscription_path
|
||||||
|
)
|
||||||
|
|
||||||
|
assert len(subs) == 3
|
||||||
|
assert subs[1].name == "Michael Jackson"
|
||||||
|
monk = subs[1].overrides.dict_with_format_strings
|
||||||
|
|
||||||
|
assert monk["subscription_name"] == "Michael Jackson"
|
||||||
|
assert (
|
||||||
|
monk["subscription_value"]
|
||||||
|
== "https://www.youtube.com/playlist?list=OLAK5uy_mnY03zP6abNWH929q2XhGzWD_2uKJ_n8E"
|
||||||
|
)
|
||||||
|
assert monk["subscription_indent_1"] == "Pop"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue