kopia lustrzana https://github.com/Michael-K-Stein/SpotiFile
Merge branch 'feature/autoscrape_playlist_metadata' into dev
commit
eccfcb7600
|
@ -24,6 +24,7 @@ VERIFY_SSL = True
|
||||||
FULL_DOWNLOAD_RECURISVE_LIMIT = 0x4000
|
FULL_DOWNLOAD_RECURISVE_LIMIT = 0x4000
|
||||||
FULL_DOWNLOAD_THREAD_LIMIT = 50
|
FULL_DOWNLOAD_THREAD_LIMIT = 50
|
||||||
VERBOSE_OUTPUTS = False
|
VERBOSE_OUTPUTS = False
|
||||||
|
AUTO_DOWNLOAD_PLAYLIST_METADATA = True
|
||||||
|
|
||||||
DEFAULT_DOWNLOAD_DIRECTORY = 'music'
|
DEFAULT_DOWNLOAD_DIRECTORY = 'music'
|
||||||
ARTIST_IMAGES_SUB_DIR = '_Artists'
|
ARTIST_IMAGES_SUB_DIR = '_Artists'
|
||||||
|
|
|
@ -159,8 +159,7 @@ def download_all_categories_playlists(download_meta_data_only=True):
|
||||||
console.log(f'Scraping playlist data from playlist {playlist_id} ({playlist_index + 1}/{len(playlist_ids)}) from category {category_id} ({category_index + 1}/{len(category_ids)})')
|
console.log(f'Scraping playlist data from playlist {playlist_id} ({playlist_index + 1}/{len(playlist_ids)}) from category {category_id} ({category_index + 1}/{len(category_ids)})')
|
||||||
try:
|
try:
|
||||||
playlist = scraper.get_playlist(playlist_id)
|
playlist = scraper.get_playlist(playlist_id)
|
||||||
with open(f'{DEFAULT_DOWNLOAD_DIRECTORY}/{PLAYLIST_METADATA_SUB_DIR}/{playlist.spotify_id}.playlist', 'w') as f:
|
playlist.export_to_file()
|
||||||
f.write(playlist.export())
|
|
||||||
if not download_meta_data_only:
|
if not download_meta_data_only:
|
||||||
full_download(f'{DEFAULT_DOWNLOAD_DIRECTORY}', identifier=playlist.href)
|
full_download(f'{DEFAULT_DOWNLOAD_DIRECTORY}', identifier=playlist.href)
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
|
|
|
@ -60,7 +60,11 @@ class SpotifyScraper:
|
||||||
tracks += playlist_data['items']
|
tracks += playlist_data['items']
|
||||||
if len(tracks) != int(playlist_data['total']):
|
if len(tracks) != int(playlist_data['total']):
|
||||||
print(f'Warning: track count does not match! {len(tracks)} != {int(playlist_data["tracks"]["total"])}')
|
print(f'Warning: track count does not match! {len(tracks)} != {int(playlist_data["tracks"]["total"])}')
|
||||||
return [SpotifyTrack(track_data) for track_data in tracks]
|
spotify_tracks = [SpotifyTrack(track_data) for track_data in tracks]
|
||||||
|
if AUTO_DOWNLOAD_PLAYLIST_METADATA:
|
||||||
|
playlist = SpotifyPlaylist(playlist_id, spotify_tracks, self.get_playlist_data(playlist_id))
|
||||||
|
playlist.export_to_file()
|
||||||
|
return spotify_tracks
|
||||||
|
|
||||||
def scrape_album(self, album_id: str):
|
def scrape_album(self, album_id: str):
|
||||||
return self._client.get(f'https://api.spotify.com/v1/albums/{album_id}').json()
|
return self._client.get(f'https://api.spotify.com/v1/albums/{album_id}').json()
|
||||||
|
@ -139,6 +143,8 @@ class SpotifyScraper:
|
||||||
category_playlists_json = self.get_category_playlists(category_id, limit=50, offset=current_offset)
|
category_playlists_json = self.get_category_playlists(category_id, limit=50, offset=current_offset)
|
||||||
has_next = category_playlists_json['playlists']['next'] is not None
|
has_next = category_playlists_json['playlists']['next'] is not None
|
||||||
for playlist in category_playlists_json['playlists']['items']:
|
for playlist in category_playlists_json['playlists']['items']:
|
||||||
|
if not playlist:
|
||||||
|
continue
|
||||||
playlist_ids.append(playlist['id'])
|
playlist_ids.append(playlist['id'])
|
||||||
return playlist_ids
|
return playlist_ids
|
||||||
|
|
||||||
|
@ -155,7 +161,10 @@ class SpotifyScraper:
|
||||||
ids.append(category['id'])
|
ids.append(category['id'])
|
||||||
return ids
|
return ids
|
||||||
|
|
||||||
|
def get_playlist_data(self, playlist_id: str) -> str:
|
||||||
|
return self.get(f'https://api.spotify.com/v1/playlists/{playlist_id}').json()
|
||||||
|
|
||||||
def get_playlist(self, playlist_id: str) -> str:
|
def get_playlist(self, playlist_id: str) -> str:
|
||||||
playlist_data = self.get(f'https://api.spotify.com/v1/playlists/{playlist_id}').json()
|
playlist_data = self.get_playlist_data(playlist_id)
|
||||||
tracks = self.scrape_playlist_tracks(playlist_id)
|
tracks = self.scrape_playlist_tracks(playlist_id)
|
||||||
return SpotifyPlaylist(spotify_id=playlist_id, tracks=tracks, data=playlist_data)
|
return SpotifyPlaylist(spotify_id=playlist_id, tracks=tracks, data=playlist_data)
|
||||||
|
|
|
@ -220,6 +220,10 @@ class SpotifyPlaylist:
|
||||||
'track_ids': [track.spotify_id for track in self.tracks]
|
'track_ids': [track.spotify_id for track in self.tracks]
|
||||||
}
|
}
|
||||||
return json.dumps(data)
|
return json.dumps(data)
|
||||||
|
|
||||||
|
def export_to_file(self) -> None:
|
||||||
|
with open(f'{DEFAULT_DOWNLOAD_DIRECTORY}/{PLAYLIST_METADATA_SUB_DIR}/{self.spotify_id}.playlist', 'w') as f:
|
||||||
|
f.write(self.export())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def href(self):
|
def href(self):
|
||||||
|
|
Ładowanie…
Reference in New Issue