Add scrobble count to each artist/album/song view

This commit is contained in:
mitteneer 2025-03-25 15:44:40 -04:00
parent 7ee3abe857
commit 4adbd59e12
7 changed files with 32 additions and 16 deletions

View file

@ -17,8 +17,8 @@
// internet connectivity. // internet connectivity.
.dependencies = .{ .dependencies = .{
.jetzig = .{ .jetzig = .{
.url = "https://github.com/jetzig-framework/jetzig/archive/d3157e4247211091127daba88a2552af3be8f5ed.tar.gz", .url = "https://github.com/jetzig-framework/jetzig/archive/2c52792217b9441ed5e91d67e7ec5a8959285307.tar.gz",
.hash = "jetzig-0.0.0-IpAgLe0QDwC-6XH_ElHKUmPGxGxr1XdgiLeHEalerM7B", .hash = "jetzig-0.0.0-IpAgLbMeDwDYRqWu0OJixGbcDUoUbfAN0xGe1xsYRHTj",
}, },
.zeit = .{ .zeit = .{
.url = "https://github.com/rockorager/zeit/archive/refs/heads/main.tar.gz", .url = "https://github.com/rockorager/zeit/archive/refs/heads/main.tar.gz",

View file

@ -206,13 +206,20 @@ pub const Albumsong = jetquery.Model(
}, },
); );
pub const Scrobbleartist = jetquery.Model(@This(), "Scrobbleartists", struct { pub const Scrobbleartist = jetquery.Model(
@This(),
"Scrobbleartists",
struct {
id: i32, id: i32,
scrobble_id: i32, scrobble_id: i32,
artist_id: i32, artist_id: i32,
created_at: jetquery.DateTime, created_at: jetquery.DateTime,
updated_at: jetquery.DateTime, updated_at: jetquery.DateTime,
}, .{ .relations = .{ },
.{
.relations = .{
.scrobble = jetquery.belongsTo(.Scrobble, .{}), .scrobble = jetquery.belongsTo(.Scrobble, .{}),
.artist = jetquery.belongsTo(.Artist, .{}), .artist = jetquery.belongsTo(.Artist, .{}),
} }); },
},
);

View file

@ -23,9 +23,11 @@ pub fn get(id: []const u8, request: *jetzig.Request) !jetzig.View {
const query = jetzig.database.Query(.Albumsong).include(.song, .{ .select = .{ .name, .id } }).join(.inner, .album).where(.{ .album = .{ .id = id } }); const query = jetzig.database.Query(.Albumsong).include(.song, .{ .select = .{ .name, .id } }).join(.inner, .album).where(.{ .album = .{ .id = id } });
const songs = try request.repo.all(query); const songs = try request.repo.all(query);
for (songs) |song| { for (songs) |song| {
const scrobbles = try jetzig.database.Query(.Scrobble).where(.{ .song_id = song.song.id }).count().execute(request.repo);
var song_view = try songs_view.append(.object); var song_view = try songs_view.append(.object);
try song_view.put("name", song.song.name); try song_view.put("name", song.song.name);
try song_view.put("url", song.song.id); try song_view.put("url", song.song.id);
try song_view.put("scrobbles", scrobbles);
} }
return request.render(.ok); return request.render(.ok);
} }

View file

@ -12,6 +12,7 @@
@for (.songs) |song| { @for (.songs) |song| {
<tr> <tr>
<td class=cell><a href="/songs/{{song.url}}">{{song.name}}</a></td> <td class=cell><a href="/songs/{{song.url}}">{{song.name}}</a></td>
<td class=cell>{{song.scrobbles}}</td>
</tr> </tr>
} }
</table> </table>

View file

@ -8,11 +8,13 @@ pub fn index(request: *jetzig.Request) !jetzig.View {
const query = jetzig.database.Query(.Artist).select(.{}).orderBy(.{ .name = .asc }); const query = jetzig.database.Query(.Artist).select(.{}).orderBy(.{ .name = .asc });
const artists = try request.repo.all(query); const artists = try request.repo.all(query);
for (artists) |artist| { for (artists) |artist| {
const scrobbles = try jetzig.database.Query(.Scrobbleartist).where(.{ .artist_id = artist.id }).count().execute(request.repo);
var artist_view = try artists_view.append(.object); var artist_view = try artists_view.append(.object);
//const output = try request.allocator.dupe(u8, artist.name); //const output = try request.allocator.dupe(u8, artist.name);
//std.mem.replaceScalar(u8, output, ' ', '_'); //std.mem.replaceScalar(u8, output, ' ', '_');
try artist_view.put("name", artist.name); try artist_view.put("name", artist.name);
try artist_view.put("url", artist.id); try artist_view.put("url", artist.id);
try artist_view.put("scrobbles", scrobbles);
} }
return request.render(.ok); return request.render(.ok);
@ -23,7 +25,10 @@ pub fn get(id: []const u8, request: *jetzig.Request) !jetzig.View {
var root = try request.data(.object); var root = try request.data(.object);
try root.put("artist", artist.?.name); try root.put("artist", artist.?.name);
var albums_view = try root.put("albums", .array); var albums_view = try root.put("albums", .array);
const query = jetzig.database.Query(.Albumartist).include(.album, .{ .select = .{ .name, .id } }).join(.inner, .artist).where(.{ .artist = .{ .id = id } }); const query = jetzig.database.Query(.Albumartist)
.include(.album, .{ .select = .{ .name, .id } })
.join(.inner, .artist)
.where(.{ .artist = .{ .id = id } });
//const query = jetzig.database.Query(.Albumartist) //const query = jetzig.database.Query(.Albumartist)
// .select(.{ .artist_id, jetquery.sql.count(.album_id) }) // .select(.{ .artist_id, jetquery.sql.count(.album_id) })
@ -32,13 +37,13 @@ pub fn get(id: []const u8, request: *jetzig.Request) !jetzig.View {
const albums = try request.repo.all(query); const albums = try request.repo.all(query);
for (albums) |album| { for (albums) |album| {
//const scrobbles = try jetzig.database.Query(.Scrobble).where(.{ .album_id = album.album.id }).count().execute(request.repo); const scrobbles = try jetzig.database.Query(.Scrobble).where(.{ .album_id = album.album.id }).count().execute(request.repo);
var album_view = try albums_view.append(.object); var album_view = try albums_view.append(.object);
try album_view.put("name", album.album.name); try album_view.put("name", album.album.name);
try album_view.put("url", album.album.id); try album_view.put("url", album.album.id);
//try album_view.put("name", album.count__album_id); //try album_view.put("name", album.count__album_id);
//try album_view.put("url", album.count__album_id); //try album_view.put("url", album.count__album_id);
try album_view.put("scrobbles", 6); try album_view.put("scrobbles", scrobbles);
//std.log.debug("{s}", .{album.album.name}); //std.log.debug("{s}", .{album.album.name});
} }
return request.render(.ok); return request.render(.ok);

View file

@ -12,7 +12,7 @@
@for (.albums) |album| { @for (.albums) |album| {
<tr> <tr>
<td class=cell><a href="/albums/{{album.url}}">{{album.name}}</a></td> <td class=cell><a href="/albums/{{album.url}}">{{album.name}}</a></td>
<td calss=cell>{{album.scrobbles}}</td> <td class=cell>{{album.scrobbles}}</td>
</tr> </tr>
} }
</table> </table>

View file

@ -12,6 +12,7 @@
@for (.artists) |artist| { @for (.artists) |artist| {
<tr> <tr>
<td class=cell><a href="/artists/{{artist.url}}">{{artist.name}}</a></td> <td class=cell><a href="/artists/{{artist.url}}">{{artist.name}}</a></td>
<td class=cell>{{artist.scrobbles}}</td>
</tr> </tr>
} }
</table> </table>