Bugfix: -o m4a would fail [Fixes #720]

In FFmpeg, a given encoding may not always point to the same format
string.
This commit is contained in:
Ritiek Malhotra
2020-05-18 14:01:01 +05:30
parent 675d1805ed
commit cd5f224e37
5 changed files with 31 additions and 5 deletions

View File

@@ -21,6 +21,13 @@ from spotdl.encode.exceptions import EncoderNotFoundError
"""
_TARGET_FORMATS_FROM_ENCODING = {
"m4a": "mp4",
"mp3": "mp3",
"opus": "opus",
"flac": "flac"
}
class EncoderBase(ABC):
"""
@@ -44,6 +51,7 @@ class EncoderBase(ABC):
self.encoder_path = encoder_path
self._loglevel = loglevel
self._additional_arguments = additional_arguments
self._target_formats_from_encoding = _TARGET_FORMATS_FROM_ENCODING
def set_argument(self, argument):
"""
@@ -94,6 +102,14 @@ class EncoderBase(ABC):
"""
pass
def target_format_from_encoding(self, encoding):
"""
This method generates the target stream format from given
input encoding.
"""
target_format = self._target_formats_from_encoding[encoding]
return target_format
def re_encode_from_stdin(self, input_encoding, target_path):
"""
This method must invoke the encoder to encode stdin to a

View File

@@ -76,7 +76,7 @@ class EncoderFFmpeg(EncoderBase):
+ ["-i", input_path] \
+ arguments.split() \
+ self._additional_arguments \
+ ["-f", target_encoding] \
+ ["-f", self.target_format_from_encoding(target_encoding)] \
+ [target_file]
return command

View File

@@ -48,7 +48,7 @@ class TestEncodingDefaults:
'-acodec', 'copy',
'-b:a', '192k',
'-vn',
'-f', 'm4a',
'-f', 'mp4',
target_path
]
return command
@@ -112,7 +112,7 @@ class TestEncodingInDebugMode:
'-acodec', 'copy',
'-b:a', '192k',
'-vn',
'-f', 'm4a',
'-f', 'mp4',
target_path
]
return command
@@ -180,7 +180,7 @@ class TestEncodingAndTrimSilence:
'-b:a', '192k',
'-vn',
'-af', 'silenceremove=start_periods=1',
'-f', 'm4a',
'-f', 'mp4',
target_path
]
return command

View File

@@ -86,3 +86,12 @@ class TestMethods:
def test_encoder_not_found_error(self):
with pytest.raises(EncoderNotFoundError):
self.EncoderKid("/a/nonexistent/path", "0", [])
@pytest.mark.parametrize("encoding, target_format", [
("m4a", "mp4"),
("mp3", "mp3"),
("opus", "opus"),
("flac", "flac"),
])
def test_target_format_from_encoding(self, encoderkid, encoding, target_format):
assert encoderkid.target_format_from_encoding(encoding) == target_format