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 FROM --platform=$BUILDPLATFORM golang:${GO_VERSION} AS build
ARG TARGETOS ARG TARGETOS

View File

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

18
go.mod
View File

@@ -1,16 +1,16 @@
module git.maid.zone/stuff/soundcloak module git.maid.zone/stuff/soundcloak
go 1.24.2 go 1.24.4
require ( 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/bogem/id3v2/v2 v2.1.4
github.com/dlclark/regexp2 v1.11.5-0.20240806004527-5bbbed8ea10b github.com/dlclark/regexp2 v1.11.5-0.20240806004527-5bbbed8ea10b
github.com/gcottom/mp4meta v0.0.5 github.com/gcottom/mp4meta v0.0.5
github.com/gcottom/oggmeta v0.0.8 github.com/gcottom/oggmeta v0.0.8
github.com/goccy/go-json v0.10.5 github.com/goccy/go-json v0.10.5
github.com/gofiber/fiber/v3 v3.0.0-beta.4 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 ( require (
@@ -18,7 +18,7 @@ require (
github.com/aler9/writerseeker v1.1.0 // indirect github.com/aler9/writerseeker v1.1.0 // indirect
github.com/andybalholm/brotli v1.1.1 // indirect github.com/andybalholm/brotli v1.1.1 // indirect
github.com/fxamacker/cbor/v2 v2.8.0 // 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/gofiber/utils/v2 v2.0.0-beta.8 // indirect
github.com/google/uuid v1.6.0 // indirect github.com/google/uuid v1.6.0 // indirect
github.com/klauspost/compress v1.18.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/mattn/go-isatty v0.0.20 // indirect
github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect
github.com/sunfish-shogi/bufseekio v0.1.0 // 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/valyala/bytebufferpool v1.0.0 // indirect
github.com/x448/float16 v0.8.4 // indirect github.com/x448/float16 v0.8.4 // indirect
golang.org/x/crypto v0.37.0 // indirect golang.org/x/crypto v0.39.0 // indirect
golang.org/x/net v0.39.0 // indirect golang.org/x/net v0.41.0 // indirect
golang.org/x/sys v0.32.0 // indirect golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.24.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.898 h1:g9oxL/dmM6tvwRe2egJS8hBDQTncokbMoOFk1oJMX7s=
github.com/a-h/templ v0.3.857/go.mod h1:qhrhAkRFubE7khxLZHsBFHfX+gWwVNKbzKeF9GlPV4M= 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 h1:YoS4VRqd+pAmddRPLFf8vMk74kuGl6ULSjzhsIqwr6M=
github.com/abema/go-mp4 v1.4.1/go.mod h1:vPl9t5ZK7K0x68jh12/+ECWBCXoWuIDtNgPtU2f04ws= github.com/abema/go-mp4 v1.4.1/go.mod h1:vPl9t5ZK7K0x68jh12/+ECWBCXoWuIDtNgPtU2f04ws=
github.com/aler9/writerseeker v1.1.0 h1:t+Sm3tjp8scNlqyoa8obpeqwciMNOvdvsxjxEb3Sx3g= 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/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 h1:KzDSavvhG7m81NIsmnu5l3ZDbVS4feCidl4xlIfu6V0=
github.com/gofiber/fiber/v3 v3.0.0-beta.4/go.mod h1:/WFUoHRkZEsGHyy2+fYcdqi109IVOFbVwxv1n1RU+kk= 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.5.0 h1:dcbLol88CXdLFUY3K3TKp3SZ90v8CKIjgJp1/GfzwqU=
github.com/gofiber/schema v1.3.0/go.mod h1:YYwj01w3hVfaNjhtJzaqetymL56VW642YS3qZPhuE6c= 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 h1:ZifwbHZqZO3YJsx1ZhDsWnPjaQ7C0YD20LHt+DQeXOU=
github.com/gofiber/utils/v2 v2.0.0-beta.8/go.mod h1:1lCBo9vEF4RFEtTgWntipnaScJZQiM8rrsYycLZ4n9c= 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= 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.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 h1:zu38kFbv0KuuiwZQeuYeS02U9AM14j0pVA9xkHOCJ2A=
github.com/sunfish-shogi/bufseekio v0.1.0/go.mod h1:dEzdXgvImkQ3WLI+0KQpmEx8T/C/ma9KeS3AfmU899I= 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.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
github.com/tinylib/msgp v1.2.5/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= 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 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 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.62.0 h1:8dKRBX/y2rCzyc6903Zu1+3qN0H/d2MsxPPmVNamiH0=
github.com/valyala/fasthttp v1.61.0/go.mod h1:wRIV/4cMwUPWnRcDno9hGnYZGh78QzODFfo1LTUhBog= 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 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= 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= 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-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.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.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= 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/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-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-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.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.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= 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-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/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= 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-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.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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 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.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.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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= 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.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= 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-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.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 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 al_httpc *fasthttp.HostClient
var sndcdn = []byte(".sndcdn.com")
func Load(r *fiber.App) { func Load(r *fiber.App) {
@@ -36,7 +37,7 @@ func Load(r *fiber.App) {
return err return err
} }
if !bytes.HasSuffix(parsed.Host(), []byte(".sndcdn.com")) { if !bytes.HasSuffix(parsed.Host(), sndcdn) {
return fiber.ErrBadRequest return fiber.ErrBadRequest
} }
@@ -63,12 +64,12 @@ func Load(r *fiber.App) {
return err return err
} }
c.Response().Header.SetContentType("image/jpeg") c.Response().Header.SetContentTypeBytes(resp.Header.ContentType())
c.Set("Cache-Control", cfg.ImageCacheControl) c.Set("Cache-Control", cfg.ImageCacheControl)
//return c.Send(resp.Body()) //return c.Send(resp.Body())
pr := misc.AcquireProxyReader() pr := misc.AcquireProxyReader()
pr.Reader = resp.BodyStream() pr.Reader = resp.BodyStream()
pr.Resp = resp 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" "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) { func Load(a *fiber.App) {
r := a.Group("/_/proxy/streams") r := a.Group("/_/proxy/streams")
@@ -28,7 +33,7 @@ func Load(a *fiber.App) {
return err return err
} }
if !bytes.HasSuffix(parsed.Host(), []byte(".sndcdn.com")) { if !bytes.HasSuffix(parsed.Host(), sndcdn) {
return fiber.ErrBadRequest return fiber.ErrBadRequest
} }
@@ -67,7 +72,7 @@ func Load(a *fiber.App) {
return err return err
} }
if !bytes.HasSuffix(parsed.Host(), []byte(".soundcloud.cloud")) { if !bytes.HasSuffix(parsed.Host(), soundcloudcloud) {
return fiber.ErrBadRequest return fiber.ErrBadRequest
} }
@@ -105,7 +110,7 @@ func Load(a *fiber.App) {
return err return err
} }
if !bytes.HasSuffix(parsed.Host(), []byte(".sndcdn.com")) { if !bytes.HasSuffix(parsed.Host(), sndcdn) {
return fiber.ErrBadRequest return fiber.ErrBadRequest
} }
@@ -129,7 +134,7 @@ func Load(a *fiber.App) {
data = resp.Body() data = resp.Body()
} }
var sp = bytes.Split(data, []byte{'\n'}) var sp = bytes.Split(data, newline)
for i, l := range sp { for i, l := range sp {
if len(l) == 0 || l[0] == '#' { if len(l) == 0 || l[0] == '#' {
continue continue
@@ -139,7 +144,7 @@ func Load(a *fiber.App) {
sp[i] = l 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 { r.Get("/playlist/aac", func(c fiber.Ctx) error {
@@ -156,7 +161,7 @@ func Load(a *fiber.App) {
return err return err
} }
if !bytes.HasSuffix(parsed.Host(), []byte(".soundcloud.cloud")) { if !bytes.HasSuffix(parsed.Host(), soundcloudcloud) {
return fiber.ErrBadRequest return fiber.ErrBadRequest
} }
@@ -180,14 +185,14 @@ func Load(a *fiber.App) {
data = resp.Body() data = resp.Body()
} }
var sp = bytes.Split(data, []byte("\n")) var sp = bytes.Split(data, newline)
for i, l := range sp { for i, l := range sp {
if len(l) == 0 { if len(l) == 0 {
continue continue
} }
if l[0] == '#' { 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])) + `"`) l = []byte(`#EXT-X-MAP:URI="/_/proxy/streams/aac?url=` + url.QueryEscape(cfg.B2s(l[16:len(l)-1])) + `"`)
sp[i] = l sp[i] = l
} }
@@ -199,6 +204,6 @@ func Load(a *fiber.App) {
sp[i] = l 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" "sync"
"git.maid.zone/stuff/soundcloak/lib/misc" "git.maid.zone/stuff/soundcloak/lib/misc"
"github.com/a-h/templ"
"github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3"
"github.com/goccy/go-json" "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() { func main() {
app := fiber.New(fiber.Config{ app := fiber.New(fiber.Config{
JSONEncoder: json.Marshal, JSONEncoder: json.Marshal,
@@ -300,8 +310,7 @@ func main() {
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "", templates.MainPage(prefs), templates.MainPageHead())
return templates.Base("", templates.MainPage(prefs), templates.MainPageHead()).Render(c.RequestCtx(), c)
} }
app.Get("/", mainPageHandler) app.Get("/", mainPageHandler)
@@ -348,8 +357,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "tracks: "+q, templates.SearchTracks(p), nil)
return templates.Base("tracks: "+q, templates.SearchTracks(p), nil).Render(c.RequestCtx(), c)
case "users": case "users":
p, err := sc.SearchUsers("", prefs, c.Query("pagination", "?q="+url.QueryEscape(q))) p, err := sc.SearchUsers("", prefs, c.Query("pagination", "?q="+url.QueryEscape(q)))
@@ -358,8 +366,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "users: "+q, templates.SearchUsers(p), nil)
return templates.Base("users: "+q, templates.SearchUsers(p), nil).Render(c.RequestCtx(), c)
case "playlists": case "playlists":
p, err := sc.SearchPlaylists("", prefs, c.Query("pagination", "?q="+url.QueryEscape(q))) p, err := sc.SearchPlaylists("", prefs, c.Query("pagination", "?q="+url.QueryEscape(q)))
@@ -368,8 +375,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "playlists: "+q, templates.SearchPlaylists(p), nil)
return templates.Base("playlists: "+q, templates.SearchPlaylists(p), nil).Render(c.RequestCtx(), c)
} }
return c.SendStatus(404) return c.SendStatus(404)
@@ -463,8 +469,7 @@ Disallow: /`)
} }
} }
c.Response().Header.SetContentType("text/html") return render(c, templates.TrackEmbed(prefs, track, stream, displayErr))
return templates.TrackEmbed(prefs, track, stream, displayErr).Render(c.RequestCtx(), c)
}) })
app.Get("/tags/:tag", func(c fiber.Ctx) error { app.Get("/tags/:tag", func(c fiber.Ctx) error {
@@ -473,20 +478,14 @@ Disallow: /`)
return err return err
} }
cid, err := sc.GetClientID()
if err != nil {
return err
}
tag := c.Params("tag") 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 { if err != nil {
log.Printf("error getting %s tagged recent-tracks: %s\n", tag, err) log.Printf("error getting %s tagged recent-tracks: %s\n", tag, err)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "Recent tracks tagged "+tag, templates.RecentTracks(tag, p), nil)
return templates.Base("Recent tracks tagged "+tag, templates.RecentTracks(tag, p), nil).Render(c.RequestCtx(), c)
}) })
app.Get("/tags/:tag/popular-tracks", func(c fiber.Ctx) error { app.Get("/tags/:tag/popular-tracks", func(c fiber.Ctx) error {
@@ -495,20 +494,14 @@ Disallow: /`)
return err return err
} }
cid, err := sc.GetClientID()
if err != nil {
return err
}
tag := c.Params("tag") 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 { if err != nil {
log.Printf("error getting %s tagged popular-tracks: %s\n", tag, err) log.Printf("error getting %s tagged popular-tracks: %s\n", tag, err)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "Popular tracks tagged "+tag, templates.PopularTracks(tag, p), nil)
return templates.Base("Popular tracks tagged "+tag, templates.PopularTracks(tag, p), nil).Render(c.RequestCtx(), c)
}) })
app.Get("/tags/:tag/playlists", func(c fiber.Ctx) error { app.Get("/tags/:tag/playlists", func(c fiber.Ctx) error {
@@ -517,21 +510,15 @@ Disallow: /`)
return err return err
} }
cid, err := sc.GetClientID()
if err != nil {
return err
}
tag := c.Params("tag") tag := c.Params("tag")
// Using a different method, since /playlists/discovery endpoint seems to be broken :P // 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 { if err != nil {
log.Printf("error getting %s tagged playlists: %s\n", tag, err) log.Printf("error getting %s tagged playlists: %s\n", tag, err)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "Playlists tagged "+tag, templates.TaggedPlaylists(tag, p), nil)
return templates.Base("Playlists tagged "+tag, templates.TaggedPlaylists(tag, p), nil).Render(c.RequestCtx(), c)
}) })
app.Get("/discover", func(c fiber.Ctx) error { app.Get("/discover", func(c fiber.Ctx) error {
@@ -546,8 +533,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, "Discover", templates.Discover(selections), nil)
return templates.Base("Discover", templates.Discover(selections), nil).Render(c.RequestCtx(), c)
}) })
if cfg.ProxyImages { if cfg.ProxyImages {
@@ -637,8 +623,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserPlaylists(prefs, user, pl), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserPlaylists(prefs, user, pl), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/albums", func(c fiber.Ctx) error { app.Get("/:user/albums", func(c fiber.Ctx) error {
@@ -665,8 +650,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserAlbums(prefs, user, pl), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserAlbums(prefs, user, pl), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/reposts", func(c fiber.Ctx) error { app.Get("/:user/reposts", func(c fiber.Ctx) error {
@@ -693,8 +677,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserReposts(prefs, user, p), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserReposts(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/likes", func(c fiber.Ctx) error { app.Get("/:user/likes", func(c fiber.Ctx) error {
@@ -721,8 +704,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserLikes(prefs, user, p), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserLikes(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/popular-tracks", func(c fiber.Ctx) error { app.Get("/:user/popular-tracks", func(c fiber.Ctx) error {
@@ -749,8 +731,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserTopTracks(prefs, user, p), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserTopTracks(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/followers", func(c fiber.Ctx) error { app.Get("/:user/followers", func(c fiber.Ctx) error {
@@ -777,8 +758,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserFollowers(prefs, user, p), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserFollowers(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/following", func(c fiber.Ctx) error { app.Get("/:user/following", func(c fiber.Ctx) error {
@@ -805,8 +785,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserFollowing(prefs, user, p), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserFollowing(prefs, user, p), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/:track", func(c fiber.Ctx) error { app.Get("/:user/:track", func(c fiber.Ctx) error {
@@ -925,8 +904,7 @@ Disallow: /`)
downloadAudio = &audio downloadAudio = &audio
} }
c.Response().Header.SetContentType("text/html") 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))
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)
}) })
app.Get("/_/partials/comments/:id", func(c fiber.Ctx) error { app.Get("/_/partials/comments/:id", func(c fiber.Ctx) error {
@@ -952,12 +930,13 @@ Disallow: /`)
} }
if comm.Next != "" { if comm.Next != "" {
fmt.Println(comm.Next)
c.Set("next", "?pagination="+url.QueryEscape(strings.Split(comm.Next, "/comments")[1])) c.Set("next", "?pagination="+url.QueryEscape(strings.Split(comm.Next, "/comments")[1]))
} else { } else {
c.Set("next", "done") 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 { app.Get("/:user", func(c fiber.Ctx) error {
@@ -984,8 +963,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, usr.Username, templates.User(prefs, usr, p), templates.UserHeader(usr))
return templates.Base(usr.Username, templates.User(prefs, usr, p), templates.UserHeader(usr)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/sets/:playlist", func(c fiber.Ctx) error { app.Get("/:user/sets/:playlist", func(c fiber.Ctx) error {
@@ -1024,8 +1002,7 @@ Disallow: /`)
playlist.MissingTracks = strings.Join(next, ",") playlist.MissingTracks = strings.Join(next, ",")
} }
c.Response().Header.SetContentType("text/html") return r(c, playlist.Title+" by "+playlist.Author.Username, templates.Playlist(prefs, playlist), templates.PlaylistHeader(playlist))
return templates.Base(playlist.Title+" by "+playlist.Author.Username, templates.Playlist(prefs, playlist), templates.PlaylistHeader(playlist)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/_/related", func(c fiber.Ctx) error { app.Get("/:user/_/related", func(c fiber.Ctx) error {
@@ -1046,14 +1023,13 @@ Disallow: /`)
} }
user.Postfix(prefs) user.Postfix(prefs)
r, err := user.GetRelated(cid, prefs) rel, err := user.GetRelated(cid, prefs)
if err != nil { if err != nil {
log.Printf("error getting %s related users: %s\n", c.Params("user"), err) log.Printf("error getting %s related users: %s\n", c.Params("user"), err)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, user.Username, templates.UserRelated(prefs, user, rel), templates.UserHeader(user))
return templates.Base(user.Username, templates.UserRelated(prefs, user, r), templates.UserHeader(user)).Render(c.RequestCtx(), c)
}) })
// I'd like to make this "related" but keeping it "recommended" to have the same url as soundcloud // 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) 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 { if err != nil {
log.Printf("error getting %s from %s related tracks: %s\n", c.Params("track"), c.Params("user"), err) log.Printf("error getting %s from %s related tracks: %s\n", c.Params("track"), c.Params("user"), err)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, track.Title+" by "+track.Author.Username, templates.RelatedTracks(track, rel), templates.TrackHeader(prefs, track, false))
return templates.Base(track.Title+" by "+track.Author.Username, templates.RelatedTracks(track, r), templates.TrackHeader(prefs, track, false)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/:track/sets", func(c fiber.Ctx) error { app.Get("/:user/:track/sets", func(c fiber.Ctx) error {
@@ -1109,8 +1084,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, track.Title+" by "+track.Author.Username, templates.TrackInPlaylists(track, p), templates.TrackHeader(prefs, track, false))
return templates.Base(track.Title+" by "+track.Author.Username, templates.TrackInPlaylists(track, p), templates.TrackHeader(prefs, track, false)).Render(c.RequestCtx(), c)
}) })
app.Get("/:user/:track/albums", func(c fiber.Ctx) error { app.Get("/:user/:track/albums", func(c fiber.Ctx) error {
@@ -1137,8 +1111,7 @@ Disallow: /`)
return err return err
} }
c.Response().Header.SetContentType("text/html") return r(c, track.Title+" by "+track.Author.Username, templates.TrackInAlbums(track, p), templates.TrackHeader(prefs, track, false))
return templates.Base(track.Title+" by "+track.Author.Username, templates.TrackInAlbums(track, p), templates.TrackHeader(prefs, track, false)).Render(c.RequestCtx(), c)
}) })
// cute // cute

View File

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