diff --git a/internal/browser.go b/internal/browser.go new file mode 100644 index 0000000..db58c3f --- /dev/null +++ b/internal/browser.go @@ -0,0 +1,14 @@ +package internal + +import ( + "errors" + "os/exec" +) + +// openBrowser tries to open the embed URL in the system browser. +func openBrowser(link string) error { + if link == "" { + return errors.New("empty URL") + } + return exec.Command("xdg-open", link).Start() +} diff --git a/internal/stream_utils.go b/internal/stream_utils.go deleted file mode 100644 index 3e99238..0000000 --- a/internal/stream_utils.go +++ /dev/null @@ -1,94 +0,0 @@ -package internal - -import ( - "errors" - "fmt" - "io" - "net/http" - "net/url" - "os/exec" - "regexp" - "strings" - "time" -) - -// openBrowser tries to open the embed URL in the system browser. -func openBrowser(link string) error { - if link == "" { - return errors.New("empty URL") - } - return exec.Command("xdg-open", link).Start() -} - -// deriveHeaders guesses Origin, Referer, and User-Agent based on known embed domains. -func deriveHeaders(embed string) (origin, referer, ua string, err error) { - if embed == "" { - return "", "", "", errors.New("empty embed url") - } - - u, err := url.Parse(embed) - if err != nil { - return "", "", "", fmt.Errorf("parse url: %w", err) - } - - host := u.Host - if strings.Contains(host, "embedsports") { - origin = "https://embedsports.top" - referer = "https://embedsports.top/" - } else { - origin = fmt.Sprintf("https://%s", host) - referer = fmt.Sprintf("https://%s/", host) - } - - ua = "Mozilla/5.0 (X11; Linux x86_64; rv:144.0) Gecko/20100101 Firefox/144.0" - return origin, referer, ua, nil -} - -// fetchHTML performs a GET request with proper headers and returns body text. -func fetchHTML(embed, ua, origin, referer string, timeout time.Duration) (string, error) { - client := &http.Client{Timeout: timeout} - req, err := http.NewRequest("GET", embed, nil) - if err != nil { - return "", err - } - req.Header.Set("User-Agent", ua) - req.Header.Set("Origin", origin) - req.Header.Set("Referer", referer) - req.Header.Set("Accept", "*/*") - req.Header.Set("Accept-Language", "en-US,en;q=0.5") - - resp, err := client.Do(req) - if err != nil { - return "", err - } - defer resp.Body.Close() - - body, err := io.ReadAll(resp.Body) - if err != nil { - return "", err - } - - return string(body), nil -} - -// extractM3U8 uses regex to find an .m3u8 playlist link from an embed page. -func extractM3U8(html string) string { - re := regexp.MustCompile(`https?://[^\s'"]+\.m3u8[^\s'"]*`) - m := re.FindString(html) - return strings.TrimSpace(m) -} - -// launchMPV executes mpv with all the necessary HTTP headers. -func launchMPV(m3u8, ua, origin, referer string) error { - args := []string{ - "--no-terminal", - "--really-quiet", - fmt.Sprintf(`--http-header-fields=User-Agent: %s`, ua), - fmt.Sprintf(`--http-header-fields=Origin: %s`, origin), - fmt.Sprintf(`--http-header-fields=Referer: %s`, referer), - m3u8, - } - - cmd := exec.Command("mpv", args...) - return cmd.Start() -}