class Ingestor(): def __init__(self, client_id=None, client_secret=None, dbURl=None, db_user=None, db_password=None): # spotipy Client flow if client_id is None: client_id = CLIENT_ID if client_secret is None: client_secret = CLIENT_SECRET self.client_id = client_id self.client_secret = client_secret self.client_creds = SpotifyClientCredentials( client_id=self.client_id, client_secret=self.client_secret) # creeate spotipy client self.spotipy = Spotify(auth=self.client_creds.get_access_token()) self.connector = DBConnector() def ingest(self): self.ingest_categories() def get_artist_by_name(self, name): """Retrives a list of artist obecjts based on searching for the artist name""" q = 'artist:' + name return self.spotipy.search(q, limit=10, offset=0, type='artist', market=None)['artists']['items'] def ingest_related_artist(self, artist_id, limit=NUM_REL_ARTISTS, _depth=0): """Recursively ingest artist related to a specific artist. Artist must already be in DB.""" # TODO: check if artist DNE and insert if so self.connector.update_artist(artist_id, 'ingested', 'true') ara = self.spotipy.artist_related_artists(artist_id) for i, a in enumerate(ara['artists']): if i > limit: break self.connector.insert_artist(a) self.connector.insert_related_relation(artist_id, a['id']) if _depth > 0: self.ingest_related_artist(a['id'], _depth - 1) def ingest_by_name(self, name): """Ingests the first artist from the search of on artist by name into the database""" res = self.get_artist_by_name(name)[0] self.connector.insert_artist(res) def ingest_by_id(self, artist_id): """Ingest artist by id""" res = self.spotipy.artist(artist_id) self.connector.insert_artist(res) def ingest_categories(self): """Ingest categories from spotifies list of categories""" print("Pull categories from API") categories = self.spotipy.categories()['categories']['items'] for c in tqdm(categories, desc='Inserting categories'): self.connector.insert_category(c) self.ingest_category_playlist(c['id']) def ingest_category_playlist(self, category_id): # This is a list of playlists try: play_lists = self.spotipy.category_playlists( category_id)['playlists']['items'] except SpotifyException as e: print('Category %s play list ingestion failed' % category_id) else: for p in tqdm(play_lists, desc='Insertiing Category playlists'): self.connector.insert_playlist(p) # TODO: insert playlist category relation # category id and p['id'] # TODO: ingest tracks # p['tracks'] def clear_database(self): """Clears the database this ingerstor is connected to.""" # TODO: add warning self.connector.clear_database()