95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
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()
|
|
}
|