diff --git a/database.py b/database.py index b43596b..14b04b0 100644 --- a/database.py +++ b/database.py @@ -44,7 +44,6 @@ async def get_artists(request): 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 " @@ -52,16 +51,30 @@ async def get_albums(request, albumartist): "WHERE albumartist = $1 ORDER BY date", albumartist ) - albums_ = [] + albums = [dict(a) for a in 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_ + return albums +async def get_tracks(request, albumartist, album, date): + """Select an album and return all associated tracks.""" + async with request.app.state.db_pool.acquire() as conn: + tracks = await conn.fetch( + "SELECT * FROM track " + "WHERE albumartist = $1 AND " + "album = $2 AND date = $3 " + "ORDER BY discnumber ASC, tracknumber ASC", + albumartist, album, date + ) + tracks = [dict(t) for t in tracks] + for track in tracks: + track.pop('filepath') + track.pop('last_modified') + return tracks + def convert_filepath(path): """Convert a filepath to a URL.""" diff --git a/pyrite.py b/pyrite.py index db119f8..db3d5ca 100644 --- a/pyrite.py +++ b/pyrite.py @@ -42,6 +42,13 @@ async def get_albums(request: Request, albumartist: str): return albums +@app.get("/tracks/") +async def get_tracks(request: Request, albumartist: str, album: str, date: str): + """Select an album and return all associated tracks.""" + tracks = await db.get_tracks(request, albumartist, album, date) + return tracks + + @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 0443abc..2094def 100644 --- a/static/pyrite.js +++ b/static/pyrite.js @@ -57,6 +57,42 @@ async function select_artist(event) { populate_albums(data); } +async function select_album(event) { + let artist = document.querySelector('input[name=artist]:checked').value; + let album = document.querySelector('input[name=album]:checked').value; + let date = event.srcElement.parentElement.querySelector('.album_year').textContent; + //let playlist = document.querySelector('#playlist').value; + + let q = new URLSearchParams(); + q.set('albumartist', artist); + q.set('album', album); + q.set('date', date); + //q.set('playlist_name', playlist); + let res = await fetch("./tracks/?" + q.toString()); + let data = await res.json(); + + populate_tracks(data); +} + +function populate_tracks(data) { + clear_tracks(); + for (let i = 0; i < data.length; i++) { + let track = document.importNode(document.querySelector('#track_template').content, true); + track.querySelector('label').setAttribute('for', 'track_' + i); + track.querySelector('input').setAttribute('id', 'track_' + i); + track.querySelector('input').setAttribute('value', data[i]['title']); + track.querySelector('.track_num').textContent = data[i]['discnumber'] + '.' + String(data[i]['tracknumber']).padStart(2, '0'); + track.querySelector('.track_title').textContent = data[i]['title']; + let min = Math.floor(Math.round(data[i]['duration']) / 60); + let sec = Math.round(data[i]['duration']) % 60; + sec = String(sec).padStart(2, '0'); + track.querySelector('.track_length').textContent = min + 'm' + sec + 's'; + track.querySelector('.track').dataset.url = data[i]['filepath']; + + document.querySelector('#track_list').appendChild(track); + } +} + function populate_albums(data) { clear_albums(); clear_tracks();