5 Commits

Author SHA1 Message Date
Ritiek Malhotra
9795d7e9b8 Release v2.0.2 2020-05-18 15:16:00 +05:30
Ritiek Malhotra
bbe43da191 Bugfix: crash when skipping track with -m [Fixes #721] 2020-05-18 15:14:22 +05:30
Ritiek Malhotra
8b7fd04321 Bump to v2.0.1 2020-05-18 14:13:00 +05:30
Ritiek Malhotra
cd5f224e37 Bugfix: -o m4a would fail [Fixes #720]
In FFmpeg, a given encoding may not always point to the same format
string.
2020-05-18 14:01:01 +05:30
Ritiek Malhotra
675d1805ed logger.error when no streams found for input format 2020-05-18 13:13:41 +05:30
9 changed files with 48 additions and 10 deletions

View File

@@ -8,6 +8,14 @@ The release dates mentioned follow the format `DD-MM-YYYY`.
## [Unreleased]
## [2.0.2] (Hotfix Release) - 18-05-2020
### Fixed
- Skipping tracks with `-m` would crash.
## [2.0.1] (Hotfix Release) - 18-05-2020
### Fixed
- `-o m4a` would always fail.
## [2.0.0] - 18-05-2020
### Migrating from v1.2.6 to v2.0.0
For v2.0.0 to work correctly, you need to remove your previous `config.yml` due to
@@ -45,15 +53,14 @@ All the below changes were made as a part of #690.
Such as `-o .mp3` is now written as `-o mp3`.
- **[Breaking]** Search format now uses hyphen for word break instead of underscore. Such as
`-sf "{artist} - {track_name}"` is now written as `-sf "{artist} - {track-name}"`.
- **[Breaking]** `--write-sucessful` and `--skip` is renamed to `--write-succesful-file` and
- **[Breaking]** `--write-successful` and `--skip` is renamed to `--write-successful-file` and
`--skip-file` respectively.
Such as `-o .mp3` is now written as `-o mp3`.
- Partial re-write and internal API refactor.
- Enhance debug log output readability.
- Internally adapt to latest changes made in Spotipy library.
- Switch to `logging` + `coloredlogs` instead of `logzero`. Our loggers weren't being
setup properly with `logzero`.
- Simplify checking for an already track. Previously it also analyzed metadata
- Simplify checking for an downloaded already track. Previously it also analyzed metadata
for the already downloaded track to determine whether to overwrite the already downloaded
track, which caused unexpected behvaiours at times.
- Codebase is now more modular making it easier to use spotdl in python scripts.

View File

@@ -224,6 +224,11 @@ class Spotdl:
quality=self.arguments["quality"],
preftype=self.arguments["input_ext"],
)
if stream is None:
logger.error('No matching streams found for given input format: "{}".'.format(
self.arguments["input_ext"]
))
return
if self.arguments["no_encode"]:
output_extension = stream["encoding"]

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

View File

@@ -138,6 +138,7 @@ class YouTubeStreams(StreamsBase):
self.all = []
for stream in audiostreams:
encoding = "m4a" if "mp4a" in stream.audio_codec else stream.audio_codec
standard_stream = {
# Store only the integer part for bitrate. For example
# the given bitrate would be "192kbps", we store only
@@ -145,7 +146,7 @@ class YouTubeStreams(StreamsBase):
"bitrate": int(stream.abr[:-4]),
"connection": None,
"download_url": stream.url,
"encoding": stream.audio_codec,
"encoding": encoding,
"filesize": None,
}
establish_connection = threading.Thread(

View File

@@ -163,7 +163,7 @@ class MetadataSearch:
if video is None:
raise NoYouTubeVideoMatchError(
'No matching videos found on YouTube for the search query "{}".'.format(
search_query
query
)
)
return video

View File

@@ -1,2 +1,2 @@
__version__ = "2.0.0"
__version__ = "2.0.2"