add top albums and top tracks widgets to profile

This commit is contained in:
2026-03-02 22:50:30 -08:00
parent 6e0e53eb64
commit 56475df1a0
7 changed files with 600 additions and 3 deletions

View File

@@ -38,6 +38,13 @@ type ProfileData struct {
TopArtistsPeriod string
TopArtistsLimit int
TopArtistsView string
TopAlbums []db.TopAlbum
TopAlbumsPeriod string
TopAlbumsLimit int
TopAlbumsView string
TopTracks []db.TopTrack
TopTracksPeriod string
TopTracksLimit int
}
// Render a page of the profile in the URL
@@ -155,6 +162,129 @@ func profilePageHandler() http.HandlerFunc {
profileData.TopArtists = topArtists
}
albumPeriod := r.URL.Query().Get("album_period")
if albumPeriod == "" {
albumPeriod = "all_time"
}
var albumStartDate, albumEndDate *time.Time
albumNow := time.Now()
switch albumPeriod {
case "week":
start := albumNow.AddDate(0, 0, -7)
albumStartDate = &start
case "month":
start := albumNow.AddDate(0, -1, 0)
albumStartDate = &start
case "year":
start := albumNow.AddDate(-1, 0, 0)
albumStartDate = &start
case "custom":
albumStartStr := r.URL.Query().Get("album_start")
albumEndStr := r.URL.Query().Get("album_end")
if albumStartStr != "" {
if t, err := time.Parse("2006-01-02", albumStartStr); err == nil {
albumStartDate = &t
}
}
if albumEndStr != "" {
if t, err := time.Parse("2006-01-02", albumEndStr); err == nil {
t = t.AddDate(0, 0, 1)
albumEndDate = &t
}
}
}
albumLimitStr := r.URL.Query().Get("album_limit")
albumLimit := 10
if albumLimitStr != "" {
albumLimit, err = strconv.Atoi(albumLimitStr)
if err != nil || albumLimit < 5 {
albumLimit = 10
}
if albumLimit > 30 {
albumLimit = 30
}
}
albumView := r.URL.Query().Get("album_view")
if albumView == "" {
albumView = "grid"
}
albumMaxLimit := 30
if albumView == "grid" {
albumMaxLimit = 8
}
if albumLimit > albumMaxLimit {
albumLimit = albumMaxLimit
}
profileData.TopAlbumsPeriod = albumPeriod
profileData.TopAlbumsLimit = albumLimit
profileData.TopAlbumsView = albumView
topAlbums, err := db.GetTopAlbums(userId, albumLimit, albumStartDate, albumEndDate)
if err != nil {
fmt.Fprintf(os.Stderr, "Cannot get top albums: %v\n", err)
} else {
profileData.TopAlbums = topAlbums
}
trackPeriod := r.URL.Query().Get("track_period")
if trackPeriod == "" {
trackPeriod = "all_time"
}
var trackStartDate, trackEndDate *time.Time
trackNow := time.Now()
switch trackPeriod {
case "week":
start := trackNow.AddDate(0, 0, -7)
trackStartDate = &start
case "month":
start := trackNow.AddDate(0, -1, 0)
trackStartDate = &start
case "year":
start := trackNow.AddDate(-1, 0, 0)
trackStartDate = &start
case "custom":
trackStartStr := r.URL.Query().Get("track_start")
trackEndStr := r.URL.Query().Get("track_end")
if trackStartStr != "" {
if t, err := time.Parse("2006-01-02", trackStartStr); err == nil {
trackStartDate = &t
}
}
if trackEndStr != "" {
if t, err := time.Parse("2006-01-02", trackEndStr); err == nil {
t = t.AddDate(0, 0, 1)
trackEndDate = &t
}
}
}
trackLimitStr := r.URL.Query().Get("track_limit")
trackLimit := 10
if trackLimitStr != "" {
trackLimit, err = strconv.Atoi(trackLimitStr)
if err != nil || trackLimit < 5 {
trackLimit = 10
}
if trackLimit > 30 {
trackLimit = 30
}
}
profileData.TopTracksPeriod = trackPeriod
profileData.TopTracksLimit = trackLimit
topTracks, err := db.GetTopTracks(userId, trackLimit, trackStartDate, trackEndDate)
if err != nil {
fmt.Fprintf(os.Stderr, "Cannot get top tracks: %v\n", err)
} else {
profileData.TopTracks = topTracks
}
if pageInt == 1 {
if np, ok := scrobble.GetNowPlaying(userId); ok {
profileData.NowPlayingArtist = np.Artist