From 375f79cf4b7286cac3e1411a834cb23d3b4821a6 Mon Sep 17 00:00:00 2001 From: iou1name Date: Thu, 30 Jan 2025 09:14:31 -0500 Subject: [PATCH] add select_albums() functions --- database.py | 21 +++++++++++++++++++++ pyrite.py | 7 +++++++ static/pyrite.js | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/database.py b/database.py index af5862a..b43596b 100644 --- a/database.py +++ b/database.py @@ -42,6 +42,27 @@ async def get_artists(request): return artists +async def get_albums(request, albumartist): + """Return all albums associated with a particular albumartist.""" + print(albumartist) + async with request.app.state.db_pool.acquire() as conn: + albums = await conn.fetch( + "SELECT DISTINCT ON (album, date) filepath, album, date " + "FROM track " + "WHERE albumartist = $1 ORDER BY date", + albumartist + ) + albums_ = [] + for album in albums: + album = dict(album) + fpath = album.pop('filepath') + cpath = os.path.join(os.path.dirname(fpath), 'folder-64x64.jpg') + album['cover_art_path'] = convert_filepath(cpath) + albums_.append(album) + return albums_ + + + def convert_filepath(path): """Convert a filepath to a URL.""" path = os.path.relpath(path, config.music_dir) diff --git a/pyrite.py b/pyrite.py index 0d53bdb..db119f8 100644 --- a/pyrite.py +++ b/pyrite.py @@ -35,6 +35,13 @@ async def get_rand_track(request: Request): return track +@app.get("/albums/") +async def get_albums(request: Request, albumartist: str): + """Return all albums associated with a particular albumartist.""" + albums = await db.get_albums(request, albumartist) + return albums + + @app.on_event("startup") async def startup(): app.state.db_pool = await asyncpg.create_pool(**config.db) diff --git a/static/pyrite.js b/static/pyrite.js index 4db29fa..0443abc 100644 --- a/static/pyrite.js +++ b/static/pyrite.js @@ -46,6 +46,54 @@ async function get_rand_track() { return data; } +async function select_artist(event) { + let artist = event.target.value; + + let q = new URLSearchParams(); + q.set('albumartist', artist); + let res = await fetch("./albums/?" + q.toString()); + let data = await res.json(); + + populate_albums(data); +} + +function populate_albums(data) { + clear_albums(); + clear_tracks(); + for (let i = 0; i < data.length; i++) { + let album = document.importNode(document.querySelector('#album_template').content, true); + album.querySelector('label').setAttribute('for', 'album_' + i); + album.querySelector('input').setAttribute('id', 'album_' + i); + album.querySelector('input').setAttribute('value', data[i]['album']); + album.querySelector('img').setAttribute('src', data[i]['cover_art_path']); + album.querySelector('.album_name').textContent = data[i]['album']; + album.querySelector('.album_year').textContent = data[i]['date']; + + document.querySelector('#album_list').appendChild(album); + } +} + +function clear_tracks() { + let tracks = document.querySelector('#track_list'); + while (tracks.firstChild) { + tracks.removeChild(tracks.lastChild); + } +} + +function clear_albums() { + let albums = document.querySelector('#album_list'); + while (albums.firstChild) { + albums.removeChild(albums.lastChild); + } +} + +function clear_artists() { + let artists = document.querySelector('#artist_list'); + while (artists.firstChild) { + artists.removeChild(artists.lastChild); + } +} + async function nextTrack() { track = await get_rand_track(); player.src = track.source; @@ -157,6 +205,7 @@ function volume_restore() { document.querySelector('#vol-off-btn').style.display = 'none'; } +// --- visualizer --- function select_visualizer(event) { if (event.target.value == 'bar_graph') { bar_graph();