mirror of
				https://github.com/THIS-IS-NOT-A-BACKUP/zspotify.git
				synced 2025-11-04 05:20:34 +00:00 
			
		
		
		
	Added realtime downloading for songs
This commit is contained in:
		
							parent
							
								
									8bab8a03c5
								
							
						
					
					
						commit
						fe6f266b41
					
				@ -2,5 +2,7 @@ ffmpy
 | 
				
			|||||||
git+https://github.com/kokarare1212/librespot-python
 | 
					git+https://github.com/kokarare1212/librespot-python
 | 
				
			||||||
music_tag
 | 
					music_tag
 | 
				
			||||||
Pillow
 | 
					Pillow
 | 
				
			||||||
 | 
					protobuf
 | 
				
			||||||
 | 
					pydub
 | 
				
			||||||
tabulate
 | 
					tabulate
 | 
				
			||||||
tqdm
 | 
					tqdm
 | 
				
			||||||
@ -96,6 +96,8 @@ CHUNK_SIZE = 'CHUNK_SIZE'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SPLIT_ALBUM_DISCS = 'SPLIT_ALBUM_DISCS'
 | 
					SPLIT_ALBUM_DISCS = 'SPLIT_ALBUM_DISCS'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DOWNLOAD_REAL_TIME = 'DOWNLOAD_REAL_TIME'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BITRATE = 'BITRATE'
 | 
					BITRATE = 'BITRATE'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CODEC_MAP = {
 | 
					CODEC_MAP = {
 | 
				
			||||||
@ -127,5 +129,6 @@ CONFIG_DEFAULT_SETTINGS = {
 | 
				
			|||||||
    'ANTI_BAN_WAIT_TIME': 1,
 | 
					    'ANTI_BAN_WAIT_TIME': 1,
 | 
				
			||||||
    'OVERRIDE_AUTO_WAIT': False,
 | 
					    'OVERRIDE_AUTO_WAIT': False,
 | 
				
			||||||
    'CHUNK_SIZE': 50000,
 | 
					    'CHUNK_SIZE': 50000,
 | 
				
			||||||
    'SPLIT_ALBUM_DISCS': False
 | 
					    'SPLIT_ALBUM_DISCS': False,
 | 
				
			||||||
 | 
					    'DOWNLOAD_REAL_TIME': True
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,11 +5,12 @@ from typing import Any, Tuple, List
 | 
				
			|||||||
from librespot.audio.decoders import AudioQuality
 | 
					from librespot.audio.decoders import AudioQuality
 | 
				
			||||||
from librespot.metadata import TrackId
 | 
					from librespot.metadata import TrackId
 | 
				
			||||||
from ffmpy import FFmpeg
 | 
					from ffmpy import FFmpeg
 | 
				
			||||||
 | 
					from pydub import AudioSegment
 | 
				
			||||||
from tqdm import tqdm
 | 
					from tqdm import tqdm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from const import TRACKS, ALBUM, NAME, ITEMS, DISC_NUMBER, TRACK_NUMBER, IS_PLAYABLE, ARTISTS, IMAGES, URL, \
 | 
					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, \
 | 
					    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
 | 
					    SKIP_EXISTING_FILES, ANTI_BAN_WAIT_TIME, OVERRIDE_AUTO_WAIT, BITRATE, CODEC_MAP, EXT_MAP, DOWNLOAD_REAL_TIME
 | 
				
			||||||
from utils import sanitize_data, set_audio_tags, set_music_thumbnail, create_download_directory
 | 
					from utils import sanitize_data, set_audio_tags, set_music_thumbnail, create_download_directory
 | 
				
			||||||
from zspotify import ZSpotify
 | 
					from zspotify import ZSpotify
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -102,9 +103,16 @@ def download_track(track_id: str, extra_paths='', prefix=False, prefix_value='',
 | 
				
			|||||||
                            unit_divisor=1024,
 | 
					                            unit_divisor=1024,
 | 
				
			||||||
                            disable=disable_progressbar
 | 
					                            disable=disable_progressbar
 | 
				
			||||||
                    ) as p_bar:
 | 
					                    ) as p_bar:
 | 
				
			||||||
                        for _ in range(int(total_size / ZSpotify.get_config(CHUNK_SIZE)) + 1):
 | 
					                        for chunk in range(int(total_size / ZSpotify.get_config(CHUNK_SIZE)) + 1):
 | 
				
			||||||
                            p_bar.update(file.write(
 | 
					                            data = stream.input_stream.stream().read(ZSpotify.get_config(CHUNK_SIZE))
 | 
				
			||||||
                                stream.input_stream.stream().read(ZSpotify.get_config(CHUNK_SIZE))))
 | 
					                            if data == b'':
 | 
				
			||||||
 | 
					                                break
 | 
				
			||||||
 | 
					                            p_bar.update(file.write(data))
 | 
				
			||||||
 | 
					                            if ZSpotify.get_config(DOWNLOAD_REAL_TIME):
 | 
				
			||||||
 | 
					                                if chunk == 0:
 | 
				
			||||||
 | 
					                                    pause = get_segment_duration(p_bar)
 | 
				
			||||||
 | 
					                                if pause:
 | 
				
			||||||
 | 
					                                    time.sleep(pause)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    convert_audio_format(filename)
 | 
					                    convert_audio_format(filename)
 | 
				
			||||||
                    set_audio_tags(filename, artists, name, album_name,
 | 
					                    set_audio_tags(filename, artists, name, album_name,
 | 
				
			||||||
@ -121,6 +129,18 @@ def download_track(track_id: str, extra_paths='', prefix=False, prefix_value='',
 | 
				
			|||||||
                os.remove(filename)
 | 
					                os.remove(filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_segment_duration(segment):
 | 
				
			||||||
 | 
					    """ Returns playback duration of given audio segment """
 | 
				
			||||||
 | 
					    sound = AudioSegment(
 | 
				
			||||||
 | 
					        data = segment,
 | 
				
			||||||
 | 
					        sample_width = 2,
 | 
				
			||||||
 | 
					        frame_rate = 44100,
 | 
				
			||||||
 | 
					        channels = 2
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    duration = len(sound) / 5000
 | 
				
			||||||
 | 
					    return duration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def convert_audio_format(filename) -> None:
 | 
					def convert_audio_format(filename) -> None:
 | 
				
			||||||
    """ Converts raw audio into playable file """
 | 
					    """ Converts raw audio into playable file """
 | 
				
			||||||
    temp_filename = f'{os.path.splitext(filename)[0]}.tmp'
 | 
					    temp_filename = f'{os.path.splitext(filename)[0]}.tmp'
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user