feat: show total LB play count on artist detail page

Added GetArtistPlayCount(mbid) — fetches ArtistPopularity from LB
for a single MBID and returns the total listen count. Fire-and-forget
call on the artist page, displays below the meta line as
'1.3M plays on ListenBrainz' (uses existing formatListenCount).
This commit is contained in:
2026-03-30 08:29:58 -04:00
parent 2825373c3c
commit a2cb72c0f1
4 changed files with 36 additions and 0 deletions
+11
View File
@@ -224,6 +224,17 @@ func (e *Service) SimilarArtists(artistMBID string) ([]LBSimilarArtist, error) {
return e.lb.SimilarArtists(e.ctx, artistMBID)
}
// GetArtistPlayCount returns the total LB listen count for an artist.
// Returns 0 if unknown.
func (e *Service) GetArtistPlayCount(artistMBID string) int {
pop, err := e.lb.ArtistPopularity(e.ctx, []string{artistMBID})
if err != nil || len(pop) == 0 {
return 0
}
return pop[artistMBID]
}
// ---------------------------------------------------------------------------
// Cover Art Archive
// ---------------------------------------------------------------------------
@@ -8,6 +8,7 @@ import {
TopReleaseGroupsForArtist,
SimilarArtists,
GetArtistImageURL,
GetArtistPlayCount,
CheckLibraryMBIDs,
} from '@go/explore/Service';
import type {
@@ -99,6 +100,7 @@ export class ExploreArtistDetails extends LitElement {
@state() private artistImageURL = '';
@state() private similarImageURLs = new Map<string, string>();
@state() private topSectionExpanded = false;
@state() private artistPlayCount = 0;
private libraryMBIDs = new Set<string>();
/* ── Styles ── */
@@ -669,6 +671,9 @@ export class ExploreArtistDetails extends LitElement {
this.fetchArtistImage(mbid);
}
// Play count is fire-and-forget.
this.fetchArtistPlayCount(mbid);
// Check which release groups are in the local library.
this.checkLibrary();
@@ -834,6 +839,17 @@ export class ExploreArtistDetails extends LitElement {
}
}
private async fetchArtistPlayCount(mbid: string) {
try {
const count = await GetArtistPlayCount(mbid);
if (count > 0) {
this.artistPlayCount = count;
}
} catch {
// Non-critical.
}
}
private async checkLibrary() {
const mbids: string[] = [];
@@ -1026,6 +1042,9 @@ export class ExploreArtistDetails extends LitElement {
? html`<div class="artist-native-name">${this.artist.name}</div>`
: nothing}
${this.renderArtistMeta()}
${this.artistPlayCount > 0
? html`<span class="artist-meta">${formatListenCount(this.artistPlayCount)} plays on ListenBrainz</span>`
: nothing}
</div>
</div>
<div class="content">
+2
View File
@@ -19,6 +19,8 @@ export function GetArtistImages(arg1:Array<string>):Promise<Record<string, strin
export function GetArtistMBID(arg1:string):Promise<string>;
export function GetArtistPlayCount(arg1:string):Promise<number>;
export function GetThumbnail(arg1:string,arg2:string,arg3:string):Promise<string>;
export function GetThumbnails(arg1:Array<explore.ThumbnailRequest>):Promise<Record<string, string>>;
+4
View File
@@ -34,6 +34,10 @@ export function GetArtistMBID(arg1) {
return window['go']['explore']['Service']['GetArtistMBID'](arg1);
}
export function GetArtistPlayCount(arg1) {
return window['go']['explore']['Service']['GetArtistPlayCount'](arg1);
}
export function GetThumbnail(arg1, arg2, arg3) {
return window['go']['explore']['Service']['GetThumbnail'](arg1, arg2, arg3);
}