mirror of
https://git.maid.zone/stuff/soundcloak.git
synced 2025-12-10 13:49:39 +05:00
see user followers, who the user follows and popular tracks of user
This commit is contained in:
@@ -28,7 +28,7 @@ type User struct {
|
||||
FullName string `json:"full_name"`
|
||||
Kind string `json:"kind"` // should always be "user"!
|
||||
LastModified string `json:"last_modified"`
|
||||
//Liked int `json:"likes_count"`
|
||||
Liked int64 `json:"likes_count"`
|
||||
Permalink string `json:"permalink"`
|
||||
Playlists int64 `json:"playlist_count"`
|
||||
Tracks int64 `json:"track_count"`
|
||||
@@ -330,3 +330,85 @@ func (u *User) GetWebProfiles() error {
|
||||
|
||||
return json.Unmarshal(data, &u.WebProfiles)
|
||||
}
|
||||
|
||||
func (u *User) GetRelated(prefs cfg.Preferences) ([]*User, error) {
|
||||
cid, err := GetClientID()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
p := Paginated[*User]{
|
||||
Next: "https://" + api + "/users/" + u.ID + "/relatedartists?page_size=20&client_id=" + cid,
|
||||
}
|
||||
|
||||
err = p.Proceed(true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, u := range p.Collection {
|
||||
u.Fix(false)
|
||||
u.Postfix(prefs)
|
||||
}
|
||||
|
||||
return p.Collection, nil
|
||||
}
|
||||
|
||||
func (u *User) GetTopTracks(prefs cfg.Preferences) ([]*Track, error) {
|
||||
cid, err := GetClientID()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
p := Paginated[*Track]{
|
||||
Next: "https://" + api + "/users/" + u.ID + "/toptracks?client_id=" + cid,
|
||||
}
|
||||
|
||||
err = p.Proceed(true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, t := range p.Collection {
|
||||
t.Fix(false, false)
|
||||
t.Postfix(prefs, false)
|
||||
}
|
||||
|
||||
return p.Collection, nil
|
||||
}
|
||||
|
||||
func (u User) GetFollowers(prefs cfg.Preferences, args string) (*Paginated[*User], error) {
|
||||
p := Paginated[*User]{
|
||||
Next: "https://" + api + "/users/" + u.ID + "/followers" + args,
|
||||
}
|
||||
|
||||
err := p.Proceed(true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, u := range p.Collection {
|
||||
u.Fix(false)
|
||||
u.Postfix(prefs)
|
||||
}
|
||||
|
||||
return &p, nil
|
||||
}
|
||||
|
||||
func (u User) GetFollowing(prefs cfg.Preferences, args string) (*Paginated[*User], error) {
|
||||
p := Paginated[*User]{
|
||||
Next: "https://" + api + "/users/" + u.ID + "/followings" + args,
|
||||
}
|
||||
|
||||
err := p.Proceed(true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, u := range p.Collection {
|
||||
u.Fix(false)
|
||||
u.Postfix(prefs)
|
||||
}
|
||||
|
||||
return &p, nil
|
||||
}
|
||||
|
||||
92
main.go
92
main.go
@@ -344,6 +344,75 @@ func main() {
|
||||
return templates.Base(user.Username, templates.UserLikes(prefs, user, p), templates.UserHeader(user)).Render(context.Background(), c)
|
||||
})
|
||||
|
||||
app.Get("/:user/popular-tracks", func(c *fiber.Ctx) error {
|
||||
prefs, err := preferences.Get(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
user, err := sc.GetUser(c.Params("user"))
|
||||
if err != nil {
|
||||
log.Printf("error getting %s (popular-tracks): %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
user.Postfix(prefs)
|
||||
|
||||
p, err := user.GetTopTracks(prefs)
|
||||
if err != nil {
|
||||
log.Printf("error getting %s popular tracks: %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
|
||||
c.Set("Content-Type", "text/html")
|
||||
return templates.Base(user.Username, templates.UserTopTracks(prefs, user, p), templates.UserHeader(user)).Render(context.Background(), c)
|
||||
})
|
||||
|
||||
app.Get("/:user/followers", func(c *fiber.Ctx) error {
|
||||
prefs, err := preferences.Get(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
user, err := sc.GetUser(c.Params("user"))
|
||||
if err != nil {
|
||||
log.Printf("error getting %s (followers): %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
user.Postfix(prefs)
|
||||
|
||||
p, err := user.GetFollowers(prefs, c.Query("pagination", "?limit=20"))
|
||||
if err != nil {
|
||||
log.Printf("error getting %s followers: %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
|
||||
c.Set("Content-Type", "text/html")
|
||||
return templates.Base(user.Username, templates.UserFollowers(prefs, user, p), templates.UserHeader(user)).Render(context.Background(), c)
|
||||
})
|
||||
|
||||
app.Get("/:user/following", func(c *fiber.Ctx) error {
|
||||
prefs, err := preferences.Get(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
user, err := sc.GetUser(c.Params("user"))
|
||||
if err != nil {
|
||||
log.Printf("error getting %s (following): %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
user.Postfix(prefs)
|
||||
|
||||
p, err := user.GetFollowing(prefs, c.Query("pagination", "?limit=20"))
|
||||
if err != nil {
|
||||
log.Printf("error getting %s following: %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
|
||||
c.Set("Content-Type", "text/html")
|
||||
return templates.Base(user.Username, templates.UserFollowing(prefs, user, p), templates.UserHeader(user)).Render(context.Background(), c)
|
||||
})
|
||||
|
||||
app.Get("/:user/:track", func(c *fiber.Ctx) error {
|
||||
prefs, err := preferences.Get(c)
|
||||
if err != nil {
|
||||
@@ -486,5 +555,28 @@ func main() {
|
||||
return templates.Base(playlist.Title+" by "+playlist.Author.Username, templates.Playlist(prefs, playlist), templates.PlaylistHeader(playlist)).Render(context.Background(), c)
|
||||
})
|
||||
|
||||
app.Get("/:user/_/related", func(c *fiber.Ctx) error {
|
||||
prefs, err := preferences.Get(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
user, err := sc.GetUser(c.Params("user"))
|
||||
if err != nil {
|
||||
log.Printf("error getting %s (related): %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
user.Postfix(prefs)
|
||||
|
||||
r, err := user.GetRelated(prefs)
|
||||
if err != nil {
|
||||
log.Printf("error getting %s related users: %s\n", c.Params("user"), err)
|
||||
return err
|
||||
}
|
||||
|
||||
c.Set("Content-Type", "text/html")
|
||||
return templates.Base(user.Username, templates.UserRelated(prefs, user, r), templates.UserHeader(user)).Render(context.Background(), c)
|
||||
})
|
||||
|
||||
log.Fatal(app.Listen(cfg.Addr))
|
||||
}
|
||||
|
||||
@@ -63,8 +63,9 @@ templ UserBase(prefs cfg.Preferences, u sc.User) {
|
||||
@Description(prefs, u.Description, nil)
|
||||
}
|
||||
<div>
|
||||
<p>{ strconv.FormatInt(u.Followers, 10) } followers</p>
|
||||
<p>{ strconv.FormatInt(u.Following, 10) } following</p>
|
||||
<p><a class="link" href={templ.URL("/" + u.Permalink + "/followers")}>{ strconv.FormatInt(u.Followers, 10) } followers</a></p>
|
||||
<p><a class="link" href={templ.URL("/" + u.Permalink + "/following")}>{ strconv.FormatInt(u.Following, 10) } followings</a></p>
|
||||
<p><a class="link" href={templ.URL("/" + u.Permalink + "/likes")}>{ strconv.FormatInt(u.Liked, 10) } liked</a></p>
|
||||
<p>{ strconv.FormatInt(u.Tracks, 10) } tracks</p>
|
||||
<p>{ strconv.FormatInt(u.Playlists, 10) } playlists & albums</p>
|
||||
<br/>
|
||||
@@ -82,7 +83,7 @@ type btn struct {
|
||||
templ UserButtons(current string, user string) {
|
||||
<div class="btns">
|
||||
// this part is the tedious one now, because formatting breaks if i space the list out with newlines
|
||||
for _, b := range [6]btn{{"tracks", "", false},{"playlists", "/sets",false},{"albums", "/albums", false},{"reposts","/reposts", false},{"likes", "/likes", false},{"view on soundcloud", "https://soundcloud.com/"+user, true}} {
|
||||
for _, b := range [7]btn{{"tracks", "", false},{"popular tracks", "/popular-tracks", false},{"playlists", "/sets",false},{"albums", "/albums", false},{"reposts","/reposts", false},{"related", "/_/related", false},{"view on soundcloud", "https://soundcloud.com/"+user, true}} {
|
||||
if b.text == current {
|
||||
<a class="btn active">{ b.text }</a>
|
||||
} else {
|
||||
@@ -176,8 +177,8 @@ templ UserReposts(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.Repost])
|
||||
|
||||
templ UserLikes(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.Like]) {
|
||||
@UserBase(prefs, u)
|
||||
@UserButtons("likes", u.Permalink)
|
||||
<br/>
|
||||
@UserButtons("", u.Permalink)
|
||||
<h1>Likes</h1>
|
||||
if len(p.Collection) != 0 {
|
||||
<div>
|
||||
for _, like := range p.Collection {
|
||||
@@ -196,6 +197,72 @@ templ UserLikes(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.Like]) {
|
||||
}
|
||||
}
|
||||
|
||||
templ UserRelated(prefs cfg.Preferences, u sc.User, r []*sc.User) {
|
||||
@UserBase(prefs, u)
|
||||
@UserButtons("related", u.Permalink)
|
||||
<br/>
|
||||
if len(r) != 0 {
|
||||
<div>
|
||||
for _, u := range r {
|
||||
@UserItem(u)
|
||||
}
|
||||
</div>
|
||||
} else {
|
||||
<span>no related users</span>
|
||||
}
|
||||
}
|
||||
|
||||
templ UserTopTracks(prefs cfg.Preferences, u sc.User, t []*sc.Track) {
|
||||
@UserBase(prefs, u)
|
||||
@UserButtons("popular-tracks", u.Permalink)
|
||||
<br/>
|
||||
if len(t) != 0 {
|
||||
<div>
|
||||
for _, track := range t {
|
||||
@TrackItem(track, false, "")
|
||||
}
|
||||
</div>
|
||||
} else {
|
||||
<span>no popular tracks</span>
|
||||
}
|
||||
}
|
||||
|
||||
templ UserFollowers(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.User]) {
|
||||
@UserBase(prefs, u)
|
||||
@UserButtons("", u.Permalink)
|
||||
<h1>Followers</h1>
|
||||
if len(p.Collection) != 0 {
|
||||
<div>
|
||||
for _, user := range p.Collection {
|
||||
@UserItem(user)
|
||||
}
|
||||
</div>
|
||||
if p.Next != "" && len(p.Collection) != int(p.Total) {
|
||||
<a class="btn" href={ templ.URL("?pagination=" + url.QueryEscape(strings.Split(p.Next, "/followers")[1])) } rel="noreferrer">more users</a>
|
||||
}
|
||||
} else {
|
||||
<span>no more users</span>
|
||||
}
|
||||
}
|
||||
|
||||
templ UserFollowing(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.User]) {
|
||||
@UserBase(prefs, u)
|
||||
@UserButtons("", u.Permalink)
|
||||
<h1>Following</h1>
|
||||
if len(p.Collection) != 0 {
|
||||
<div>
|
||||
for _, user := range p.Collection {
|
||||
@UserItem(user)
|
||||
}
|
||||
</div>
|
||||
if p.Next != "" && len(p.Collection) != int(p.Total) {
|
||||
<a class="btn" href={ templ.URL("?pagination=" + url.QueryEscape(strings.Split(p.Next, "/following")[1])) } rel="noreferrer">more users</a>
|
||||
}
|
||||
} else {
|
||||
<span>no more users</span>
|
||||
}
|
||||
}
|
||||
|
||||
templ SearchUsers(p *sc.Paginated[*sc.User]) {
|
||||
<span>Found { strconv.FormatInt(p.Total, 10) } users</span>
|
||||
<br/>
|
||||
|
||||
Reference in New Issue
Block a user