some fixes in restream again

This commit is contained in:
Laptop
2025-04-29 22:06:37 +03:00
parent 0ca7a3986a
commit d2117e5182
3 changed files with 49 additions and 22 deletions

2
go.mod
View File

@@ -10,7 +10,7 @@ require (
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.60.0 github.com/valyala/fasthttp v1.61.0
) )
require ( require (

4
go.sum
View File

@@ -62,8 +62,8 @@ 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.2.5/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.60.0 h1:kBRYS0lOhVJ6V+bYN8PqAHELKHtXqwq9zNMLKx1MBsw= github.com/valyala/fasthttp v1.61.0 h1:VV08V0AfoRaFurP1EWKvQQdPTZHiUzaVoulX1aBDgzU=
github.com/valyala/fasthttp v1.60.0/go.mod h1:iY4kDgV3Gc6EqhRZ8icqcmlG6bqhcDXfuHgTO4FXCvc= github.com/valyala/fasthttp v1.61.0/go.mod h1:wRIV/4cMwUPWnRcDno9hGnYZGh78QzODFfo1LTUhBog=
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=

View File

@@ -16,6 +16,7 @@ import (
"github.com/gcottom/mp4meta" "github.com/gcottom/mp4meta"
"github.com/gcottom/oggmeta" "github.com/gcottom/oggmeta"
"github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3"
"github.com/valyala/fasthttp"
) )
type collector struct { type collector struct {
@@ -67,7 +68,6 @@ func Load(r *fiber.App) {
c.Request().Header.SetContentType(tr.Format.MimeType) c.Request().Header.SetContentType(tr.Format.MimeType)
c.Set("Cache-Control", cfg.RestreamCacheControl) c.Set("Cache-Control", cfg.RestreamCacheControl)
r := acquireReader()
if isDownload { if isDownload {
if t.Artwork != "" { if t.Artwork != "" {
t.Artwork = strings.Replace(t.Artwork, "t500x500", "original", 1) t.Artwork = strings.Replace(t.Artwork, "t500x500", "original", 1)
@@ -75,6 +75,7 @@ func Load(r *fiber.App) {
switch audio { switch audio {
case cfg.AudioMP3: case cfg.AudioMP3:
r := acquireReader()
err := r.Setup(u, false, nil) err := r.Setup(u, false, nil)
if err != nil { if err != nil {
return err return err
@@ -106,21 +107,47 @@ func Load(r *fiber.App) {
tag.WriteTo(&col) tag.WriteTo(&col)
r.leftover = col.data r.leftover = col.data
c.Response().Header.SetContentType("audio/mpeg")
return c.SendStream(r) return c.SendStream(r)
case cfg.AudioOpus: case cfg.AudioOpus: // might try to fuck around with metadata injection. Dynamically injecting metadata for opus wasn't really good idea as it breaks some things :P
err := r.Setup(u, false, nil) req := fasthttp.AcquireRequest()
resp := fasthttp.AcquireResponse()
req.SetRequestURI(u)
req.Header.SetUserAgent(cfg.UserAgent)
req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
err := sc.DoWithRetry(misc.HlsClient, req, resp)
if err != nil { if err != nil {
return err return err
} }
r.req.SetRequestURIBytes(r.parts[0]) data, err := resp.BodyUncompressed()
err = sc.DoWithRetry(r.client, r.req, r.resp)
if err != nil { if err != nil {
return err data = resp.Body()
} }
r.index++ res := make([]byte, 0, 1024*1024*1)
tag, err := oggmeta.ReadOGG(bytes.NewReader(r.resp.Body())) for _, s := range bytes.Split(data, []byte{'\n'}) {
if len(s) == 0 || s[0] == '#' {
continue
}
req.SetRequestURIBytes(s)
err := sc.DoWithRetry(misc.HlsClient, req, resp)
if err != nil {
return err
}
data, err = resp.BodyUncompressed()
if err != nil {
data = resp.Body()
}
res = append(res, data...)
}
tag, err := oggmeta.ReadOGG(bytes.NewReader(res))
if err != nil { if err != nil {
return err return err
} }
@@ -133,30 +160,27 @@ func Load(r *fiber.App) {
tag.SetTitle(t.Title) tag.SetTitle(t.Title)
if t.Artwork != "" { if t.Artwork != "" {
r.req.SetRequestURI(t.Artwork) req.SetRequestURI(t.Artwork)
r.req.Header.Del("Accept-Encoding") req.Header.Del("Accept-Encoding")
err := sc.DoWithRetry(misc.ImageClient, r.req, r.resp) err := sc.DoWithRetry(misc.ImageClient, req, resp)
if err != nil { if err != nil {
return err return err
} }
parsed, _, err := image.Decode(r.resp.BodyStream()) parsed, _, err := image.Decode(resp.BodyStream())
r.resp.CloseBodyStream() resp.CloseBodyStream()
if err != nil { if err != nil {
return err return err
} }
tag.SetCoverArt(&parsed) tag.SetCoverArt(&parsed)
r.req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
} }
var col collector c.Response().Header.SetContentType(`audio/ogg; codecs="opus"`)
tag.Save(&col) return tag.Save(c.Response().BodyWriter())
r.leftover = col.data
return c.SendStream(r)
case cfg.AudioAAC: case cfg.AudioAAC:
r := acquireReader()
err := r.Setup(u, true, &t.Duration) err := r.Setup(u, true, &t.Duration)
if err != nil { if err != nil {
return err return err
@@ -202,12 +226,15 @@ func Load(r *fiber.App) {
var col collector var col collector
tag.Save(&col) tag.Save(&col)
fixDuration(col.data, &t.Duration)
r.leftover = col.data r.leftover = col.data
c.Response().Header.SetContentType("audio/mp4")
return c.SendStream(r) return c.SendStream(r)
} }
} }
r := acquireReader()
if audio == cfg.AudioAAC { if audio == cfg.AudioAAC {
err = r.Setup(u, true, &t.Duration) err = r.Setup(u, true, &t.Duration)
} else { } else {