Mixonomer/spotify/tasks/play_user_playlist.py

103 lines
3.5 KiB
Python
Raw Normal View History

2019-08-12 00:34:04 +01:00
from google.cloud import firestore
import datetime
import logging
from spotframework.engine.playlistengine import PlaylistEngine
from spotframework.engine.filter.shuffle import Shuffle
2019-09-04 17:45:25 +01:00
from spotframework.engine.filter.sort import SortReverseReleaseDate
from spotframework.engine.filter.deduplicate import DeduplicateByID
2019-08-12 00:34:04 +01:00
from spotframework.net.network import Network
2019-09-04 17:45:25 +01:00
from spotframework.net.user import NetworkUser
2019-08-12 00:34:04 +01:00
import spotify.db.database as database
from spotify.db.part_generator import PartGenerator
2019-08-12 00:34:04 +01:00
db = firestore.Client()
captured_playlists = []
logger = logging.getLogger(__name__)
2019-08-12 00:34:04 +01:00
def play_user_playlist(username,
playlist_type='default',
parts=None,
playlists=None,
shuffle=False,
include_recommendations=True,
recommendation_sample=10,
day_boundary=10,
add_this_month=False,
add_last_month=False):
2019-08-12 00:34:04 +01:00
users = database.get_user_query_stream(username)
2019-08-12 00:34:04 +01:00
logger.info(f'playing for {username}')
2019-08-12 00:34:04 +01:00
if len(users) == 1:
user_dict = users[0].to_dict()
if parts is None and playlists is None:
2019-08-12 00:34:04 +01:00
logger.critical(f'no playlists to use for creation ({username})')
return None
if parts is None:
parts = []
if playlists is None:
playlists = []
2019-08-12 00:34:04 +01:00
if len(parts) == 0 and len(playlists) == 0:
logger.critical(f'no playlists to use for creation ({username})')
return None
2019-08-12 00:34:04 +01:00
spotify_keys = db.document('key/spotify').get().to_dict()
2019-09-04 17:45:25 +01:00
net = Network(NetworkUser(spotify_keys['clientid'],
spotify_keys['clientsecret'],
user_dict['access_token'],
user_dict['refresh_token']))
2019-08-12 00:34:04 +01:00
engine = PlaylistEngine(net)
engine.load_user_playlists()
processors = [DeduplicateByID()]
if shuffle:
processors.append(Shuffle())
else:
processors.append(SortReverseReleaseDate())
submit_parts = parts
part_generator = PartGenerator(user_id=users[0].id)
2019-08-12 00:34:04 +01:00
for part in playlists:
submit_parts += part_generator.get_recursive_parts(part)
2019-08-12 00:34:04 +01:00
submit_parts = [i for i in {j for j in submit_parts}]
if playlist_type == 'recents':
boundary_date = datetime.datetime.now() - datetime.timedelta(days=int(day_boundary))
tracks = engine.get_recent_playlist(boundary_date,
submit_parts,
processors,
include_recommendations=include_recommendations,
recommendation_limit=int(recommendation_sample),
add_this_month=add_this_month,
add_last_month=add_last_month)
2019-08-12 00:34:04 +01:00
else:
tracks = engine.make_playlist(submit_parts,
processors,
include_recommendations=include_recommendations,
recommendation_limit=int(recommendation_sample))
2019-09-04 17:45:25 +01:00
net.play(uris=[i.uri for i in tracks])
2019-08-12 00:34:04 +01:00
else:
logger.critical(f'multiple/no user(s) found ({username})')
return None