diff --git a/download.go b/download.go index f10ed74..1d29a92 100644 --- a/download.go +++ b/download.go @@ -15,9 +15,11 @@ import ( "github.com/orestonce/gopool" "io" "io/ioutil" + "net/http" "net/url" "os" "path/filepath" + "regexp" "strconv" "strings" "sync" @@ -76,6 +78,12 @@ func RunDownload(req RunDownload_Req) (resp RunDownload_Resp) { if req.SkipTsCountFromHead < 0 { req.SkipTsCountFromHead = 0 } + var err error + req.M3u8Url, err = sniffM3u8(req.M3u8Url) + if err != nil { + resp.ErrMsg = "sniffM3u8: " + err.Error() + return resp + } id, err := req.getVideoId() if err != nil { resp.ErrMsg = "getVideoId: " + err.Error() @@ -510,7 +518,23 @@ func getFileSha256(targetFile string) (v string) { return hex.EncodeToString(tmp[:]) } -func getStringSha256(s string) (v string) { - tmp := sha256.Sum256([]byte(s)) - return hex.EncodeToString(tmp[:]) +func sniffM3u8(urlS string) (afterUrl string, err error) { + if strings.HasSuffix(strings.ToLower(urlS), ".m3u8") { + return urlS, nil + } + resp, err := http.DefaultClient.Get(urlS) + if err != nil { + return "", err + } + defer resp.Body.Close() + + content, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + groups := regexp.MustCompile(`http[s]://[a-zA-Z0-9/\\.%_-]+.m3u8`).FindSubmatch(content) + if len(groups) == 0 { + return "", errors.New("未发现m3u8资源") + } + return string(groups[0]), nil } diff --git a/ffmpeg_windows.go b/ffmpeg_windows.go index d6c230c..0d90b8b 100644 --- a/ffmpeg_windows.go +++ b/ffmpeg_windows.go @@ -1,3 +1,5 @@ +//+build windows + package m3u8d import ( diff --git a/m3u8d-qt/m3u8d-impl.a b/m3u8d-qt/m3u8d-impl.a index 81caad2..05c78f5 100644 Binary files a/m3u8d-qt/m3u8d-impl.a and b/m3u8d-qt/m3u8d-impl.a differ