Autoplay tracks in playlists; increase caching time; some fixes

This commit is contained in:
Laptop
2024-12-01 23:33:01 +02:00
parent 79da855e9e
commit 96ac9c8b36
13 changed files with 173 additions and 55 deletions

View File

@@ -13,7 +13,7 @@ templ FeaturedTracks(p *sc.Paginated[*sc.Track]) {
<p>no more tracks</p>
} else {
for _, track := range p.Collection {
@TrackItem(track, true)
@TrackItem(track, true, "")
}
if p.Next != "" {
<a class="btn" href={ templ.URL("/_/featured?pagination=" + url.QueryEscape(strings.Split(p.Next, "/all-music")[1])) } rel="noreferrer">more tracks</a>

View File

@@ -16,8 +16,12 @@ templ PlaylistHeader(p sc.Playlist) {
<link rel="icon" type="image/x-icon" href={ p.Artwork }/>
}
func playlist(t sc.Track, p sc.Playlist) string {
return t.Href() + "?playlist=" + p.Href()[1:]
}
templ PlaylistItem(playlist *sc.Playlist, showUsername bool) {
<a class="listing" href={ templ.URL("/" + playlist.Author.Permalink + "/sets/" + playlist.Permalink) }>
<a class="listing" href={ templ.URL(playlist.Href()) }>
if playlist.Artwork != "" {
<img src={ playlist.Artwork }/>
} else {
@@ -40,7 +44,7 @@ templ Playlist(prefs cfg.Preferences, p sc.Playlist) {
<h1>{ p.Title }</h1>
@UserItem(&p.Author)
<div style="display: flex;">
<a class="btn" href={ templ.URL("https://soundcloud.com/" + p.Author.Permalink + "/sets/" + p.Permalink) }>view on soundcloud</a>
<a class="btn" href={ templ.URL("https://soundcloud.com" + p.Href()) }>view on soundcloud</a>
</div>
<br/>
@Description(prefs, p.Description, nil)
@@ -49,7 +53,11 @@ templ Playlist(prefs cfg.Preferences, p sc.Playlist) {
<br/>
<div>
for _, track := range p.Tracks {
@TrackItem(&track, true)
if *prefs.AutoplayNextTrack {
@TrackItem(&track, true, playlist(track, p))
} else {
@TrackItem(&track, true, "")
}
}
</div>
if len(p.MissingTracks) != 0 {

View File

@@ -17,17 +17,14 @@ type option struct {
}
// i hate this
// ^ outdated, i no longer hate this
templ sel(name string, options []option, selected string) {
<select name={ name } autocomplete="off">
for _, opt := range options {
if opt.value == selected {
<option value={ opt.value } selected>{ opt.desc }</option>
} else {
if opt.disabled {
<option value={ opt.value } disabled>{ opt.desc }</option>
} else {
<option value={ opt.value }>{ opt.desc }</option>
}
<option value={ opt.value } disabled?={ opt.disabled }>{ opt.desc }</option>
}
}
</select>
@@ -71,6 +68,11 @@ templ Preferences(prefs cfg.Preferences) {
@checkbox("FullyPreloadTrack", *prefs.FullyPreloadTrack)
</label>
<br/>
<label>
Autoplay next track in playlists:
@checkbox("AutoplayNextTrack", *prefs.AutoplayNextTrack)
</label>
<br/>
}
<input type="submit" value="Update" class="btn" style="margin-top: 1rem;"/>
<br/>

View File

@@ -19,15 +19,23 @@ templ TrackHeader(prefs cfg.Preferences, t sc.Track) {
}
}
templ TrackPlayer(prefs cfg.Preferences, track sc.Track, stream string, displayErr string) {
func next(t *sc.Track, p *sc.Playlist) string {
return t.Href() + "?autoplay=true&playlist=" + p.Href()[1:]
}
templ TrackPlayer(prefs cfg.Preferences, track sc.Track, stream string, displayErr string, autoplay bool, nextTrack *sc.Track, playlist *sc.Playlist, volume string) {
if *prefs.Player == cfg.NonePlayer {
{{ return }}
}
if displayErr == "" {
if cfg.Restream && *prefs.Player == cfg.RestreamPlayer {
<audio src={ "/_/restream/" + track.Author.Permalink + "/" + track.Permalink } controls></audio>
<audio src={ "/_/restream" + track.Href() } controls autoplay?={ autoplay }></audio>
} else if stream != "" {
<audio id="track" src={ stream } controls></audio>
if nextTrack != nil {
<audio id="track" src={ stream } controls autoplay?={ autoplay } data-next={next(nextTrack, playlist)} volume={volume}></audio>
} else {
<audio id="track" src={ stream } controls autoplay?={ autoplay }></audio>
}
if *prefs.FullyPreloadTrack {
<script async src="/player_preload.js"></script>
} else {
@@ -49,9 +57,12 @@ templ TrackPlayer(prefs cfg.Preferences, track sc.Track, stream string, displayE
}
}
templ TrackItem(track *sc.Track, showUsername bool) {
templ TrackItem(track *sc.Track, showUsername bool, overrideHref string) {
if track.Title != "" {
<a class="listing" href={ templ.URL("/" + track.Author.Permalink + "/" + track.Permalink) }>
{{ if overrideHref == "" {
overrideHref = track.Href()
} }}
<a class="listing" href={ templ.URL(overrideHref) }>
if track.Artwork != "" {
<img src={ track.Artwork }/>
} else {
@@ -67,24 +78,36 @@ templ TrackItem(track *sc.Track, showUsername bool) {
}
}
templ Track(prefs cfg.Preferences, t sc.Track, stream string, displayErr string) {
templ Track(prefs cfg.Preferences, t sc.Track, stream string, displayErr string, autoplay bool, playlist *sc.Playlist, nextTrack *sc.Track, volume string) {
if t.Artwork != "" {
<img src={ t.Artwork } width="300px"/>
}
<h1>{ t.Title }</h1>
@TrackPlayer(prefs, t, stream, displayErr)
@TrackPlayer(prefs, t, stream, displayErr, autoplay, nextTrack, playlist, volume)
if t.Genre != "" {
<p class="tag">{ t.Genre }</p>
} else {
<br/>
<br/>
}
if playlist != nil {
<details style="margin-bottom: 1rem;">
<summary>Playback info</summary>
<h2>In playlist:</h2>
@PlaylistItem(playlist, true)
<h2>Next track:</h2>
@TrackItem(nextTrack, true, next(nextTrack, playlist) + "&volume=" + volume)
<a href={templ.URL(t.Href())} class="link">Stop playlist playback</a>
</details>
}
@UserItem(&t.Author)
//<div class="btns">
<div style="display: flex; gap: 1rem">
<a class="btn" href={ templ.URL("https://soundcloud.com/" + t.Author.Permalink + "/" + t.Permalink) }>view on soundcloud</a>
<a class="btn" href={ templ.URL("https://soundcloud.com" + t.Href()) }>view on soundcloud</a>
if cfg.Restream {
<a class="btn" href={ templ.URL("/_/restream/" + t.Author.Permalink + "/" + t.Permalink + "?metadata=true") } download={ t.Author.Username + " - " + t.Title + ".mp3" }>download</a>
<a class="btn" href={ templ.URL("/_/restream" + t.Href() + "?metadata=true") } download={ t.Author.Username + " - " + t.Title + ".mp3" }>download</a>
}
</div>
<br/>
@@ -119,7 +142,7 @@ templ TrackEmbed(prefs cfg.Preferences, t sc.Track, stream string, displayErr st
<img src={ t.Artwork } width="300px"/>
}
<h1>{ t.Title }</h1>
@TrackPlayer(prefs, t, stream, displayErr)
@TrackPlayer(prefs, t, stream, displayErr, false, nil, nil, "")
@UserItem(&t.Author)
</body>
</html>
@@ -133,7 +156,7 @@ templ SearchTracks(p *sc.Paginated[*sc.Track]) {
<p>no more results</p>
} else {
for _, track := range p.Collection {
@TrackItem(track, true)
@TrackItem(track, true, "")
}
if p.Next != "" && len(p.Collection) != int(p.Total) {
<a class="btn" href={ templ.URL("?type=tracks&pagination=" + url.QueryEscape(strings.Split(p.Next, "/tracks")[1])) } rel="noreferrer">more tracks</a>

View File

@@ -105,7 +105,7 @@ templ User(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.Track]) {
if len(p.Collection) != 0 {
<div>
for _, track := range p.Collection {
@TrackItem(track, false)
@TrackItem(track, false, "")
}
</div>
if p.Next != "" && len(p.Collection) != int(u.Tracks) {
@@ -160,7 +160,7 @@ templ UserReposts(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.Repost])
<div>
for _, repost := range p.Collection {
if repost.Type == sc.TrackRepost && repost.Track != nil {
@TrackItem(repost.Track, true)
@TrackItem(repost.Track, true, "")
} else if repost.Type == sc.PlaylistRepost && repost.Playlist != nil {
@PlaylistItem(repost.Playlist, true)
}
@@ -182,7 +182,7 @@ templ UserLikes(prefs cfg.Preferences, u sc.User, p *sc.Paginated[*sc.Like]) {
<div>
for _, like := range p.Collection {
if like.Track != nil {
@TrackItem(like.Track, true)
@TrackItem(like.Track, true, "")
} else if like.Playlist != nil {
@PlaylistItem(like.Playlist, true)
}