[WIP] get comments on track

This commit is contained in:
Laptop
2025-01-03 14:06:29 +02:00
parent 7796f81da6
commit 9f227eadc7
4 changed files with 57 additions and 12 deletions

View File

@@ -82,6 +82,13 @@ type Stream struct {
URL string `json:"url"` 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) { func (m Media) SelectCompatible(mode string, opus bool) (*Transcoding, string) {
switch mode { switch mode {
case cfg.AudioBest: case cfg.AudioBest:
@@ -484,7 +491,7 @@ func RecentTracks(cid string, prefs cfg.Preferences, args string) (*Paginated[*T
return &p, nil 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]{ p := Paginated[*Track]{
Next: "https://" + api + "/tracks/" + string(t.ID) + "/related" + args, 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 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]{ p := Paginated[*Playlist]{
Next: "https://" + api + "/tracks/" + string(t.ID) + "/playlists_without_albums" + args, 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 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]{ p := Paginated[*Playlist]{
Next: "https://" + api + "/tracks/" + string(t.ID) + "/albums" + args, 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 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
}

View File

@@ -335,7 +335,7 @@ func (u *User) GetWebProfiles(cid string) error {
return json.Unmarshal(data, &u.WebProfiles) 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]{ p := Paginated[*User]{
Next: "https://" + api + "/users/" + string(u.ID) + "/relatedartists?page_size=20", 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 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]{ p := Paginated[*Track]{
Next: "https://" + api + "/users/" + string(u.ID) + "/toptracks?limit=10", Next: "https://" + api + "/users/" + string(u.ID) + "/toptracks?limit=10",
} }

21
main.go
View File

@@ -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") 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 { app.Get("/:user", func(c fiber.Ctx) error {
@@ -953,11 +962,11 @@ func main() {
|___/\___| ⠛⠒⠛⠉⠉⠀⠀⠀⣴⠟⣣⡴⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ |___/\___| ⠛⠒⠛⠉⠉⠀⠀⠀⣴⠟⣣⡴⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
~~~~~~~~~~~~~~~~~~~~⠛⠛~~~~~~~~~~~~~~~~~~~~~~~~` ~~~~~~~~~~~~~~~~~~~~⠛⠛~~~~~~~~~~~~~~~~~~~~~~~~`
fmt.Println(art) fmt.Println(art)
const sep = " :: "
keys := [...]string{"Built from", "ProxyStreams", "ProxyImages", "Restream", "GetWebProfiles", "Listening on"}
// maps in go are unordered.. // maps in go are unordered..
table := map[string]string{ 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), "ProxyStreams": boolean(cfg.ProxyStreams),
"ProxyImages": boolean(cfg.ProxyStreams), "ProxyImages": boolean(cfg.ProxyStreams),
"Restream": boolean(cfg.Restream), "Restream": boolean(cfg.Restream),
@@ -973,11 +982,11 @@ func main() {
longest = key 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(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]) fmt.Println(table[key])
} }

View File

@@ -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 != "" { if t.Artwork != "" {
<img src={ t.Artwork } width="300px"/> <img src={ t.Artwork } width="300px"/>
} }
@@ -197,6 +197,17 @@ templ Track(prefs cfg.Preferences, t sc.Track, stream string, displayErr string,
if t.TagList != "" { if t.TagList != "" {
<p>Tags: { strings.Join(sc.TagListParser(t.TagList), ", ") }</p> <p>Tags: { strings.Join(sc.TagListParser(t.TagList), ", ") }</p>
} }
<h1>Comments</h1>
<div>
if comments != nil {
for _, c := range comments.Collection {
<div>
<h3>{c.Author.Username}</h3>
<p>{c.Body}</p>
</div>
}
}
</div>
} }
templ TrackEmbed(prefs cfg.Preferences, t sc.Track, stream string, displayErr string) { templ TrackEmbed(prefs cfg.Preferences, t sc.Track, stream string, displayErr string) {