Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import spotipy
- import requests
- import pandas as pd
- def playlist_backup(spotify, user_id, playlist_id, cover_art_save_dir = ""):
- playlist = spotify.user_playlist_tracks(user_id, playlist_id)
- playlist_items = playlist["items"]
- df = pd.DataFrame(columns = ["track", "artists" , "album", "datetime_added", "duration_ms", "track_URI", "album_URI"])
- while playlist["next"]:
- playlist = spotify.next(playlist)
- playlist_items.extend(playlist["items"])
- for element in playlist_items:
- if cover_art_save_dir: save_cover(element, cover_art_save_dir)
- df.loc[len(df)] = [element["track"]["name"], # track
- ", ".join([artist["name"] for artist in element["track"]["artists"]]), # artists
- element["track"]["album"]["name"], # album
- element["added_at"], # datetime_added
- element["track"]["duration_ms"], # duration_ms
- element["track"]["uri"], # track_URI
- element["track"]["album"]["uri"],] # album_URI
- df.to_json(os.path.join(os.path.dirname(__file__), "playlist.json"), orient="split")
- def save_cover(playlist_element, save_dir):
- album_uri = playlist_element["track"]["album"]["id"]
- album_title = playlist_element["track"]["album"]["name"]
- cover_url = playlist_element["track"]["album"]["images"][0]["url"]
- album_filename = clean_filename(album_title)
- full_save_path = os.path.join(save_dir, album_uri + "_" + album_filename + ".jpg")
- if not os.path.isfile(full_save_path):
- response = requests.get(cover_url)
- with open(full_save_path, "wb") as f:
- f.write(response.content)
- def clean_filename(filename):
- replacer_map = {"#": "no.", "%": "percent", "&": "and", "{": "(", "}": ")", "\\": "-", "<": "(", ">": ")", "*": "X", "?": "", "!": "", "$": "", " ": "_", "/": "-", "'": "", '"': "", ":": "_-", "@": "at", "+": "plus", "|": "-", "=": "equals", "`": "",}
- for symbol in replacer_map.keys():
- filename = filename.replace(symbol, replacer_map[symbol])
- return filename
- sp = spotipy.Spotify(client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials())
- playlist_backup(sp, "n58k0fnejbizfknk4i4m76mkt", "2YvcU4kgVHhFSQSmbO6cUS", "") # "/home/tomo/Downloads/cover_art/")
- """
- https://spotipy.readthedocs.io/en/2.22.1/
- https://www.youtube.com/watch?v=3RGm4jALukM
- https://github.com/spotipy-dev/spotipy/issues/246#issuecomment-891805828
- https://developer.spotify.com/dashboard/2bbe2fd984d5441f96de1cb006841db7/settings
- https://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables (.bashrc)
- export SPOTIPY_CLIENT_ID=2bbe2fd984d5441f96de1cb006841db7
- export SPOTIPY_CLIENT_SECRET=...
- export SPOTIPY_REDIRECT_URI=https://localhost:8888/callback
- Example of element in playlist_items:
- {'added_at': '2021-09-16T23:18:40Z',
- 'added_by': {'external_urls': {'spotify': 'https://open.spotify.com/user/n58k0fnejbizfknk4i4m76mkt'},
- 'href': 'https://api.spotify.com/v1/users/n58k0fnejbizfknk4i4m76mkt',
- 'id': 'n58k0fnejbizfknk4i4m76mkt',
- 'type': 'user',
- 'uri': 'spotify:user:n58k0fnejbizfknk4i4m76mkt'},
- 'is_local': False,
- 'primary_color': None,
- 'track': {'album': {'album_group': 'album',
- 'album_type': 'album',
- 'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/7M1FPw29m5FbicYzS2xdpi'},
- 'href': 'https://api.spotify.com/v1/artists/7M1FPw29m5FbicYzS2xdpi',
- 'id': '7M1FPw29m5FbicYzS2xdpi',
- 'name': 'King Crimson',
- 'type': 'artist',
- 'uri': 'spotify:artist:7M1FPw29m5FbicYzS2xdpi'}],
- 'available_markets': [],
- 'external_urls': {'spotify': 'https://open.spotify.com/album/5wec5BciMpDMzlEFpYeHse'},
- 'href': 'https://api.spotify.com/v1/albums/5wec5BciMpDMzlEFpYeHse',
- 'id': '5wec5BciMpDMzlEFpYeHse',
- 'images': [{'height': 640,
- 'url': 'https://i.scdn.co/image/ab67616d0000b2739f2179592d196f575b7a0ff5',
- 'width': 640},
- {'height': 300,
- 'url': 'https://i.scdn.co/image/ab67616d00001e029f2179592d196f575b7a0ff5',
- 'width': 300},
- {'height': 64,
- 'url': 'https://i.scdn.co/image/ab67616d000048519f2179592d196f575b7a0ff5',
- 'width': 64}],
- 'is_playable': True,
- 'name': 'In The Court Of The Crimson King (Expanded & Remastered Original Album Mix)',
- 'release_date': '1969-10-10',
- 'release_date_precision': 'day',
- 'total_tracks': 8,
- 'type': 'album',
- 'uri': 'spotify:album:5wec5BciMpDMzlEFpYeHse'},
- 'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/7M1FPw29m5FbicYzS2xdpi'},
- 'href': 'https://api.spotify.com/v1/artists/7M1FPw29m5FbicYzS2xdpi',
- 'id': '7M1FPw29m5FbicYzS2xdpi',
- 'name': 'King Crimson',
- 'type': 'artist',
- 'uri': 'spotify:artist:7M1FPw29m5FbicYzS2xdpi'}],
- 'available_markets': [],
- 'disc_number': 1,
- 'duration_ms': 442580,
- 'episode': False,
- 'explicit': False,
- 'external_ids': {'isrc': 'GBCTX1400800'},
- 'external_urls': {'spotify': 'https://open.spotify.com/track/5yClziwiwTdqRmdPQl3NDz'},
- 'href': 'https://api.spotify.com/v1/tracks/5yClziwiwTdqRmdPQl3NDz',
- 'id': '5yClziwiwTdqRmdPQl3NDz',
- 'is_local': False,
- 'name': '21st Century Schizoid Man',
- 'popularity': 0,
- 'preview_url': None,
- 'track': True,
- 'track_number': 1,
- 'type': 'track',
- 'uri': 'spotify:track:5yClziwiwTdqRmdPQl3NDz'},
- 'video_thumbnail': {'url': None}}
- If multiple artists per track, element["track"]["artists"] looks like so:
- 'artists': [{'external_urls': {'spotify': 'https://open.spotify.com/artist/29XOeO6KIWxGthejQqn793'},
- 'href': 'https://api.spotify.com/v1/artists/29XOeO6KIWxGthejQqn793',
- 'id': '29XOeO6KIWxGthejQqn793',
- 'name': 'Flying Lotus',
- 'type': 'artist',
- 'uri': 'spotify:artist:29XOeO6KIWxGthejQqn793'},
- {'external_urls': {'spotify': 'https://open.spotify.com/artist/4CvTDPKA6W06DRfBnZKrau'},
- 'href': 'https://api.spotify.com/v1/artists/4CvTDPKA6W06DRfBnZKrau',
- 'id': '4CvTDPKA6W06DRfBnZKrau',
- 'name': 'Thom Yorke',
- 'type': 'artist',
- 'uri': 'spotify:artist:4CvTDPKA6W06DRfBnZKrau'}]
- """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement