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), ", ") }
} +{c.Body}
+