mirror of
https://github.com/KevinMidboe/spotify-downloader.git
synced 2025-10-29 18:00:15 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9795d7e9b8 | ||
|
|
bbe43da191 | ||
|
|
8b7fd04321 | ||
|
|
cd5f224e37 | ||
|
|
675d1805ed |
13
CHANGES.md
13
CHANGES.md
@@ -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.
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
__version__ = "2.0.0"
|
||||
__version__ = "2.0.2"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user