From 3d96470a0523039885e2af6ebbf58057ae490338 Mon Sep 17 00:00:00 2001 From: Laptop Date: Thu, 12 Jun 2025 17:31:25 +0300 Subject: [PATCH] small improvements) --- Dockerfile | 2 +- docs/INSTANCE_GUIDE.md | 2 +- go.mod | 18 +++---- go.sum | 32 ++++++------ lib/proxy_images/init.go | 7 +-- lib/proxy_streams/init.go | 23 ++++---- main.go | 107 ++++++++++++++------------------------ static/assets/index.js | 6 +-- 8 files changed, 87 insertions(+), 110 deletions(-) diff --git a/Dockerfile b/Dockerfile index 53cc748..a399eaf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 diff --git a/docs/INSTANCE_GUIDE.md b/docs/INSTANCE_GUIDE.md index 213a0aa..c641510 100644 --- a/docs/INSTANCE_GUIDE.md +++ b/docs/INSTANCE_GUIDE.md @@ -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: diff --git a/go.mod b/go.mod index 469076d..f036465 100644 --- a/go.mod +++ b/go.mod @@ -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 ) diff --git a/go.sum b/go.sum index f35bb81..ba15c07 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/lib/proxy_images/init.go b/lib/proxy_images/init.go index 7e31d31..ef6d810 100644 --- a/lib/proxy_images/init.go +++ b/lib/proxy_images/init.go @@ -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()) }) } diff --git a/lib/proxy_streams/init.go b/lib/proxy_streams/init.go index 1f57aaf..1387282 100644 --- a/lib/proxy_streams/init.go +++ b/lib/proxy_streams/init.go @@ -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)) }) } diff --git a/main.go b/main.go index 5a125fb..483ff14 100644 --- a/main.go +++ b/main.go @@ -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 diff --git a/static/assets/index.js b/static/assets/index.js index 3acda8a..6d101c4 100644 --- a/static/assets/index.js +++ b/static/assets/index.js @@ -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); }); \ No newline at end of file