diff --git a/spotdl/convert.py b/spotdl/convert.py index 7421cf9..e84bc7a 100644 --- a/spotdl/convert.py +++ b/spotdl/convert.py @@ -16,7 +16,7 @@ https://trac.ffmpeg.org/wiki/Encode/AAC """ -def song(input_song, output_song, folder, avconv=False, trim_silence=False): +def song(input_song, output_song, folder, avconv=False, trim_silence=False, delete_original=True): """ Do the audio format conversion. """ if avconv and trim_silence: raise ValueError("avconv does not support trim_silence") @@ -28,7 +28,7 @@ def song(input_song, output_song, folder, avconv=False, trim_silence=False): else: return 0 - convert = Converter(input_song, output_song, folder, delete_original=True) + convert = Converter(input_song, output_song, folder, delete_original=delete_original) if avconv: exit_code, command = convert.with_avconv() else: @@ -97,7 +97,7 @@ class Converter: return code, command def with_ffmpeg(self, trim_silence=False): - ffmpeg_pre = "ffmpeg -y " + ffmpeg_pre = "ffmpeg -y -nostdin " # -nostdin is necessary for spotdl to be able to run in the backgroung. if not log.level == 10: ffmpeg_pre += "-hide_banner -nostats -v panic " diff --git a/spotdl/downloader.py b/spotdl/downloader.py index d91cb29..bd0f1ab 100644 --- a/spotdl/downloader.py +++ b/spotdl/downloader.py @@ -133,6 +133,7 @@ class Downloader: const.args.folder, avconv=const.args.avconv, trim_silence=const.args.trim_silence, + delete_original=not const.args.no_remove_original, ) except FileNotFoundError: encoder = "avconv" if const.args.avconv else "ffmpeg" diff --git a/spotdl/handle.py b/spotdl/handle.py index 7793aa2..57926f1 100644 --- a/spotdl/handle.py +++ b/spotdl/handle.py @@ -15,6 +15,7 @@ _LOG_LEVELS_STR = ["INFO", "WARNING", "ERROR", "DEBUG"] default_conf = { "spotify-downloader": { + "no-remove-original": False, "manual": False, "no-metadata": False, "no-fallback-metadata": False, @@ -139,6 +140,13 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): help="choose the track to download manually from a list of matching tracks", action="store_true", ) + parser.add_argument( + "-nr", + "--no-remove-original", + default=config["no-remove-original"], + help="do not remove the original file after conversion", + action="store_true", + ) parser.add_argument( "-nm", "--no-metadata", diff --git a/test/test_download_with_metadata.py b/test/test_download_with_metadata.py index 15534c2..58a9ee7 100644 --- a/test/test_download_with_metadata.py +++ b/test/test_download_with_metadata.py @@ -116,7 +116,7 @@ class TestDownload: class TestFFmpeg: def test_convert_from_webm_to_mp3(self, filename_fixture, monkeypatch): - expect_command = "ffmpeg -y -hide_banner -nostats -v panic -i {0}.webm -codec:a libmp3lame -ar 44100 -b:a 192k -vn {0}.mp3".format( + expect_command = "ffmpeg -y -nostdin -hide_banner -nostats -v panic -i {0}.webm -codec:a libmp3lame -ar 44100 -b:a 192k -vn {0}.mp3".format( os.path.join(const.args.folder, filename_fixture) ) monkeypatch.setattr("os.remove", lambda x: None) @@ -126,7 +126,7 @@ class TestFFmpeg: assert " ".join(command) == expect_command def test_convert_from_webm_to_m4a(self, filename_fixture, monkeypatch): - expect_command = "ffmpeg -y -hide_banner -nostats -v panic -i {0}.webm -cutoff 20000 -codec:a aac -ar 44100 -b:a 192k -vn {0}.m4a".format( + expect_command = "ffmpeg -y -nostdin -hide_banner -nostats -v panic -i {0}.webm -cutoff 20000 -codec:a aac -ar 44100 -b:a 192k -vn {0}.m4a".format( os.path.join(const.args.folder, filename_fixture) ) monkeypatch.setattr("os.remove", lambda x: None) @@ -136,7 +136,7 @@ class TestFFmpeg: assert " ".join(command) == expect_command def test_convert_from_m4a_to_mp3(self, filename_fixture, monkeypatch): - expect_command = "ffmpeg -y -hide_banner -nostats -v panic -i {0}.m4a -codec:v copy -codec:a libmp3lame -ar 44100 -b:a 192k -vn {0}.mp3".format( + expect_command = "ffmpeg -y -nostdin -hide_banner -nostats -v panic -i {0}.m4a -codec:v copy -codec:a libmp3lame -ar 44100 -b:a 192k -vn {0}.mp3".format( os.path.join(const.args.folder, filename_fixture) ) monkeypatch.setattr("os.remove", lambda x: None) @@ -146,7 +146,7 @@ class TestFFmpeg: assert " ".join(command) == expect_command def test_convert_from_m4a_to_webm(self, filename_fixture, monkeypatch): - expect_command = "ffmpeg -y -hide_banner -nostats -v panic -i {0}.m4a -codec:a libopus -vbr on -b:a 192k -vn {0}.webm".format( + expect_command = "ffmpeg -y -nostdin -hide_banner -nostats -v panic -i {0}.m4a -codec:a libopus -vbr on -b:a 192k -vn {0}.webm".format( os.path.join(const.args.folder, filename_fixture) ) monkeypatch.setattr("os.remove", lambda x: None) @@ -156,7 +156,7 @@ class TestFFmpeg: assert " ".join(command) == expect_command def test_convert_from_m4a_to_flac(self, filename_fixture, monkeypatch): - expect_command = "ffmpeg -y -hide_banner -nostats -v panic -i {0}.m4a -codec:a flac -ar 44100 -b:a 192k -vn {0}.flac".format( + expect_command = "ffmpeg -y -nostdin -hide_banner -nostats -v panic -i {0}.m4a -codec:a flac -ar 44100 -b:a 192k -vn {0}.flac".format( os.path.join(const.args.folder, filename_fixture) ) monkeypatch.setattr("os.remove", lambda x: None) @@ -166,7 +166,7 @@ class TestFFmpeg: assert " ".join(command) == expect_command def test_correct_container_for_m4a(self, filename_fixture, monkeypatch): - expect_command = "ffmpeg -y -hide_banner -nostats -v panic -i {0}.m4a.temp -acodec copy -b:a 192k -vn {0}.m4a".format( + expect_command = "ffmpeg -y -nostdin -hide_banner -nostats -v panic -i {0}.m4a.temp -acodec copy -b:a 192k -vn {0}.m4a".format( os.path.join(const.args.folder, filename_fixture) ) _, command = convert.song(