diff --git a/zspotify/track.py b/zspotify/track.py index b99a3fdd..eebf2432 100644 --- a/zspotify/track.py +++ b/zspotify/track.py @@ -1,4 +1,5 @@ import os +import re import time from typing import Any, Tuple, List @@ -11,7 +12,12 @@ from tqdm import tqdm from const import TRACKS, ALBUM, NAME, ITEMS, DISC_NUMBER, TRACK_NUMBER, IS_PLAYABLE, ARTISTS, IMAGES, URL, \ RELEASE_DATE, ID, TRACKS_URL, SAVED_TRACKS_URL, SPLIT_ALBUM_DISCS, ROOT_PATH, DOWNLOAD_FORMAT, CHUNK_SIZE, \ SKIP_EXISTING_FILES, ANTI_BAN_WAIT_TIME, OVERRIDE_AUTO_WAIT, BITRATE, CODEC_MAP, EXT_MAP, DOWNLOAD_REAL_TIME +<<<<<<< HEAD from utils import fix_filename, set_audio_tags, set_music_thumbnail, create_download_directory +======= +from utils import sanitize_data, set_audio_tags, set_music_thumbnail, create_download_directory, \ + get_directory_song_ids, add_to_directory_song_ids +>>>>>>> fixes#137 from zspotify import ZSpotify @@ -74,6 +80,18 @@ def download_track(track_id: str, extra_paths='', prefix=False, prefix_value='', filename = os.path.join( download_directory, f'{song_name}.{EXT_MAP.get(ZSpotify.get_config(DOWNLOAD_FORMAT).lower())}') + check_name = os.path.isfile(filename) and os.path.getsize(filename) + check_id = scraped_song_id in get_directory_song_ids(download_directory) + + # a song with the same name is installed + if not check_id and check_name: + c = len([file for file in os.listdir(download_directory) + if re.search(f'^{song_name}_', file)]) + 1 + + filename = os.path.join( + download_directory, f'{song_name}_{c}.{EXT_MAP.get(ZSpotify.get_config(DOWNLOAD_FORMAT))}') + + except Exception as e: print('### SKIPPING SONG - FAILED TO QUERY METADATA ###') print(e) @@ -83,7 +101,7 @@ def download_track(track_id: str, extra_paths='', prefix=False, prefix_value='', print('\n### SKIPPING:', song_name, '(SONG IS UNAVAILABLE) ###') else: - if os.path.isfile(filename) and os.path.getsize(filename) and ZSpotify.get_config(SKIP_EXISTING_FILES): + if check_id and check_name and ZSpotify.get_config(SKIP_EXISTING_FILES): print('\n### SKIPPING:', song_name, '(SONG ALREADY EXISTS) ###') else: @@ -119,6 +137,10 @@ def download_track(track_id: str, extra_paths='', prefix=False, prefix_value='', release_year, disc_number, track_number) set_music_thumbnail(filename, image_url) + # add song id to download directory's .song_ids file + if not check_id: + add_to_directory_song_ids(download_directory, scraped_song_id) + if not ZSpotify.get_config(OVERRIDE_AUTO_WAIT): time.sleep(ZSpotify.get_config(ANTI_BAN_WAIT_TIME)) except Exception as e: diff --git a/zspotify/utils.py b/zspotify/utils.py index 3ec4ef9d..939890a7 100644 --- a/zspotify/utils.py +++ b/zspotify/utils.py @@ -15,11 +15,38 @@ from const import ARTIST, TRACKTITLE, ALBUM, YEAR, DISCNUMBER, TRACKNUMBER, ARTW class MusicFormat(str, Enum): MP3 = 'mp3', OGG = 'ogg', - + def create_download_directory(download_path: str) -> None: + """ Create directory and add a hidden file with song ids """ os.makedirs(download_path, exist_ok=True) + # add hidden file with song ids + hidden_file_path = os.path.join(download_path, '.song_ids') + if not os.path.isfile(hidden_file_path): + with open(hidden_file_path, 'w', encoding='utf-8') as f: + pass + +def get_directory_song_ids(download_path: str) -> List[str]: + """ Gets song ids of songs in directory """ + + song_ids = [] + + hidden_file_path = os.path.join(download_path, '.song_ids') + if os.path.isfile(hidden_file_path): + with open(hidden_file_path, 'r', encoding='utf-8') as file: + song_ids.extend([line.strip() for line in file.readlines()]) + + return song_ids + +def add_to_directory_song_ids(download_path: str, song_id: str) -> None: + """ Appends song_id to .song_ids file in directory """ + + hidden_file_path = os.path.join(download_path, '.song_ids') + # not checking if file exists because we need an exception + # to be raised if something is wrong + with open(hidden_file_path, 'a', encoding='utf-8') as file: + file.write(f'{song_id}\n') def wait(seconds: int = 3) -> None: """ Pause for a set number of seconds """