Scorch/events.py

91 lines
2.7 KiB
Python
Raw Permalink Normal View History

2020-06-15 09:57:23 -04:00
#!/usr/bin/env python3
"""
WebSocket events.
"""
2020-06-16 08:58:47 -04:00
import os
2020-06-15 09:57:23 -04:00
import types
2020-06-16 08:58:47 -04:00
from urllib import parse
import config
async def select_artist(request, ws, data):
"""Select an artist."""
artist = data.get('artist', '')
async with request.app['pool'].acquire() as conn:
albums = await conn.fetch(
"SELECT DISTINCT album, date FROM track "
"WHERE albumartist = $1 ORDER BY date ASC",
data.get('artist', ''))
albums = [dict(record) for record in albums]
ret = {'event': 'artist_albums', 'ok': True, 'data': albums}
await ws.send_json(ret)
async def select_album(request, ws, data):
"""Select an album."""
artist = data.get('artist', '')
album = data.get('album', '')
2020-10-05 11:51:43 -04:00
date = data.get('date', '')
2020-06-16 08:58:47 -04:00
async with request.app['pool'].acquire() as conn:
tracks = await conn.fetch(
2020-10-05 11:51:43 -04:00
"SELECT * FROM track "
"WHERE albumartist = $1 AND album = $2 AND date = $3"
2020-06-16 08:58:47 -04:00
"ORDER BY discnumber ASC, tracknumber ASC",
2020-10-05 11:51:43 -04:00
artist, album, date)
2020-06-16 08:58:47 -04:00
tracks = [dict(record) for record in tracks]
2020-10-05 11:51:43 -04:00
for track in tracks:
track.pop('filepath')
track.pop('last_modified')
2020-06-16 08:58:47 -04:00
ret = {'event': 'album_tracks', 'ok': True, 'data': tracks}
await ws.send_json(ret)
async def select_track(request, ws, data):
"""Select a track."""
artist = data.get('artist', '')
album = data.get('album', '')
2020-10-05 11:51:43 -04:00
date = data.get('date', '')
2020-06-16 08:58:47 -04:00
discnumber = data.get('discnumber', '')
tracknumber = data.get('tracknumber', '')
async with request.app['pool'].acquire() as conn:
track = await conn.fetchrow(
"SELECT * FROM track "
2020-10-05 11:51:43 -04:00
"WHERE albumartist = $1 AND album = $2 AND date = $3 "
"AND discnumber = $4 AND tracknumber = $5",
artist, album, date, discnumber, tracknumber)
2020-06-16 08:58:47 -04:00
track = dict(track)
fpath = track.pop('filepath')
track.pop('last_modified')
fpath = config.static_prefix + os.path.relpath(fpath, config.music_dir)
fpath = fpath.replace('flac', 'opus')
fpath = parse.quote(fpath)
track['url'] = fpath
2020-06-16 09:58:00 -04:00
coverart = parse.urljoin(fpath, 'folder.jpg')
track['coverart'] = coverart
2020-06-16 08:58:47 -04:00
ret = {'event': 'track', 'ok': True, 'data': track}
await ws.send_json(ret)
2020-06-15 09:57:23 -04:00
2020-06-16 09:13:12 -04:00
async def random_track(request, ws, data):
"""Select a random track."""
async with request.app['pool'].acquire() as conn:
track = await conn.fetchrow(
"SELECT * FROM TRACK ORDER BY random() LIMIT 1")
track = dict(track)
fpath = track.pop('filepath')
track.pop('last_modified')
fpath = config.static_prefix + os.path.relpath(fpath, config.music_dir)
2020-06-16 09:58:00 -04:00
fpath = fpath.replace('.flac', '.opus')
2020-06-16 09:13:12 -04:00
fpath = parse.quote(fpath)
track['url'] = fpath
2020-06-16 09:58:00 -04:00
coverart = parse.urljoin(fpath, 'folder.jpg')
track['coverart'] = coverart
2020-06-16 09:13:12 -04:00
ret = {'event': 'track', 'ok': True, 'data': track}
await ws.send_json(ret)
2020-06-15 09:57:23 -04:00
events = {}
for obj in dir():
if type(locals()[obj]) == types.FunctionType:
events[locals()[obj].__name__] = locals()[obj]