added stats console app
This commit is contained in:
parent
2f44c3b655
commit
517accec38
57
config/uri_groups.json
Normal file
57
config/uri_groups.json
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "surgical summer",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"name": "daytona",
|
||||||
|
"uri": "spotify:album:07bIdDDe3I3hhWpxU6tuBp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ye",
|
||||||
|
"uri": "spotify:album:2Ek1q2haOnxVqhvVKqMvJe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ksg",
|
||||||
|
"uri": "spotify:album:6pwuKxMUkNg673KETsXPUV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nasir",
|
||||||
|
"uri": "spotify:album:66EwBbt2kPgugo8Wz0SKAw"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "k.t.s.e",
|
||||||
|
"uri": "spotify:album:0mwf6u9KVhZDCNVyIi6JuU"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "madlib",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"name": "pinata",
|
||||||
|
"uri": "spotify:album:43uErencdmuTRFZPG3zXL1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bandana - single",
|
||||||
|
"uri": "spotify:album:5Bc89b9FsoOrEZf0HLS812"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bandana",
|
||||||
|
"uri": "spotify:album:31KbO7WnDp2AjPdmRTJzdf"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "freddie",
|
||||||
|
"members": [
|
||||||
|
{
|
||||||
|
"name": "freddie",
|
||||||
|
"uri": "spotify:artist:0Y4inQK6OespitzD6ijMwb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fetti",
|
||||||
|
"uri": "spotify:album:3JgtFZroTUGoklTtb2xOne"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
73
spotfm/maths/stats.py
Normal file
73
spotfm/maths/stats.py
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
from cmd import Cmd
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
|
||||||
|
from spotframework.net.network import Network as Spotnet
|
||||||
|
from spotframework.engine.playlistengine import PlaylistEngine
|
||||||
|
from spotframework.model.uri import Uri
|
||||||
|
from fmframework.net.network import Network as Fmnet
|
||||||
|
from spotfm.maths.counter import Counter
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Stats(Cmd):
|
||||||
|
intro = 'Stats... ? for help'
|
||||||
|
prompt = '(stats)> '
|
||||||
|
|
||||||
|
def __init__(self, spotnet: Spotnet, fmnet: Fmnet):
|
||||||
|
Cmd.__init__(self)
|
||||||
|
self.spotnet = spotnet
|
||||||
|
self.fmnet = fmnet
|
||||||
|
self.counter = Counter(spotnet=spotnet, fmnet=fmnet)
|
||||||
|
|
||||||
|
def do_count(self, arg):
|
||||||
|
"""count spotify uri on last.fm"""
|
||||||
|
|
||||||
|
in_string = arg
|
||||||
|
|
||||||
|
if in_string is None or len(in_string) < 2:
|
||||||
|
in_string = input('uri group/uri>')
|
||||||
|
|
||||||
|
user_total = self.fmnet.get_user_scrobble_count()
|
||||||
|
|
||||||
|
total = 0
|
||||||
|
try:
|
||||||
|
uri = Uri(in_string)
|
||||||
|
total = self.counter.count(uri)
|
||||||
|
except ValueError:
|
||||||
|
with open('config/uri_groups.json', 'r') as file_obj:
|
||||||
|
groups = json.load(file_obj)
|
||||||
|
|
||||||
|
group = next((i for i in groups if i['name'] == in_string), None)
|
||||||
|
if group is None:
|
||||||
|
print('group not found')
|
||||||
|
return
|
||||||
|
|
||||||
|
counts = dict()
|
||||||
|
for member in group['members']:
|
||||||
|
try:
|
||||||
|
uri_obj = Uri(member['uri'])
|
||||||
|
iter_count = self.counter.count(uri_obj)
|
||||||
|
|
||||||
|
counts.update({member['name']: iter_count})
|
||||||
|
total += iter_count
|
||||||
|
except ValueError:
|
||||||
|
print(f'malformed uri {uri_obj}')
|
||||||
|
|
||||||
|
[print(f'{name} -> {count:,} scrobbles ({round((count*100)/total)}%)') for name, count in counts.items()]
|
||||||
|
|
||||||
|
print(f'{in_string} -> {total:,} scrobbles ({round((total*100)/user_total, 2)}%)')
|
||||||
|
|
||||||
|
def do_sort(self, arg):
|
||||||
|
|
||||||
|
in_str = arg
|
||||||
|
|
||||||
|
if in_str is None or len(arg) == 0:
|
||||||
|
in_str = input('playlist>')
|
||||||
|
|
||||||
|
if in_str is None or in_str == '':
|
||||||
|
return
|
||||||
|
|
||||||
|
engine = PlaylistEngine(self.spotnet)
|
||||||
|
engine.reorder_playlist_by_added_date(in_str)
|
49
stats_cmd.py
Normal file
49
stats_cmd.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
from spotfm.maths.stats import Stats
|
||||||
|
|
||||||
|
from spotframework.net.network import Network as Spotnet, NetworkUser
|
||||||
|
from fmframework.net.network import Network as Fmnet
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
|
||||||
|
spotframework_logger = logging.getLogger('spotframework')
|
||||||
|
fmframework_logger = logging.getLogger('fmframework')
|
||||||
|
spotfm_logger = logging.getLogger('spotfm')
|
||||||
|
|
||||||
|
log_format = '%(levelname)s %(name)s:%(funcName)s - %(message)s'
|
||||||
|
formatter = logging.Formatter(log_format)
|
||||||
|
|
||||||
|
stream_handler = logging.StreamHandler()
|
||||||
|
stream_handler.setFormatter(formatter)
|
||||||
|
|
||||||
|
# spotframework_logger.addHandler(stream_handler)
|
||||||
|
# fmframework_logger.addHandler(stream_handler)
|
||||||
|
# spotfm_logger.addHandler(stream_handler)
|
||||||
|
|
||||||
|
spot_client = os.environ.get('SPOT_CLIENT')
|
||||||
|
spot_secret = os.environ.get('SPOT_SECRET')
|
||||||
|
spot_access = os.environ.get('SPOT_ACCESS_TOKEN')
|
||||||
|
spot_refresh = os.environ.get('SPOT_REFRESH_TOKEN')
|
||||||
|
fmclient = os.environ.get('FM_CLIENT')
|
||||||
|
fmuser = os.environ.get('FM_USER')
|
||||||
|
|
||||||
|
if spot_access is None and spot_refresh is None:
|
||||||
|
print('no spotify credentials')
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
if fmclient is None:
|
||||||
|
print('no last.fm credentials')
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
spotnet = Spotnet(NetworkUser(client_id=spot_client,
|
||||||
|
client_secret=spot_secret,
|
||||||
|
access_token=spot_access,
|
||||||
|
refresh_token=spot_refresh).refresh_access_token())
|
||||||
|
|
||||||
|
while len(fmuser) == 0:
|
||||||
|
fmuser = input('last.fm username> ')
|
||||||
|
|
||||||
|
fmnet = Fmnet(username=fmuser, api_key=fmclient)
|
||||||
|
|
||||||
|
prompt = Stats(spotnet=spotnet, fmnet=fmnet)
|
||||||
|
prompt.cmdloop()
|
Loading…
Reference in New Issue
Block a user