add select album and tracks functions
This commit is contained in:
parent
375f79cf4b
commit
6aa1254da1
23
database.py
23
database.py
@ -44,7 +44,6 @@ async def get_artists(request):
|
|||||||
|
|
||||||
async def get_albums(request, albumartist):
|
async def get_albums(request, albumartist):
|
||||||
"""Return all albums associated with a particular albumartist."""
|
"""Return all albums associated with a particular albumartist."""
|
||||||
print(albumartist)
|
|
||||||
async with request.app.state.db_pool.acquire() as conn:
|
async with request.app.state.db_pool.acquire() as conn:
|
||||||
albums = await conn.fetch(
|
albums = await conn.fetch(
|
||||||
"SELECT DISTINCT ON (album, date) filepath, album, date "
|
"SELECT DISTINCT ON (album, date) filepath, album, date "
|
||||||
@ -52,16 +51,30 @@ async def get_albums(request, albumartist):
|
|||||||
"WHERE albumartist = $1 ORDER BY date",
|
"WHERE albumartist = $1 ORDER BY date",
|
||||||
albumartist
|
albumartist
|
||||||
)
|
)
|
||||||
albums_ = []
|
albums = [dict(a) for a in albums]
|
||||||
for album in albums:
|
for album in albums:
|
||||||
album = dict(album)
|
|
||||||
fpath = album.pop('filepath')
|
fpath = album.pop('filepath')
|
||||||
cpath = os.path.join(os.path.dirname(fpath), 'folder-64x64.jpg')
|
cpath = os.path.join(os.path.dirname(fpath), 'folder-64x64.jpg')
|
||||||
album['cover_art_path'] = convert_filepath(cpath)
|
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):
|
def convert_filepath(path):
|
||||||
"""Convert a filepath to a URL."""
|
"""Convert a filepath to a URL."""
|
||||||
|
@ -42,6 +42,13 @@ async def get_albums(request: Request, albumartist: str):
|
|||||||
return albums
|
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")
|
@app.on_event("startup")
|
||||||
async def startup():
|
async def startup():
|
||||||
app.state.db_pool = await asyncpg.create_pool(**config.db)
|
app.state.db_pool = await asyncpg.create_pool(**config.db)
|
||||||
|
@ -57,6 +57,42 @@ async function select_artist(event) {
|
|||||||
populate_albums(data);
|
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) {
|
function populate_albums(data) {
|
||||||
clear_albums();
|
clear_albums();
|
||||||
clear_tracks();
|
clear_tracks();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user