diff --git a/lib/sc/track.go b/lib/sc/track.go index c9a8c3d..284c72a 100644 --- a/lib/sc/track.go +++ b/lib/sc/track.go @@ -82,6 +82,13 @@ type Stream struct { URL string `json:"url"` } +type Comment struct { + Kind string `json:"kind"` // "comment" + Body string `json:"body"` + Timestamp int `json:"timestamp"` + Author User `json:"user"` +} + func (m Media) SelectCompatible(mode string, opus bool) (*Transcoding, string) { switch mode { case cfg.AudioBest: @@ -484,7 +491,7 @@ func RecentTracks(cid string, prefs cfg.Preferences, args string) (*Paginated[*T return &p, nil } -func (t *Track) GetRelated(cid string, prefs cfg.Preferences, args string) (*Paginated[*Track], error) { +func (t Track) GetRelated(cid string, prefs cfg.Preferences, args string) (*Paginated[*Track], error) { p := Paginated[*Track]{ Next: "https://" + api + "/tracks/" + string(t.ID) + "/related" + args, } @@ -502,7 +509,7 @@ func (t *Track) GetRelated(cid string, prefs cfg.Preferences, args string) (*Pag return &p, nil } -func (t *Track) GetPlaylists(cid string, prefs cfg.Preferences, args string) (*Paginated[*Playlist], error) { +func (t Track) GetPlaylists(cid string, prefs cfg.Preferences, args string) (*Paginated[*Playlist], error) { p := Paginated[*Playlist]{ Next: "https://" + api + "/tracks/" + string(t.ID) + "/playlists_without_albums" + args, } @@ -520,7 +527,7 @@ func (t *Track) GetPlaylists(cid string, prefs cfg.Preferences, args string) (*P return &p, nil } -func (t *Track) GetAlbums(cid string, prefs cfg.Preferences, args string) (*Paginated[*Playlist], error) { +func (t Track) GetAlbums(cid string, prefs cfg.Preferences, args string) (*Paginated[*Playlist], error) { p := Paginated[*Playlist]{ Next: "https://" + api + "/tracks/" + string(t.ID) + "/albums" + args, } @@ -537,3 +544,21 @@ func (t *Track) GetAlbums(cid string, prefs cfg.Preferences, args string) (*Pagi return &p, nil } + +func (t Track) GetComments(cid string, prefs cfg.Preferences, args string) (*Paginated[*Comment], error) { + p := Paginated[*Comment]{ + Next: "https://" + api + "/tracks/" + string(t.ID) + "/comments" + args, + } + + err := p.Proceed(cid, true) + if err != nil { + return nil, err + } + + for _, p := range p.Collection { + p.Author.Fix(false) + p.Author.Postfix(prefs) + } + + return &p, nil +} diff --git a/lib/sc/user.go b/lib/sc/user.go index 4de8754..ff5876c 100644 --- a/lib/sc/user.go +++ b/lib/sc/user.go @@ -335,7 +335,7 @@ func (u *User) GetWebProfiles(cid string) error { return json.Unmarshal(data, &u.WebProfiles) } -func (u *User) GetRelated(cid string, prefs cfg.Preferences) ([]*User, error) { +func (u User) GetRelated(cid string, prefs cfg.Preferences) ([]*User, error) { p := Paginated[*User]{ Next: "https://" + api + "/users/" + string(u.ID) + "/relatedartists?page_size=20", } @@ -353,7 +353,7 @@ func (u *User) GetRelated(cid string, prefs cfg.Preferences) ([]*User, error) { return p.Collection, nil } -func (u *User) GetTopTracks(cid string, prefs cfg.Preferences) ([]*Track, error) { +func (u User) GetTopTracks(cid string, prefs cfg.Preferences) ([]*Track, error) { p := Paginated[*Track]{ Next: "https://" + api + "/users/" + string(u.ID) + "/toptracks?limit=10", } diff --git a/main.go b/main.go index f589fd3..5427a0d 100644 --- a/main.go +++ b/main.go @@ -757,8 +757,17 @@ func main() { } } + var comments *sc.Paginated[*sc.Comment] + if q := c.Query("pagination"); q != "" { + comments, err = track.GetComments(cid, prefs, q) + if err != nil { + log.Printf("failed to get %s from %s comments: %s\n", c.Params("track"), c.Params("user"), err) + return err + } + } + c.Set("Content-Type", "text/html") - return templates.Base(track.Title+" by "+track.Author.Username, templates.Track(prefs, track, stream, displayErr, c.Query("autoplay") == "true", playlist, nextTrack, c.Query("volume"), mode, audio), templates.TrackHeader(prefs, track, true)).Render(c.RequestCtx(), c) + return templates.Base(track.Title+" by "+track.Author.Username, templates.Track(prefs, track, stream, displayErr, c.Query("autoplay") == "true", playlist, nextTrack, c.Query("volume"), mode, audio, comments), templates.TrackHeader(prefs, track, true)).Render(c.RequestCtx(), c) }) app.Get("/:user", func(c fiber.Ctx) error { @@ -953,11 +962,11 @@ func main() { |___/\___| ⠛⠒⠛⠉⠉⠀⠀⠀⣴⠟⣣⡴⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ~~~~~~~~~~~~~~~~~~~~⠛⠛~~~~~~~~~~~~~~~~~~~~~~~~` fmt.Println(art) + const sep = " :: " - keys := [...]string{"Built from", "ProxyStreams", "ProxyImages", "Restream", "GetWebProfiles", "Listening on"} // maps in go are unordered.. table := map[string]string{ - "Built from": fmt.Sprintf("%s (%s)", cfg.Commit, cfg.CommitURL), + "Built from": fmt.Sprintf("%s (%s)", cfg.Commit, cfg.Repo), "ProxyStreams": boolean(cfg.ProxyStreams), "ProxyImages": boolean(cfg.ProxyStreams), "Restream": boolean(cfg.Restream), @@ -973,11 +982,11 @@ func main() { longest = key } } - longest += " :: " + longest += sep - for _, key := range keys { + for _, key := range [...]string{"Built from", "ProxyStreams", "ProxyImages", "Restream", "GetWebProfiles", "Listening on"} { fmt.Print(key) - fmt.Print(strings.Repeat(" ", len(longest)-len(key)-len(" :: ")) + " :: ") + fmt.Print(strings.Repeat(" ", len(longest)-len(key)-len(sep)) + sep) fmt.Println(table[key]) } diff --git a/templates/track.templ b/templates/track.templ index d1f1297..29943a3 100644 --- a/templates/track.templ +++ b/templates/track.templ @@ -145,7 +145,7 @@ templ TrackItem(track *sc.Track, showUsername bool, overrideHref string) { } } -templ Track(prefs cfg.Preferences, t sc.Track, stream string, displayErr string, autoplay bool, playlist *sc.Playlist, nextTrack *sc.Track, volume string, mode string, audio string) { +templ Track(prefs cfg.Preferences, t sc.Track, stream string, displayErr string, autoplay bool, playlist *sc.Playlist, nextTrack *sc.Track, volume string, mode string, audio string, comments *sc.Paginated[*sc.Comment]) { if t.Artwork != "" { } @@ -197,6 +197,17 @@ templ Track(prefs cfg.Preferences, t sc.Track, stream string, displayErr string, if t.TagList != "" {

Tags: { strings.Join(sc.TagListParser(t.TagList), ", ") }

} +

Comments

+
+ if comments != nil { + for _, c := range comments.Collection { +
+

{c.Author.Username}

+

{c.Body}

+
+ } + } +
} templ TrackEmbed(prefs cfg.Preferences, t sc.Track, stream string, displayErr string) {