From 5a655f96ef3e7360b752d1804db8548b9cff3cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Thu, 25 Nov 2021 10:16:32 +0100 Subject: [PATCH] Added --temp-download-dir option --- README.md | 1 + zspotify/config.py | 8 ++++++++ zspotify/track.py | 27 ++++++++++++++++++--------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0d10a019..3254905d 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Be aware you have to set boolean values in the commandline like this: `--downloa | PRINT_DOWNLOAD_PROGRESS | --print-download-progress | Print the download/playlist progress bars | PRINT_ERRORS | --print-errors | Print errors | PRINT_DOWNLOADS | --print-downloads | Print messages when a song is finished downloading +| TEMP_DOWNLOAD_DIR | --temp-download-dir | Download tracks to a temporary directory first ### Output format: diff --git a/zspotify/config.py b/zspotify/config.py index 79f79638..10b1368d 100644 --- a/zspotify/config.py +++ b/zspotify/config.py @@ -27,6 +27,7 @@ PRINT_SKIPS = 'PRINT_SKIPS' PRINT_DOWNLOAD_PROGRESS = 'PRINT_DOWNLOAD_PROGRESS' PRINT_ERRORS = 'PRINT_ERRORS' PRINT_DOWNLOADS = 'PRINT_DOWNLOADS' +TEMP_DOWNLOAD_DIR = 'TEMP_DOWNLOAD_DIR' CONFIG_VALUES = { ROOT_PATH: { 'default': '../ZSpotify Music/', 'type': str, 'arg': '--root-path' }, @@ -50,6 +51,7 @@ CONFIG_VALUES = { PRINT_DOWNLOAD_PROGRESS: { 'default': 'True', 'type': bool, 'arg': '--print-download-progress' }, PRINT_ERRORS: { 'default': 'True', 'type': bool, 'arg': '--print-errors' }, PRINT_DOWNLOADS: { 'default': 'False', 'type': bool, 'arg': '--print-downloads' }, + TEMP_DOWNLOAD_DIR: { 'default': '', 'type': str, 'arg': '--temp-download-dir' }, } OUTPUT_DEFAULT_PLAYLIST = '{playlist}/{artist} - {song_name}.{ext}' @@ -187,6 +189,12 @@ class Config: def get_credentials_location(cls) -> str: return cls.get(CREDENTIALS_LOCATION) + @classmethod + def get_temp_download_dir(cls) -> str: + if cls.get(TEMP_DOWNLOAD_DIR) == '': + return '' + return os.path.join(ZSpotify.CONFIG.get_root_path(), cls.get(TEMP_DOWNLOAD_DIR)) + @classmethod def get_output(cls, mode: str) -> str: v = cls.get(OUTPUT) diff --git a/zspotify/track.py b/zspotify/track.py index fb91b10a..2e34fad2 100644 --- a/zspotify/track.py +++ b/zspotify/track.py @@ -2,6 +2,7 @@ import math import os import re import time +import uuid from typing import Any, Tuple, List from librespot.audio.decoders import AudioQuality @@ -83,6 +84,8 @@ def download_track(mode: str, track_id: str, extra_keys={}, disable_progressbar= for k in extra_keys: output_template = output_template.replace("{"+k+"}", fix_filename(extra_keys[k])) + ext = EXT_MAP.get(ZSpotify.CONFIG.get_download_format().lower()) + output_template = output_template.replace("{artist}", fix_filename(artists[0])) output_template = output_template.replace("{album}", fix_filename(album_name)) output_template = output_template.replace("{song_name}", fix_filename(name)) @@ -91,11 +94,15 @@ def download_track(mode: str, track_id: str, extra_keys={}, disable_progressbar= output_template = output_template.replace("{track_number}", fix_filename(track_number)) output_template = output_template.replace("{id}", fix_filename(scraped_song_id)) output_template = output_template.replace("{track_id}", fix_filename(track_id)) - output_template = output_template.replace("{ext}", EXT_MAP.get(ZSpotify.CONFIG.get_download_format().lower())) + output_template = output_template.replace("{ext}", ext) filename = os.path.join(os.path.dirname(__file__), ZSpotify.CONFIG.get_root_path(), output_template) filedir = os.path.dirname(filename) + filename_temp = filename + if ZSpotify.CONFIG.get_temp_download_dir() != '': + filename_temp = os.path.join(ZSpotify.CONFIG.get_temp_download_dir(), f'zspotify_{str(uuid.uuid4())}_{track_id}.{ext}') + check_name = os.path.isfile(filename) and os.path.getsize(filename) check_id = scraped_song_id in get_directory_song_ids(filedir) check_all_time = scraped_song_id in get_previously_downloaded() @@ -128,14 +135,13 @@ def download_track(mode: str, track_id: str, extra_keys={}, disable_progressbar= if track_id != scraped_song_id: track_id = scraped_song_id track_id = TrackId.from_base62(track_id) - stream = ZSpotify.get_content_stream( - track_id, ZSpotify.DOWNLOAD_QUALITY) + stream = ZSpotify.get_content_stream(track_id, ZSpotify.DOWNLOAD_QUALITY) create_download_directory(filedir) total_size = stream.input_stream.size time_start = time.time() downloaded = 0 - with open(filename, 'wb') as file, Printer.progress( + with open(filename_temp, 'wb') as file, Printer.progress( desc=song_name, total=total_size, unit='B', @@ -155,9 +161,12 @@ def download_track(mode: str, track_id: str, extra_keys={}, disable_progressbar= time_downloaded = time.time() - convert_audio_format(filename) - set_audio_tags(filename, artists, name, album_name, release_year, disc_number, track_number) - set_music_thumbnail(filename, image_url) + convert_audio_format(filename_temp) + set_audio_tags(filename_temp, artists, name, album_name, release_year, disc_number, track_number) + set_music_thumbnail(filename_temp, image_url) + + if filename_temp != filename: + os.rename(filename_temp, filename) time_finished = time.time() @@ -176,8 +185,8 @@ def download_track(mode: str, track_id: str, extra_keys={}, disable_progressbar= Printer.print(PrintChannel.ERRORS, '### SKIPPING: ' + song_name + ' (GENERAL DOWNLOAD ERROR) ###') Printer.print(PrintChannel.ERRORS, str(e) + "\n") Printer.print(PrintChannel.ERRORS, "".join(traceback.TracebackException.from_exception(e).format()) + "\n") - if os.path.exists(filename): - os.remove(filename) + if os.path.exists(filename_temp): + os.remove(filename_temp) def convert_audio_format(filename) -> None: