Mixonomer/spotify/db/part_generator.py

75 lines
2.3 KiB
Python

from google.cloud import firestore
import spotify.db.database as database
import logging
db = firestore.Client()
logger = logging.getLogger(__name__)
class PartGenerator:
def __init__(self, user_id=None, username=None):
self.queried_playlists = []
self.parts = []
if user_id:
self.user_id = user_id
elif username:
user_doc = database.get_user_doc_ref(username)
if user_doc:
self.user_id = user_doc.id
else:
raise LookupError(f'{username} not found')
else:
raise NameError('no user info provided')
def reset(self):
self.queried_playlists = []
self.parts = []
def get_recursive_parts(self, name):
logger.info(f'getting part from {name} for {self.user_id}')
self.reset()
self.process_reference_by_name(name)
return [i for i in {i for i in self.parts}]
def process_reference_by_name(self, name):
playlist_query = [i for i in
database.get_user_playlists_collection(self.user_id).where(u'name', u'==', name).stream()]
if len(playlist_query) > 0:
if len(playlist_query) == 1:
if playlist_query[0].id not in self.queried_playlists:
playlist_doc = playlist_query[0].to_dict()
self.parts += playlist_doc['parts']
for i in playlist_doc['playlist_references']:
if i.id not in self.queried_playlists:
self.process_reference_by_reference(i)
else:
logger.warning(f'playlist reference {name} already queried')
else:
logger.warning(f"multiple {name}'s found")
else:
logger.warning(f'playlist reference {name} not found')
def process_reference_by_reference(self, ref):
if ref.id not in self.queried_playlists:
playlist_reference_object = ref.get().to_dict()
self.parts += playlist_reference_object['parts']
for i in playlist_reference_object['playlist_references']:
self.process_reference_by_reference(i)
else:
logger.warning(f'playlist reference {ref.get().to_dict()["name"]} already queried')