Files
soundcloak/templates/track.templ

154 lines
4.2 KiB
Plaintext

package templates
import (
"github.com/maid-zone/soundcloak/lib/cfg"
"github.com/maid-zone/soundcloak/lib/sc"
"net/url"
"strconv"
"strings"
)
templ TrackHeader(t sc.Track) {
<meta name="og:site_name" content={ t.Author.Username + " ~ soundcloak" }/>
<meta name="og:title" content={ t.Title }/>
<meta name="og:description" content={ t.FormatDescription() }/>
<meta name="og:image" content={ t.Artwork }/>
<link rel="icon" type="image/x-icon" href={ t.Artwork }/>
<script src="/js/hls.js/hls.light.js"></script>
}
templ TrackPlayer() {
// there might be a better way to do this idk
if cfg.FullyPreloadTrack {
<script>
var audio = document.getElementById('track');
if (Hls.isSupported()) {
var hls = new Hls({maxBufferLength: Infinity});
hls.loadSource(audio.src);
hls.attachMedia(audio);
} else if (!audio.canPlayType('application/vnd.apple.mpegurl')) {
alert('HLS is not supported! Audio playback will not work.');
}
</script>
} else {
<script>
var audio = document.getElementById('track');
if (Hls.isSupported()) {
var hls = new Hls();
hls.loadSource(audio.src);
hls.attachMedia(audio);
} else if (!audio.canPlayType('application/vnd.apple.mpegurl')) {
alert('HLS is not supported! Audio playback will not work.');
}
</script>
}
}
templ Track(t sc.Track, stream string) {
if t.Artwork != "" {
<img src={ t.Artwork } width="300px"/>
}
<h1>{ t.Title }</h1>
<audio id="track" src={ stream } controls></audio>
<noscript>
<br/>
JavaScript is disabled! Audio playback may not work without it enabled.
</noscript>
if t.Genre != "" {
<p class="tag">{ t.Genre }</p>
} else {
<br/>
<br/>
}
<a class="listing" href={ templ.URL("/" + t.Author.Permalink) }>
<img src={ t.Author.Avatar }/>
<div class="meta">
<h3>{ t.Author.Username }</h3>
if t.Author.FullName != "" {
<span>{ t.Author.FullName }</span>
}
</div>
</a>
<div class="btns">
<a class="btn" href={ templ.URL("https://soundcloud.com/" + t.Author.Permalink + "/" + t.Permalink) }>view on soundcloud</a>
</div>
<br>
if t.Description != "" {
<details>
<summary>Toggle description</summary>
<p style="white-space: pre-wrap">{ t.Description }</p>
</details>
}
<p>{ strconv.FormatInt(t.Likes, 10) } likes</p>
<p>{ strconv.FormatInt(t.Played, 10) } plays</p>
<p>Created: { t.CreatedAt }</p>
<p>Last modified: { t.LastModified }</p>
if t.License != "" {
<p>License: { t.License }</p>
}
if t.TagList != "" {
<p>Tags: { strings.Join(sc.TagListParser(t.TagList), ", ") }</p>
}
@TrackPlayer()
}
templ TrackEmbed(t sc.Track, stream string) {
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="/global.css"/>
<title>soundcloak</title>
<script src="/js/hls.js/hls.light.js"></script>
</head>
<body>
if t.Artwork != "" {
<img src={ t.Artwork } width="300px"/>
}
<h1>{ t.Title }</h1>
<audio id="track" src={ stream } controls></audio>
<noscript>
<br/>
JavaScript is disabled! Audio playback may not work without it enabled.
</noscript>
<a class="listing" href={ templ.URL("/" + t.Author.Permalink) }>
<img src={ t.Author.Avatar }/>
<div class="meta">
<h3>{ t.Author.Username }</h3>
if t.Author.FullName != "" {
<span>{ t.Author.FullName }</span>
}
</div>
</a>
@TrackPlayer()
</body>
</html>
}
templ SearchTracks(p *sc.Paginated[*sc.Track]) {
<span>Found { strconv.FormatInt(p.Total, 10) } tracks</span>
<br/>
<br/>
if len(p.Collection) == 0 && p.Total != 0 {
<p>no more results</p>
} else {
for _, track := range p.Collection {
<a class="listing" href={ templ.URL("/" + track.Author.Permalink + "/" + track.Permalink) }>
if track.Artwork != "" {
<img src={ track.Artwork }/>
} else {
<img src="/placeholder.jpg"/>
}
<div class="meta">
<h3>{ track.Title }</h3>
<span>{ track.Author.Username }</span>
</div>
</a>
}
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>
}
}
}