Files
seanime-docker/seanime-2.9.10/internal/onlinestream/sources/streamtape.go
2025-09-20 14:08:38 +01:00

65 lines
1.3 KiB
Go

package onlinestream_sources
import (
"errors"
"io"
"net/http"
"regexp"
"seanime/internal/util"
"strings"
hibikeonlinestream "seanime/internal/extension/hibike/onlinestream"
)
type (
Streamtape struct {
Client *http.Client
}
)
func NewStreamtape() *Streamtape {
return &Streamtape{
Client: &http.Client{},
}
}
func (s *Streamtape) Extract(uri string) (vs []*hibikeonlinestream.VideoSource, err error) {
defer util.HandlePanicInModuleThen("onlinestream/sources/streamtape/Extract", func() {
err = ErrVideoSourceExtraction
})
var ret []*hibikeonlinestream.VideoSource
resp, err := s.Client.Get(uri)
if err != nil {
return nil, err
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
re := regexp.MustCompile(`robotlink'\).innerHTML = (.*)'`)
match := re.FindStringSubmatch(string(body))
if len(match) == 0 {
return nil, errors.New("could not find robotlink")
}
fhsh := strings.Split(match[1], "+ ('")
fh := fhsh[0]
sh := fhsh[1][3:]
fh = strings.ReplaceAll(fh, "'", "")
url := "https:" + fh + sh
ret = append(ret, &hibikeonlinestream.VideoSource{
URL: url,
Type: map[bool]hibikeonlinestream.VideoSourceType{true: hibikeonlinestream.VideoSourceM3U8, false: hibikeonlinestream.VideoSourceMP4}[strings.Contains(url, ".m3u8")],
Quality: QualityAuto,
})
return ret, nil
}