1
0
Fork 0
forked from External/mediamtx
mediamtx/internal/servers/hls/hlsjsdownloader/main.go
Bouke van der Bijl dfa2e81e61
Save a hash of the hls.min.js release (#3464)
This ensures the downloaded hls.js matches exactly and removes a dependency on cdn.jsdelivr.net
2024-06-17 23:15:18 +02:00

81 lines
1.4 KiB
Go

// Package main contains an utility to download hls.js
package main
import (
"archive/zip"
"bytes"
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"io/fs"
"log"
"net/http"
"os"
"strings"
)
func do() error {
buf, err := os.ReadFile("./hlsjsdownloader/VERSION")
if err != nil {
return err
}
version := strings.TrimSpace(string(buf))
log.Printf("downloading hls.js version %s...", version)
res, err := http.Get("https://github.com/video-dev/hls.js/releases/download/" + version + "/release.zip")
if err != nil {
return err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return fmt.Errorf("bad status code: %v", res.StatusCode)
}
zipBuf, err := io.ReadAll(res.Body)
if err != nil {
return err
}
hashBuf, err := os.ReadFile("./hlsjsdownloader/HASH")
if err != nil {
return err
}
hash := make([]byte, hex.DecodedLen(len(hashBuf)))
if _, err = hex.Decode(hash, bytes.TrimSpace(hashBuf)); err != nil {
return err
}
if sum := sha256.Sum256(zipBuf); !bytes.Equal(sum[:], hash) {
return fmt.Errorf("hash mismatch")
}
z, err := zip.NewReader(bytes.NewReader(zipBuf), int64(len(zipBuf)))
if err != nil {
return err
}
hls, err := fs.ReadFile(z, "dist/hls.min.js")
if err != nil {
return err
}
if err = os.WriteFile("hls.min.js", hls, 0o644); err != nil {
return err
}
log.Println("ok")
return nil
}
func main() {
err := do()
if err != nil {
log.Printf("ERR: %v", err)
os.Exit(1)
}
}