From 95c98dff10a576e7ee88ad31138c9658ffddb853 Mon Sep 17 00:00:00 2001 From: Laptop Date: Sat, 9 Nov 2024 10:56:01 +0200 Subject: [PATCH] restream endpoint: use track permalink instead of playlist url --- lib/cfg/init.go | 2 +- lib/restream/init.go | 29 +++++++++++++---------------- lib/sc/track.go | 9 ++------- main.go | 20 ++++++++++++++++---- templates/track.templ | 15 +++++++-------- 5 files changed, 39 insertions(+), 36 deletions(-) diff --git a/lib/cfg/init.go b/lib/cfg/init.go index 1f57efd..ff01594 100644 --- a/lib/cfg/init.go +++ b/lib/cfg/init.go @@ -31,7 +31,7 @@ var ProxyStreams = false // If this setting is set to true, ProxyStreams and FullyPreloadTrack will be ignored (you could count this as a replacement for having both as true, also should be a bit more effective) // You can also easily download the songs this way (right click => save audio as..., the only downside is that there is no metadata) var Restream = false -var RestreamCacheControl = "max-age=604800, public, immutable" // you shouldn't change this, it won't work the way you think it will (for now, maybe later i will fix it up) +var RestreamCacheControl = "max-age=604800, public, immutable" // enable /_/info endpoint (shows if some settings are enabled/disabled) var InstanceInfo = true diff --git a/lib/restream/init.go b/lib/restream/init.go index 56b756a..8852bfe 100644 --- a/lib/restream/init.go +++ b/lib/restream/init.go @@ -3,10 +3,10 @@ package restream import ( "bytes" "io" - "strings" "github.com/gofiber/fiber/v2" "github.com/maid-zone/soundcloak/lib/cfg" + "github.com/maid-zone/soundcloak/lib/sc" "github.com/valyala/fasthttp" ) @@ -111,23 +111,20 @@ func (r *reader) Read(buf []byte) (n int, err error) { } func Load(r fiber.Router) { - r.Get("/_/restream", func(c *fiber.Ctx) error { - // uncomment this to automatically get playlist of a track for easy testing - // t, err := sc.GetTrack("homelocked/por-mais-alguem-prod-homelocked") - // if err != nil { - // return err - // } + r.Get("/_/restream/:author/:track", func(c *fiber.Ctx) error { + t, err := sc.GetTrack(c.Params("author") + "/" + c.Params("track")) + if err != nil { + return err + } - // u, err := t.GetStream() - // if err != nil { - // return err - // } + tr := t.Media.SelectCompatible() + if tr == nil { + return fiber.ErrExpectationFailed + } - // and comment this - u := c.Query("playlist") - - if !strings.HasPrefix(u, "https://"+cdn+"/") { - return fiber.ErrBadRequest + u, err := tr.GetStream(t.Authorization) + if err != nil { + return err } c.Set("Content-Type", "audio/mpeg") diff --git a/lib/sc/track.go b/lib/sc/track.go index f3b9272..2a40ea3 100644 --- a/lib/sc/track.go +++ b/lib/sc/track.go @@ -256,12 +256,7 @@ func GetTracks(ids string) ([]*Track, error) { return res, err } -func (t Track) GetStream() (string, error) { - tr := t.Media.SelectCompatible() - if tr == nil { - return "", ErrIncompatibleStream - } - +func (tr Transcoding) GetStream(authorization string) (string, error) { cid, err := GetClientID() if err != nil { return "", err @@ -270,7 +265,7 @@ func (t Track) GetStream() (string, error) { req := fasthttp.AcquireRequest() defer fasthttp.ReleaseRequest(req) - req.SetRequestURI(tr.URL + "?client_id=" + cid + "&track_authorization=" + t.Authorization) + req.SetRequestURI(tr.URL + "?client_id=" + cid + "&track_authorization=" + authorization) req.Header.Set("User-Agent", cfg.UserAgent) req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd") diff --git a/main.go b/main.go index f807986..09f237f 100644 --- a/main.go +++ b/main.go @@ -126,10 +126,16 @@ func main() { return err } displayErr := "" + stream := "" + + tr := track.Media.SelectCompatible() + if tr == nil { + err = sc.ErrIncompatibleStream + } else if !cfg.Restream { + stream, err = tr.GetStream(track.Authorization) + } - stream, err := track.GetStream() if err != nil { - log.Printf("error getting %s stream from %s: %s\n", c.Params("track"), c.Params("user"), err) displayErr = "Failed to get track stream: " + err.Error() if track.Policy == sc.PolicyBlock { displayErr += "\nThis track may be blocked in the country where this instance is hosted." @@ -228,10 +234,16 @@ func main() { return err } displayErr := "" + stream := "" + + tr := track.Media.SelectCompatible() + if tr == nil { + err = sc.ErrIncompatibleStream + } else if !cfg.Restream { + stream, err = tr.GetStream(track.Authorization) + } - stream, err := track.GetStream() if err != nil { - log.Printf("error getting %s stream from %s: %s\n", c.Params("track"), c.Params("user"), err) displayErr = "Failed to get track stream: " + err.Error() if track.Policy == sc.PolicyBlock { displayErr += "\nThis track may be blocked in the country where this instance is hosted." diff --git a/templates/track.templ b/templates/track.templ index 1b7f03a..0dfd3d1 100644 --- a/templates/track.templ +++ b/templates/track.templ @@ -19,11 +19,11 @@ templ TrackHeader(t sc.Track) { } } -templ TrackPlayer(stream string, displayErr string) { - if stream != "" { +templ TrackPlayer(track sc.Track, stream string, displayErr string) { + if displayErr == "" { if cfg.Restream { - + } else if stream != "" { if cfg.FullyPreloadTrack { @@ -35,8 +35,7 @@ templ TrackPlayer(stream string, displayErr string) { JavaScript is disabled! Audio playback may not work without it enabled. } - } - if displayErr != "" { + } else {

{ displayErr }

@@ -66,7 +65,7 @@ templ Track(t sc.Track, stream string, displayErr string) { }

{ t.Title }

- @TrackPlayer(stream, displayErr) + @TrackPlayer(t, stream, displayErr) if t.Genre != "" {

{ t.Genre }

} else { @@ -114,7 +113,7 @@ templ TrackEmbed(t sc.Track, stream string, displayErr string) { }

{ t.Title }

- @TrackPlayer(stream, displayErr) + @TrackPlayer(t, stream, displayErr) @UserItem(&t.Author)