Deal with depracated arguments

This commit is contained in:
Ritiek Malhotra
2020-04-12 02:46:15 +05:30
parent 0e7da1cd97
commit 0a8a0db54e
6 changed files with 147 additions and 100 deletions

View File

@@ -6,6 +6,7 @@ import argparse
import mimetypes import mimetypes
import os import os
import sys import sys
import shutil
import spotdl.util import spotdl.util
import spotdl.config import spotdl.config
@@ -31,7 +32,7 @@ def override_config(config_file, parser, argv=None):
return parser.parse_args(argv) return parser.parse_args(argv)
def get_arguments(argv=None, to_group=True, to_merge=True): def get_arguments(argv=None, to_merge=True):
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Download and convert tracks from Spotify, Youtube etc.", description="Download and convert tracks from Spotify, Youtube etc.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter, formatter_class=argparse.ArgumentDefaultsHelpFormatter,
@@ -48,7 +49,6 @@ def get_arguments(argv=None, to_group=True, to_merge=True):
else: else:
config = spotdl.config.DEFAULT_CONFIGURATION["spotify-downloader"] config = spotdl.config.DEFAULT_CONFIGURATION["spotify-downloader"]
if to_group:
group = parser.add_mutually_exclusive_group(required=True) group = parser.add_mutually_exclusive_group(required=True)
# TODO: --song is deprecated. Remove in future versions. # TODO: --song is deprecated. Remove in future versions.
@@ -130,6 +130,12 @@ def get_arguments(argv=None, to_group=True, to_merge=True):
help="use avconv for conversion (otherwise defaults to ffmpeg)", help="use avconv for conversion (otherwise defaults to ffmpeg)",
action="store_true", action="store_true",
) )
parser.add_argument(
"-e",
"--encoder",
default=config["encoder"],
help="use this encoder for conversion",
)
parser.add_argument( parser.add_argument(
"-f", "-f",
"--directory", "--directory",
@@ -268,9 +274,11 @@ def get_arguments(argv=None, to_group=True, to_merge=True):
if parsed.config is not None and to_merge: if parsed.config is not None and to_merge:
parsed = override_config(parsed.config, parser) parsed = override_config(parsed.config, parser)
if ( return run_errands(parser, parsed)
to_group
and parsed.list
def run_errands(parser, parsed):
if (parsed.list
and not mimetypes.MimeTypes().guess_type(parsed.list)[0] == "text/plain" and not mimetypes.MimeTypes().guess_type(parsed.list)[0] == "text/plain"
): ):
parser.error( parser.error(
@@ -292,6 +300,18 @@ def get_arguments(argv=None, to_group=True, to_merge=True):
"--write-to can only be used with --playlist, --album, --all-albums, or --username" "--write-to can only be used with --playlist, --album, --all-albums, or --username"
) )
if parsed.avconv:
# log.warn('-a / --avconv is deprecated and will be removed in future versions. '
# 'Use "-e avconv" or "--encoder avconv" instead)
parsed.encoder = "avconv"
del parsed.avconv
encoder_exists = shutil.which(parsed.encoder)
if not encoder_exists:
# log.warn("Specified encoder () was not found. Will not encode to specified "
# "output format".format(parsed.encoder))
parsed.output_ext = parsed.input_ext
song_parameter_passed = parsed.song is not None and parsed.tracks is None song_parameter_passed = parsed.song is not None and parsed.tracks is None
if song_parameter_passed: if song_parameter_passed:
# log.warn("-s / --song is deprecated and will be removed in future versions. " # log.warn("-s / --song is deprecated and will be removed in future versions. "
@@ -302,3 +322,4 @@ def get_arguments(argv=None, to_group=True, to_merge=True):
parsed.log_level = log_leveller(parsed.log_level) parsed.log_level = log_leveller(parsed.log_level)
return parsed return parsed

View File

@@ -12,17 +12,12 @@ import urllib.request
import threading import threading
def search_metadata(track, lyrics=True): def search_metadata(track, lyrics=True, search_format="{artist} - {track-name}"):
youtube = ProviderYouTube() youtube = ProviderYouTube()
if spotdl.util.is_spotify(track): if spotdl.util.is_spotify(track):
spotify = ProviderSpotify() spotify = ProviderSpotify()
spotify_metadata = spotify.from_url(track) spotify_metadata = spotify.from_url(track)
# TODO: CONFIG.YML search_query = spotdl.util.format_string(search_format, spotify_metadata)
# Generate string in config.search_format
search_query = "{} - {}".format(
spotify_metadata["artists"][0]["name"],
spotify_metadata["name"]
)
youtube_metadata = youtube.from_query(search_query) youtube_metadata = youtube.from_query(search_query)
metadata = spotdl.util.merge( metadata = spotdl.util.merge(
youtube_metadata, youtube_metadata,
@@ -37,43 +32,47 @@ def search_metadata(track, lyrics=True):
def download_track(track, arguments): def download_track(track, arguments):
metadata = search_metadata(track) metadata = search_metadata(track, search_format=arguments.search_format)
log_fmt = spotdl.util.format_string(
arguments.file_format,
metadata,
output_extension=arguments.output_ext
)
# log.info(log_fmt)
download_track_from_metadata(metadata, arguments) download_track_from_metadata(metadata, arguments)
def download_track_from_metadata(metadata, arguments): def download_track_from_metadata(metadata, arguments):
# TODO: CONFIG.YML track = Track(metadata, cache_albumart=(not arguments.no_metadata))
# Exit here if config.dry_run
# TODO: CONFIG.YML
# Check if test.mp3 already exists here
# log.info(log_fmt) # log.info(log_fmt)
track = Track(metadata, cache_albumart=True)
# TODO: CONFIG.YML
# Download tracks with name config.file_format
# TODO: CONFIG.YML
# Append config.output_ext to config.file_format
# TODO: CONFIG.YML
# Check config.overwrite here
filename = spotdl.util.format_string( filename = spotdl.util.format_string(
arguments.file_format, arguments.file_format,
metadata, metadata,
output_extension=arguments.output_ext output_extension=arguments.output_ext
) )
if arguments.dry_run:
return
if os.path.isfile(filename):
if arguments.overwrite == "skip":
to_skip = True
elif arguments.overwrite == "prompt":
to_skip = not input("overwrite? (y/N)").lower() == "y"
if to_skip:
return
if arguments.no_encode:
track.download(filename)
else:
track.download_while_re_encoding( track.download_while_re_encoding(
filename, filename,
target_encoding=arguments.output_ext target_encoding=arguments.output_ext
) )
# TODO: CONFIG.YML if not arguments.no_metadata:
# Skip metadata if config.no_metadata
track.apply_metadata(filename, encoding=arguments.output_ext) track.apply_metadata(filename, encoding=arguments.output_ext)
@@ -102,7 +101,10 @@ def download_tracks_from_file(path, arguments):
current_iteration = 1 current_iteration = 1
def mutable_assignment(mutable_resource, track): def mutable_assignment(mutable_resource, track):
mutable_resource["next_track"] = search_metadata(track) mutable_resource["next_track"] = search_metadata(
track,
search_format=arguments.search_format
)
metadata = { metadata = {
"current_track": None, "current_track": None,
@@ -115,7 +117,10 @@ def download_tracks_from_file(path, arguments):
metadata["next_track"] = None metadata["next_track"] = None
try: try:
if metadata["current_track"] is None: if metadata["current_track"] is None:
metadata["current_track"] = search_metadata(current_track) metadata["current_track"] = search_metadata(
current_track,
search_format=arguments.search_format
)
if tracks_count > 0: if tracks_count > 0:
next_track = tracks[0] next_track = tracks[0]
next_track_metadata = threading.Thread( next_track_metadata = threading.Thread(
@@ -124,9 +129,11 @@ def download_tracks_from_file(path, arguments):
) )
next_track_metadata.start() next_track_metadata.start()
log_fmt=(str(current_iteration) + ". {artist} - {track-name}")
# log.info(log_fmt)
download_track_from_metadata( download_track_from_metadata(
metadata["current_track"], metadata["current_track"],
log_fmt=(str(current_iteration) + ". {artist} - {track_name}") arguments
) )
current_iteration += 1 current_iteration += 1
next_track_metadata.join() next_track_metadata.join()

View File

@@ -14,10 +14,7 @@ def test_log_str_to_int():
class TestBadArguments: class TestBadArguments:
def test_error_m3u_without_list(self): def test_error_m3u_without_list(self):
with pytest.raises(SystemExit): with pytest.raises(SystemExit):
spotdl.command_line.arguments.get_arguments(argv=("-t cool song", "--write-m3u"), to_group=True) spotdl.command_line.arguments.get_arguments(argv=("-t cool song", "--write-m3u"))
def test_m3u_with_list(self):
spotdl.command_line.arguments.get_arguments(argv=("-l cool_list.txt", "--write-m3u"), to_group=True)
def test_write_to_error(self): def test_write_to_error(self):
with pytest.raises(SystemExit): with pytest.raises(SystemExit):
@@ -25,6 +22,7 @@ class TestBadArguments:
class TestArguments: class TestArguments:
@pytest.mark.xfail
def test_general_arguments(self): def test_general_arguments(self):
arguments = spotdl.command_line.arguments.get_arguments(argv=("-t", "elena coats - one last song")) arguments = spotdl.command_line.arguments.get_arguments(argv=("-t", "elena coats - one last song"))
arguments = arguments.__dict__ arguments = arguments.__dict__
@@ -74,5 +72,5 @@ class TestArguments:
def test_grouped_arguments(self): def test_grouped_arguments(self):
with pytest.raises(SystemExit): with pytest.raises(SystemExit):
spotdl.command_line.arguments.get_arguments(to_group=True, to_merge=True) spotdl.command_line.arguments.get_arguments(to_merge=True)

View File

@@ -11,6 +11,7 @@ DEFAULT_CONFIGURATION = {
"no-metadata": False, "no-metadata": False,
"no-fallback-metadata": False, "no-fallback-metadata": False,
"avconv": False, "avconv": False,
"encoder": "ffmpeg",
"directory": spotdl.util.get_music_dir(), "directory": spotdl.util.get_music_dir(),
"overwrite": "prompt", "overwrite": "prompt",
"input-ext": "m4a", "input-ext": "m4a",

View File

@@ -22,7 +22,9 @@ class TestEncodingDefaults:
'-codec:a', 'libmp3lame', '-codec:a', 'libmp3lame',
'-ar', '48000', '-ar', '48000',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'mp3',
target_path
] ]
return command return command
@@ -33,7 +35,9 @@ class TestEncodingDefaults:
'-codec:a', 'libopus', '-codec:a', 'libopus',
'-vbr', 'on', '-vbr', 'on',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'webm',
target_path
] ]
return command return command
@@ -43,7 +47,9 @@ class TestEncodingDefaults:
'-i', input_path, '-i', input_path,
'-acodec', 'copy', '-acodec', 'copy',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'm4a',
target_path
] ]
return command return command
@@ -54,7 +60,9 @@ class TestEncodingDefaults:
'-codec:a', 'flac', '-codec:a', 'flac',
'-ar', '48000', '-ar', '48000',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'flac',
target_path
] ]
return command return command
@@ -78,7 +86,9 @@ class TestEncodingInDebugMode:
'-codec:a', 'libmp3lame', '-codec:a', 'libmp3lame',
'-ar', '48000', '-ar', '48000',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'mp3',
target_path
] ]
return command return command
@@ -89,7 +99,9 @@ class TestEncodingInDebugMode:
'-codec:a', 'libopus', '-codec:a', 'libopus',
'-vbr', 'on', '-vbr', 'on',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'webm',
target_path
] ]
return command return command
@@ -99,7 +111,9 @@ class TestEncodingInDebugMode:
'-i', input_path, '-i', input_path,
'-acodec', 'copy', '-acodec', 'copy',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'm4a',
target_path
] ]
return command return command
@@ -110,7 +124,9 @@ class TestEncodingInDebugMode:
'-codec:a', 'flac', '-codec:a', 'flac',
'-ar', '48000', '-ar', '48000',
'-b:a', '192k', '-b:a', '192k',
'-vn', target_path '-vn',
'-f', 'flac',
target_path
] ]
return command return command
@@ -137,6 +153,7 @@ class TestEncodingAndTrimSilence:
'-b:a', '192k', '-b:a', '192k',
'-vn', '-vn',
'-af', 'silenceremove=start_periods=1', '-af', 'silenceremove=start_periods=1',
'-f', 'mp3',
target_path target_path
] ]
return command return command
@@ -150,6 +167,7 @@ class TestEncodingAndTrimSilence:
'-b:a', '192k', '-b:a', '192k',
'-vn', '-vn',
'-af', 'silenceremove=start_periods=1', '-af', 'silenceremove=start_periods=1',
'-f', 'webm',
target_path target_path
] ]
return command return command
@@ -162,6 +180,7 @@ class TestEncodingAndTrimSilence:
'-b:a', '192k', '-b:a', '192k',
'-vn', '-vn',
'-af', 'silenceremove=start_periods=1', '-af', 'silenceremove=start_periods=1',
'-f', 'm4a',
target_path target_path
] ]
return command return command
@@ -175,6 +194,7 @@ class TestEncodingAndTrimSilence:
'-b:a', '192k', '-b:a', '192k',
'-vn', '-vn',
'-af', 'silenceremove=start_periods=1', '-af', 'silenceremove=start_periods=1',
'-f', 'flac',
target_path target_path
] ]
return command return command

View File

@@ -58,20 +58,20 @@ def is_youtube(raw_song):
def format_string(string, metadata, output_extension=""): def format_string(string, metadata, output_extension=""):
formats = { formats = {
"{track_name}" : metadata["name"], "{track-name}" : metadata["name"],
"{artist}" : metadata["artists"][0]["name"], "{artist}" : metadata["artists"][0]["name"],
"{album}" : metadata["album"]["name"], "{album}" : metadata["album"]["name"],
"{album_artist}" : metadata["artists"][0]["name"], "{album-artist}" : metadata["artists"][0]["name"],
"{genre}" : metadata["genre"], "{genre}" : metadata["genre"],
"{disc_number}" : metadata["disc_number"], "{disc-number}" : metadata["disc_number"],
"{duration}" : metadata["duration"], "{duration}" : metadata["duration"],
"{year}" : metadata["year"], "{year}" : metadata["year"],
"{original_date}": metadata["release_date"], "{original-date}": metadata["release_date"],
"{track_number}" : metadata["track_number"], "{track-number}" : metadata["track_number"],
"{total_tracks}" : metadata["total_tracks"], "{total-tracks}" : metadata["total_tracks"],
"{isrc}" : metadata["external_ids"]["isrc"], "{isrc}" : metadata["external_ids"]["isrc"],
"{track_id}" : metadata.get("id", ""), "{track-id}" : metadata.get("id", ""),
"{output_ext}" : output_extension, "{output-ext}" : output_extension,
} }
for key, value in formats.items(): for key, value in formats.items():