package templates
import (
"git.maid.zone/stuff/soundcloak/lib/cfg"
"git.maid.zone/stuff/soundcloak/lib/sc"
"net/url"
"strconv"
"strings"
)
func toExt(audio string) string {
switch audio {
case cfg.AudioAAC:
return "m4a"
case cfg.AudioOpus:
return "ogg"
case cfg.AudioMP3:
return "mp3"
}
return ""
}
templ TrackButtons(current string, track sc.Track) {
for _, b := range [...]btn{{"related tracks", "/recommended", false, false},{"in albums", "/albums", false, false},{"in playlists", "/sets", false, false},{"track station", "/discover/sets/"+track.Station, true, false},{"view on soundcloud", "https://soundcloud.com"+track.Href(), true, true}} {
{ b.text }
}
}
templ TrackHeader(prefs cfg.Preferences, t sc.Track, needPlayer bool) {
if needPlayer && *prefs.Player == cfg.HLSPlayer {
}
}
func next(c *sc.Track, t *sc.Track, p *sc.Playlist, mode string, volume string) string {
r := t.Href()
if p != nil {
r += "?playlist=" + p.Href()[1:]
if mode != "" {
r += "&mode=" + mode
}
r += "&"
} else {
r += "?"
if c != nil {
r += "prev=" + string(c.ID) + "&"
}
}
r += "autoplay=true"
if volume != "" {
r += "&volume=" + volume
}
return r
}
templ TrackPlayer(prefs cfg.Preferences, track sc.Track, stream string, displayErr string, autoplay bool, nextTrack *sc.Track, playlist *sc.Playlist, volume string, mode string, audio string) {
if *prefs.Player == cfg.NonePlayer {
{{ return }}
}
if displayErr == "" {
{{ var audioPref *string }}
if cfg.Restream && *prefs.Player == cfg.RestreamPlayer {
{{ audioPref = prefs.RestreamAudio }}
if nextTrack != nil {
}
if *prefs.KeepPlayerFocus {
}
} else if stream != "" {
{{ audioPref = prefs.HLSAudio }}
if *prefs.KeepPlayerFocus {
}
JavaScript is disabled! Audio playback may not work without it enabled.
if cfg.Restream {
You can enable Restream player in the preferences. It works without JavaScript.
}
}
if track.Policy == sc.PolicySnip {
Only a 30-second snippet is available.
}
if *prefs.ShowAudio {
if *audioPref == cfg.AudioBest {
Audio: best ({ audio })
} else {
Audio: { audio }
}
}
} else {
}
}
templ TrackItem(track *sc.Track, showUsername bool, overrideHref string) {
if track.Title != "" {
{{
if overrideHref == "" {
overrideHref = track.Href()
}
}}
{ track.Title }
if showUsername {
{ track.Author.Username }
}
}
}
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, downloadAudio *string, comments *sc.Paginated[*sc.Comment]) {
if t.Artwork != "" {
}
{ t.Title }
@TrackPlayer(prefs, t, stream, displayErr, autoplay, nextTrack, playlist, volume, mode, audio)
if displayErr == "" && cfg.Restream {
}
if t.Genre != "" {
{ t.Genre }
}
if nextTrack != nil {
Playback info
if playlist != nil {
In playlist:
@PlaylistItem(playlist, true)
}
Next track:
@TrackItem(nextTrack, true, next(&t, nextTrack, playlist, mode, volume))
}
@UserItem(&t.Author)
@TrackButtons("", t)
//
@Description(prefs, t.Description, nil)
{ strconv.FormatInt(t.Likes, 10) } likes
{ strconv.FormatInt(t.Played, 10) } plays
{ strconv.FormatInt(t.Reposted, 10) } reposts
Created: { t.CreatedAt }
Last modified: { t.LastModified }
if t.License != "" {
License: { t.License }
}
Policy: { t.Policy }
if t.TagList != "" {
Tags: { strings.Join(sc.TagListParser(t.TagList), ", ") }
}
Comments
if *prefs.DynamicLoadComments {
if comments != nil {
if comments.Next != "" {
more comments
}
} else {
load comments
}
} else {
if comments != nil {
@Comments(comments)
if comments.Next != "" {
more comments
}
} else {
load comments
}
}
}
templ Comments(comments *sc.Paginated[*sc.Comment]) {
for _, c := range comments.Collection {
}
}
templ TrackEmbed(prefs cfg.Preferences, t sc.Track, stream string, displayErr string) {
soundcloak
if *prefs.Player == cfg.HLSPlayer && stream != "" {
}
if t.Artwork != "" {
}
{ t.Title }
@TrackPlayer(prefs, t, stream, displayErr, false, nil, nil, "", "", "")
@UserItem(&t.Author)
}
templ SearchTracks(p *sc.Paginated[*sc.Track]) {
Found { strconv.FormatInt(p.Total, 10) } tracks
if len(p.Collection) == 0 && p.Total != 0 {
no more results
} else {
for _, track := range p.Collection {
@TrackItem(track, true, "")
}
if p.Next != "" && len(p.Collection) != int(p.Total) {
more tracks
}
}
}
templ RelatedTracks(t sc.Track, p *sc.Paginated[*sc.Track]) {
if t.Artwork != "" {
}
@TrackButtons("related tracks", t)
if len(p.Collection) == 0 {
no more results
} else {
for _, track := range p.Collection {
@TrackItem(track, true, "")
}
if p.Next != "" {
more tracks
}
}
}
templ TrackInAlbums(t sc.Track, p *sc.Paginated[*sc.Playlist]) {
if t.Artwork != "" {
}
@TrackButtons("in albums", t)
if len(p.Collection) == 0 {
no more albums
} else {
for _, playlist := range p.Collection {
@PlaylistItem(playlist, true)
}
if p.Next != "" {
more albums
}
}
}
templ TrackInPlaylists(t sc.Track, p *sc.Paginated[*sc.Playlist]) {
if t.Artwork != "" {
}
@TrackButtons("in playlists", t)
if len(p.Collection) == 0 {
no more playlists
} else {
for _, playlist := range p.Collection {
@PlaylistItem(playlist, true)
}
if p.Next != "" {
more playlists
}
}
}
{ c.Author.Username }
{ c.Body }