small improvements)

This commit is contained in:
Laptop
2025-06-12 17:31:25 +03:00
parent d2117e5182
commit 3d96470a05
8 changed files with 87 additions and 110 deletions

View File

@@ -1,4 +1,4 @@
ARG GO_VERSION=1.24.2
ARG GO_VERSION=1.24.4
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION} AS build
ARG TARGETOS

View File

@@ -60,7 +60,7 @@ git pull
2. Stop the container:
```sh
docker container stop soundcloak
docker compose down
```
3. Build the container with updated source code:

18
go.mod
View File

@@ -1,16 +1,16 @@
module git.maid.zone/stuff/soundcloak
go 1.24.2
go 1.24.4
require (
github.com/a-h/templ v0.3.857
github.com/a-h/templ v0.3.898
github.com/bogem/id3v2/v2 v2.1.4
github.com/dlclark/regexp2 v1.11.5-0.20240806004527-5bbbed8ea10b
github.com/gcottom/mp4meta v0.0.5
github.com/gcottom/oggmeta v0.0.8
github.com/goccy/go-json v0.10.5
github.com/gofiber/fiber/v3 v3.0.0-beta.4
github.com/valyala/fasthttp v1.61.0
github.com/valyala/fasthttp v1.62.0
)
require (
@@ -18,7 +18,7 @@ require (
github.com/aler9/writerseeker v1.1.0 // indirect
github.com/andybalholm/brotli v1.1.1 // indirect
github.com/fxamacker/cbor/v2 v2.8.0 // indirect
github.com/gofiber/schema v1.3.0 // indirect
github.com/gofiber/schema v1.5.0 // indirect
github.com/gofiber/utils/v2 v2.0.0-beta.8 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/klauspost/compress v1.18.0 // indirect
@@ -26,11 +26,11 @@ require (
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect
github.com/sunfish-shogi/bufseekio v0.1.0 // indirect
github.com/tinylib/msgp v1.2.5 // indirect
github.com/tinylib/msgp v1.3.0 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
golang.org/x/crypto v0.37.0 // indirect
golang.org/x/net v0.39.0 // indirect
golang.org/x/sys v0.32.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/crypto v0.39.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.26.0 // indirect
)

32
go.sum
View File

@@ -1,5 +1,5 @@
github.com/a-h/templ v0.3.857 h1:6EqcJuGZW4OL+2iZ3MD+NnIcG7nGkaQeF2Zq5kf9ZGg=
github.com/a-h/templ v0.3.857/go.mod h1:qhrhAkRFubE7khxLZHsBFHfX+gWwVNKbzKeF9GlPV4M=
github.com/a-h/templ v0.3.898 h1:g9oxL/dmM6tvwRe2egJS8hBDQTncokbMoOFk1oJMX7s=
github.com/a-h/templ v0.3.898/go.mod h1:oLBbZVQ6//Q6zpvSMPTuBK0F3qOtBdFBcGRspcT+VNQ=
github.com/abema/go-mp4 v1.4.1 h1:YoS4VRqd+pAmddRPLFf8vMk74kuGl6ULSjzhsIqwr6M=
github.com/abema/go-mp4 v1.4.1/go.mod h1:vPl9t5ZK7K0x68jh12/+ECWBCXoWuIDtNgPtU2f04ws=
github.com/aler9/writerseeker v1.1.0 h1:t+Sm3tjp8scNlqyoa8obpeqwciMNOvdvsxjxEb3Sx3g=
@@ -24,8 +24,8 @@ github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/gofiber/fiber/v3 v3.0.0-beta.4 h1:KzDSavvhG7m81NIsmnu5l3ZDbVS4feCidl4xlIfu6V0=
github.com/gofiber/fiber/v3 v3.0.0-beta.4/go.mod h1:/WFUoHRkZEsGHyy2+fYcdqi109IVOFbVwxv1n1RU+kk=
github.com/gofiber/schema v1.3.0 h1:K3F3wYzAY+aivfCCEHPufCthu5/13r/lzp1nuk6mr3Q=
github.com/gofiber/schema v1.3.0/go.mod h1:YYwj01w3hVfaNjhtJzaqetymL56VW642YS3qZPhuE6c=
github.com/gofiber/schema v1.5.0 h1:dcbLol88CXdLFUY3K3TKp3SZ90v8CKIjgJp1/GfzwqU=
github.com/gofiber/schema v1.5.0/go.mod h1:YYwj01w3hVfaNjhtJzaqetymL56VW642YS3qZPhuE6c=
github.com/gofiber/utils/v2 v2.0.0-beta.8 h1:ZifwbHZqZO3YJsx1ZhDsWnPjaQ7C0YD20LHt+DQeXOU=
github.com/gofiber/utils/v2 v2.0.0-beta.8/go.mod h1:1lCBo9vEF4RFEtTgWntipnaScJZQiM8rrsYycLZ4n9c=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
@@ -58,12 +58,12 @@ github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf
github.com/sunfish-shogi/bufseekio v0.0.0-20210207115823-a4185644b365/go.mod h1:dEzdXgvImkQ3WLI+0KQpmEx8T/C/ma9KeS3AfmU899I=
github.com/sunfish-shogi/bufseekio v0.1.0 h1:zu38kFbv0KuuiwZQeuYeS02U9AM14j0pVA9xkHOCJ2A=
github.com/sunfish-shogi/bufseekio v0.1.0/go.mod h1:dEzdXgvImkQ3WLI+0KQpmEx8T/C/ma9KeS3AfmU899I=
github.com/tinylib/msgp v1.2.5 h1:WeQg1whrXRFiZusidTQqzETkRpGjFjcIhW6uqWH09po=
github.com/tinylib/msgp v1.2.5/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.61.0 h1:VV08V0AfoRaFurP1EWKvQQdPTZHiUzaVoulX1aBDgzU=
github.com/valyala/fasthttp v1.61.0/go.mod h1:wRIV/4cMwUPWnRcDno9hGnYZGh78QzODFfo1LTUhBog=
github.com/valyala/fasthttp v1.62.0 h1:8dKRBX/y2rCzyc6903Zu1+3qN0H/d2MsxPPmVNamiH0=
github.com/valyala/fasthttp v1.62.0/go.mod h1:FCINgr4GKdKqV8Q0xv8b+UxPV+H/O5nNFo3D+r54Htg=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
@@ -71,14 +71,14 @@ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3i
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -88,16 +88,16 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=

View File

@@ -11,6 +11,7 @@ import (
)
var al_httpc *fasthttp.HostClient
var sndcdn = []byte(".sndcdn.com")
func Load(r *fiber.App) {
@@ -36,7 +37,7 @@ func Load(r *fiber.App) {
return err
}
if !bytes.HasSuffix(parsed.Host(), []byte(".sndcdn.com")) {
if !bytes.HasSuffix(parsed.Host(), sndcdn) {
return fiber.ErrBadRequest
}
@@ -63,12 +64,12 @@ func Load(r *fiber.App) {
return err
}
c.Response().Header.SetContentType("image/jpeg")
c.Response().Header.SetContentTypeBytes(resp.Header.ContentType())
c.Set("Cache-Control", cfg.ImageCacheControl)
//return c.Send(resp.Body())
pr := misc.AcquireProxyReader()
pr.Reader = resp.BodyStream()
pr.Resp = resp
return c.SendStream(pr)
return c.SendStream(pr, resp.Header.ContentLength())
})
}

View File

@@ -11,6 +11,11 @@ import (
"github.com/valyala/fasthttp"
)
var sndcdn = []byte(".sndcdn.com")
var soundcloudcloud = []byte(".soundcloud.cloud")
var newline = []byte{'\n'}
var extxmap = []byte(`#EXT-X-MAP:URI="`)
func Load(a *fiber.App) {
r := a.Group("/_/proxy/streams")
@@ -28,7 +33,7 @@ func Load(a *fiber.App) {
return err
}
if !bytes.HasSuffix(parsed.Host(), []byte(".sndcdn.com")) {
if !bytes.HasSuffix(parsed.Host(), sndcdn) {
return fiber.ErrBadRequest
}
@@ -67,7 +72,7 @@ func Load(a *fiber.App) {
return err
}
if !bytes.HasSuffix(parsed.Host(), []byte(".soundcloud.cloud")) {
if !bytes.HasSuffix(parsed.Host(), soundcloudcloud) {
return fiber.ErrBadRequest
}
@@ -105,7 +110,7 @@ func Load(a *fiber.App) {
return err
}
if !bytes.HasSuffix(parsed.Host(), []byte(".sndcdn.com")) {
if !bytes.HasSuffix(parsed.Host(), sndcdn) {
return fiber.ErrBadRequest
}
@@ -129,7 +134,7 @@ func Load(a *fiber.App) {
data = resp.Body()
}
var sp = bytes.Split(data, []byte{'\n'})
var sp = bytes.Split(data, newline)
for i, l := range sp {
if len(l) == 0 || l[0] == '#' {
continue
@@ -139,7 +144,7 @@ func Load(a *fiber.App) {
sp[i] = l
}
return c.Send(bytes.Join(sp, []byte("\n")))
return c.Send(bytes.Join(sp, newline))
})
r.Get("/playlist/aac", func(c fiber.Ctx) error {
@@ -156,7 +161,7 @@ func Load(a *fiber.App) {
return err
}
if !bytes.HasSuffix(parsed.Host(), []byte(".soundcloud.cloud")) {
if !bytes.HasSuffix(parsed.Host(), soundcloudcloud) {
return fiber.ErrBadRequest
}
@@ -180,14 +185,14 @@ func Load(a *fiber.App) {
data = resp.Body()
}
var sp = bytes.Split(data, []byte("\n"))
var sp = bytes.Split(data, newline)
for i, l := range sp {
if len(l) == 0 {
continue
}
if l[0] == '#' {
if bytes.HasPrefix(l, []byte(`#EXT-X-MAP:URI="`)) {
if bytes.HasPrefix(l, extxmap) {
l = []byte(`#EXT-X-MAP:URI="/_/proxy/streams/aac?url=` + url.QueryEscape(cfg.B2s(l[16:len(l)-1])) + `"`)
sp[i] = l
}
@@ -199,6 +204,6 @@ func Load(a *fiber.App) {
sp[i] = l
}
return c.Send(bytes.Join(sp, []byte("\n")))
return c.Send(bytes.Join(sp, newline))
})
}

107
main.go
View File

@@ -13,6 +13,7 @@ import (
"sync"
"git.maid.zone/stuff/soundcloak/lib/misc"
"github.com/a-h/templ"
"github.com/gofiber/fiber/v3"
"github.com/goccy/go-json"
@@ -249,6 +250,15 @@ func ServeFS(r *fiber.App, filesystem fs.FS) {
}
}
func render(c fiber.Ctx, t templ.Component) error {
c.Response().Header.SetContentType("text/html")
return t.Render(c.RequestCtx(), c.Response().BodyWriter())
}
func r(c fiber.Ctx, title string, content, head templ.Component) error {
return render(c, templates.Base(title, content, head))
}
func main() {
app := fiber.New(fiber.Config{
JSONEncoder: json.Marshal,
@@ -300,8 +310,7 @@ func main() {
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("", templates.MainPage(prefs), templates.MainPageHead()).Render(c.RequestCtx(), c)
return r(c, "", templates.MainPage(prefs), templates.MainPageHead())
}
app.Get("/", mainPageHandler)
@@ -348,8 +357,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("tracks: "+q, templates.SearchTracks(p), nil).Render(c.RequestCtx(), c)
return r(c, "tracks: "+q, templates.SearchTracks(p), nil)
case "users":
p, err := sc.SearchUsers("", prefs, c.Query("pagination", "?q="+url.QueryEscape(q)))
@@ -358,8 +366,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("users: "+q, templates.SearchUsers(p), nil).Render(c.RequestCtx(), c)
return r(c, "users: "+q, templates.SearchUsers(p), nil)
case "playlists":
p, err := sc.SearchPlaylists("", prefs, c.Query("pagination", "?q="+url.QueryEscape(q)))
@@ -368,8 +375,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("playlists: "+q, templates.SearchPlaylists(p), nil).Render(c.RequestCtx(), c)
return r(c, "playlists: "+q, templates.SearchPlaylists(p), nil)
}
return c.SendStatus(404)
@@ -463,8 +469,7 @@ Disallow: /`)
}
}
c.Response().Header.SetContentType("text/html")
return templates.TrackEmbed(prefs, track, stream, displayErr).Render(c.RequestCtx(), c)
return render(c, templates.TrackEmbed(prefs, track, stream, displayErr))
})
app.Get("/tags/:tag", func(c fiber.Ctx) error {
@@ -473,20 +478,14 @@ Disallow: /`)
return err
}
cid, err := sc.GetClientID()
if err != nil {
return err
}
tag := c.Params("tag")
p, err := sc.RecentTracks(cid, prefs, c.Query("pagination", tag+"?limit=20"))
p, err := sc.RecentTracks("", prefs, c.Query("pagination", tag+"?limit=20"))
if err != nil {
log.Printf("error getting %s tagged recent-tracks: %s\n", tag, err)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("Recent tracks tagged "+tag, templates.RecentTracks(tag, p), nil).Render(c.RequestCtx(), c)
return r(c, "Recent tracks tagged "+tag, templates.RecentTracks(tag, p), nil)
})
app.Get("/tags/:tag/popular-tracks", func(c fiber.Ctx) error {
@@ -495,20 +494,14 @@ Disallow: /`)
return err
}
cid, err := sc.GetClientID()
if err != nil {
return err
}
tag := c.Params("tag")
p, err := sc.SearchTracks(cid, prefs, c.Query("pagination", "?q=*&filter.genre_or_tag="+tag+"&sort=popular"))
p, err := sc.SearchTracks("", prefs, c.Query("pagination", "?q=*&filter.genre_or_tag="+tag+"&sort=popular"))
if err != nil {
log.Printf("error getting %s tagged popular-tracks: %s\n", tag, err)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("Popular tracks tagged "+tag, templates.PopularTracks(tag, p), nil).Render(c.RequestCtx(), c)
return r(c, "Popular tracks tagged "+tag, templates.PopularTracks(tag, p), nil)
})
app.Get("/tags/:tag/playlists", func(c fiber.Ctx) error {
@@ -517,21 +510,15 @@ Disallow: /`)
return err
}
cid, err := sc.GetClientID()
if err != nil {
return err
}
tag := c.Params("tag")
// Using a different method, since /playlists/discovery endpoint seems to be broken :P
p, err := sc.SearchPlaylists(cid, prefs, c.Query("pagination", "?q=*&filter.genre_or_tag="+tag))
p, err := sc.SearchPlaylists("", prefs, c.Query("pagination", "?q=*&filter.genre_or_tag="+tag))
if err != nil {
log.Printf("error getting %s tagged playlists: %s\n", tag, err)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("Playlists tagged "+tag, templates.TaggedPlaylists(tag, p), nil).Render(c.RequestCtx(), c)
return r(c, "Playlists tagged "+tag, templates.TaggedPlaylists(tag, p), nil)
})
app.Get("/discover", func(c fiber.Ctx) error {
@@ -546,8 +533,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base("Discover", templates.Discover(selections), nil).Render(c.RequestCtx(), c)
return r(c, "Discover", templates.Discover(selections), nil)
})
if cfg.ProxyImages {
@@ -637,8 +623,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserPlaylists(prefs, user, pl), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserPlaylists(prefs, user, pl), templates.UserHeader(user))
})
app.Get("/:user/albums", func(c fiber.Ctx) error {
@@ -665,8 +650,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserAlbums(prefs, user, pl), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserAlbums(prefs, user, pl), templates.UserHeader(user))
})
app.Get("/:user/reposts", func(c fiber.Ctx) error {
@@ -693,8 +677,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserReposts(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserReposts(prefs, user, p), templates.UserHeader(user))
})
app.Get("/:user/likes", func(c fiber.Ctx) error {
@@ -721,8 +704,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserLikes(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserLikes(prefs, user, p), templates.UserHeader(user))
})
app.Get("/:user/popular-tracks", func(c fiber.Ctx) error {
@@ -749,8 +731,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserTopTracks(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserTopTracks(prefs, user, p), templates.UserHeader(user))
})
app.Get("/:user/followers", func(c fiber.Ctx) error {
@@ -777,8 +758,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserFollowers(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserFollowers(prefs, user, p), templates.UserHeader(user))
})
app.Get("/:user/following", func(c fiber.Ctx) error {
@@ -805,8 +785,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserFollowing(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserFollowing(prefs, user, p), templates.UserHeader(user))
})
app.Get("/:user/:track", func(c fiber.Ctx) error {
@@ -925,8 +904,7 @@ Disallow: /`)
downloadAudio = &audio
}
c.Response().Header.SetContentType("text/html")
return templates.Base(track.Title+" by "+track.Author.Username, templates.Track(prefs, track, stream, displayErr, string(c.RequestCtx().QueryArgs().Peek("autoplay")) == "true", playlist, nextTrack, c.Query("volume"), mode, audio, downloadAudio, comments), templates.TrackHeader(prefs, track, true)).Render(c.RequestCtx(), c)
return r(c, track.Title+" by "+track.Author.Username, templates.Track(prefs, track, stream, displayErr, string(c.RequestCtx().QueryArgs().Peek("autoplay")) == "true", playlist, nextTrack, c.Query("volume"), mode, audio, downloadAudio, comments), templates.TrackHeader(prefs, track, true))
})
app.Get("/_/partials/comments/:id", func(c fiber.Ctx) error {
@@ -952,12 +930,13 @@ Disallow: /`)
}
if comm.Next != "" {
fmt.Println(comm.Next)
c.Set("next", "?pagination="+url.QueryEscape(strings.Split(comm.Next, "/comments")[1]))
} else {
c.Set("next", "done")
}
return templates.Comments(comm).Render(c.RequestCtx(), c)
return render(c, templates.Comments(comm))
})
app.Get("/:user", func(c fiber.Ctx) error {
@@ -984,8 +963,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(usr.Username, templates.User(prefs, usr, p), templates.UserHeader(usr)).Render(c.RequestCtx(), c)
return r(c, usr.Username, templates.User(prefs, usr, p), templates.UserHeader(usr))
})
app.Get("/:user/sets/:playlist", func(c fiber.Ctx) error {
@@ -1024,8 +1002,7 @@ Disallow: /`)
playlist.MissingTracks = strings.Join(next, ",")
}
c.Response().Header.SetContentType("text/html")
return templates.Base(playlist.Title+" by "+playlist.Author.Username, templates.Playlist(prefs, playlist), templates.PlaylistHeader(playlist)).Render(c.RequestCtx(), c)
return r(c, playlist.Title+" by "+playlist.Author.Username, templates.Playlist(prefs, playlist), templates.PlaylistHeader(playlist))
})
app.Get("/:user/_/related", func(c fiber.Ctx) error {
@@ -1046,14 +1023,13 @@ Disallow: /`)
}
user.Postfix(prefs)
r, err := user.GetRelated(cid, prefs)
rel, err := user.GetRelated(cid, prefs)
if err != nil {
log.Printf("error getting %s related users: %s\n", c.Params("user"), err)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(user.Username, templates.UserRelated(prefs, user, r), templates.UserHeader(user)).Render(c.RequestCtx(), c)
return r(c, user.Username, templates.UserRelated(prefs, user, rel), templates.UserHeader(user))
})
// I'd like to make this "related" but keeping it "recommended" to have the same url as soundcloud
@@ -1075,14 +1051,13 @@ Disallow: /`)
}
track.Postfix(prefs, true)
r, err := track.GetRelated(cid, prefs, c.Query("pagination", "?limit=20"))
rel, err := track.GetRelated(cid, prefs, c.Query("pagination", "?limit=20"))
if err != nil {
log.Printf("error getting %s from %s related tracks: %s\n", c.Params("track"), c.Params("user"), err)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(track.Title+" by "+track.Author.Username, templates.RelatedTracks(track, r), templates.TrackHeader(prefs, track, false)).Render(c.RequestCtx(), c)
return r(c, track.Title+" by "+track.Author.Username, templates.RelatedTracks(track, rel), templates.TrackHeader(prefs, track, false))
})
app.Get("/:user/:track/sets", func(c fiber.Ctx) error {
@@ -1109,8 +1084,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(track.Title+" by "+track.Author.Username, templates.TrackInPlaylists(track, p), templates.TrackHeader(prefs, track, false)).Render(c.RequestCtx(), c)
return r(c, track.Title+" by "+track.Author.Username, templates.TrackInPlaylists(track, p), templates.TrackHeader(prefs, track, false))
})
app.Get("/:user/:track/albums", func(c fiber.Ctx) error {
@@ -1137,8 +1111,7 @@ Disallow: /`)
return err
}
c.Response().Header.SetContentType("text/html")
return templates.Base(track.Title+" by "+track.Author.Username, templates.TrackInAlbums(track, p), templates.TrackHeader(prefs, track, false)).Render(c.RequestCtx(), c)
return r(c, track.Title+" by "+track.Author.Username, templates.TrackInAlbums(track, p), templates.TrackHeader(prefs, track, false))
})
// cute

View File

@@ -46,10 +46,8 @@ function getSuggestions() {
}
input.addEventListener('input', function () {
if (!timeout) {
timeout = setTimeout(getSuggestions, 250);
} else {
if (timeout) {
clearTimeout(timeout);
timeout = setTimeout(getSuggestions, 250);
}
timeout = setTimeout(getSuggestions, 250);
});