Mixonomer/music/tasks/refresh_lastfm_stats.py

119 lines
3.6 KiB
Python
Raw Normal View History

2019-10-19 20:35:37 +01:00
from google.cloud import firestore
import logging
from datetime import datetime
import music.db.database as database
from spotfm.maths.counter import Counter
from spotframework.model.uri import Uri
db = firestore.Client()
logger = logging.getLogger(__name__)
def refresh_lastfm_track_stats(username, playlist_name):
2019-10-19 20:35:37 +01:00
logger.info(f'refreshing {playlist_name} stats for {username}')
fmnet = database.get_authed_lastfm_network(username=username)
spotnet = database.get_authed_spotify_network(username=username)
counter = Counter(fmnet=fmnet, spotnet=spotnet)
2019-10-23 14:44:17 +01:00
playlist = database.get_playlist(username=username, name=playlist_name)
2019-10-19 20:35:37 +01:00
if playlist is None:
logger.critical(f'playlist {playlist_name} for {username} not found')
return
if playlist.uri is None:
logger.critical(f'playlist {playlist_name} for {username} has no spotify uri')
return
2019-10-23 14:44:17 +01:00
spotify_playlist = spotnet.get_playlist(uri=Uri(playlist.uri))
2019-10-20 16:32:10 +01:00
track_count = counter.count_playlist(playlist=spotify_playlist)
2019-10-19 20:35:37 +01:00
user_count = fmnet.get_user_scrobble_count()
2019-10-23 14:44:17 +01:00
if user_count > 0:
percent = round((track_count * 100) / user_count, 2)
else:
percent = 0
2019-10-19 20:35:37 +01:00
2019-10-23 14:44:17 +01:00
playlist.update_database({
2019-10-20 16:32:10 +01:00
'lastfm_stat_count': track_count,
2019-10-19 20:35:37 +01:00
'lastfm_stat_percent': percent,
'lastfm_stat_last_refresh': datetime.utcnow()
})
def refresh_lastfm_album_stats(username, playlist_name):
logger.info(f'refreshing {playlist_name} stats for {username}')
fmnet = database.get_authed_lastfm_network(username=username)
spotnet = database.get_authed_spotify_network(username=username)
counter = Counter(fmnet=fmnet, spotnet=spotnet)
2019-10-23 14:44:17 +01:00
playlist = database.get_playlist(username=username, name=playlist_name)
if playlist is None:
logger.critical(f'playlist {playlist_name} for {username} not found')
return
if playlist.uri is None:
logger.critical(f'playlist {playlist_name} for {username} has no spotify uri')
return
2019-10-23 14:44:17 +01:00
spotify_playlist = spotnet.get_playlist(uri=Uri(playlist.uri))
album_count = counter.count_playlist(playlist=spotify_playlist, query_album=True)
user_count = fmnet.get_user_scrobble_count()
2019-10-23 14:44:17 +01:00
if user_count > 0:
album_percent = round((album_count * 100) / user_count, 2)
else:
album_percent = 0
2019-10-23 14:44:17 +01:00
playlist.update_database({
'lastfm_stat_album_count': album_count,
2019-10-20 16:32:10 +01:00
'lastfm_stat_album_percent': album_percent,
'lastfm_stat_last_refresh': datetime.utcnow()
})
def refresh_lastfm_artist_stats(username, playlist_name):
logger.info(f'refreshing {playlist_name} stats for {username}')
fmnet = database.get_authed_lastfm_network(username=username)
spotnet = database.get_authed_spotify_network(username=username)
counter = Counter(fmnet=fmnet, spotnet=spotnet)
2019-10-23 14:44:17 +01:00
playlist = database.get_playlist(username=username, name=playlist_name)
if playlist is None:
logger.critical(f'playlist {playlist_name} for {username} not found')
return
if playlist.uri is None:
logger.critical(f'playlist {playlist_name} for {username} has no spotify uri')
return
2019-10-23 14:44:17 +01:00
spotify_playlist = spotnet.get_playlist(uri=Uri(playlist.uri))
artist_count = counter.count_playlist(playlist=spotify_playlist, query_artist=True)
user_count = fmnet.get_user_scrobble_count()
2019-10-23 14:44:17 +01:00
if user_count > 0:
artist_percent = round((artist_count * 100) / user_count, 2)
else:
artist_percent = 0
2019-10-23 14:44:17 +01:00
playlist.update_database({
'lastfm_stat_artist_count': artist_count,
2019-10-20 16:32:10 +01:00
'lastfm_stat_artist_percent': artist_percent,
2019-10-19 20:35:37 +01:00
'lastfm_stat_last_refresh': datetime.utcnow()
})