Skip to content

Instantly share code, notes, and snippets.

@shatteringlass
Last active November 19, 2020 15:02
Show Gist options
  • Save shatteringlass/cbec23b5fc91ba879ba2352de5166044 to your computer and use it in GitHub Desktop.
Save shatteringlass/cbec23b5fc91ba879ba2352de5166044 to your computer and use it in GitHub Desktop.
import csv
import json
import os
import requests
import sys
class SpotifyWebApiClient:
def __init__(self):
self.token = os.environ.get("SPOTIFY_OAUTH_TOKEN")
self.api = "https://api.spotify.com/v1"
def request(self, endpoint, query, method='GET'):
url = "{api}/{endpoint}?{query}".format(
api=self.api, endpoint=endpoint, query=query)
headers = {"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": "Bearer {token}".format(token=self.token)}
r = requests.request(method=method, url=url, headers=headers)
if r.status_code == requests.codes.ok:
return r.json()
else:
print(r)
raise Exception
def get_saved_albums(self, offset=0, limit=50):
query = "offset={offset}&limit={limit}".format(
offset=offset, limit=limit)
r = self.request(endpoint="me/albums", query=query)
total = r["total"]
print("Total saved albums: {}.".format(total))
items = r["items"]
page = [dict(artist=i["album"]["artists"][0]["name"],
title=i["album"]["name"]) for i in items]
if len(page) == 0:
print("Nothing more to download. Exiting.")
return page
else:
return page + self.get_saved_albums(offset=offset+limit+1)
def save_albums(self, ids):
if not(ids):
print("No IDs provided.")
return
runs = list()
how_many = len(ids)//50 + 1*(len(ids) % 50 != 0)
for i in range(how_many):
ids[50*i:(i+1)*50]
r = self.request(method='PUT', endpoint="me/albums",
query="ids={ids}".format(ids=','.join(ids)))
runs.append(r)
return runs
def get_release(self, album, artist):
print("Now querying for release: {} - {}".format(artist, album))
query = "query=album%3A{album}+artist%3A{artist}&type=album&market=IT&offset=0&limit=1".format(
album=album, artist=artist)
r = self.request(endpoint="search", query=query)
try:
return r["albums"]["items"][0]
except IndexError:
return dict()
@staticmethod
def get_release_id(release):
return release.get("id", None)
@staticmethod
def get_item_link(item):
return item["external_urls"]["spotify"]
def save_entries(entries):
swac = SpotifyWebApiClient()
ids = filter(None, [SpotifyWebApiClient.get_release_id(
swac.get_release(*entry)) for entry in entries])
result = swac.save_albums(ids=ids)
print("Success" if result else "Failed")
def main():
src_file = os.environ.get('SRC_FILE')
with open(src_file, 'r') as fp:
entries = [(x['title'], x['artist']) for x in json.load(fp)]
save_entries(entries)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment