Every video plays YouTube's way: hls.js reads the connection and picks the quality, or one is picked by hand, or Original plays the file as it is. The qualities (a ladder by size, H.264) are made on the fly in 3 s pieces from wherever the viewer seeks, one ffmpeg per play, paused when far enough ahead. 360 videos open in a look-around view (drag, pinch or scroll to zoom from 8 to 300 degrees, phone motion). Settings -> Transcode device picks the machine and device that makes them, for every machine's files: a machine transcoding another's file reads it through the hub by a token for that one file. Replaces the codec/size picker and the single-quality re-encoder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
1.6 KiB
Go
52 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"hamlab/internal/config"
|
|
"hamlab/internal/files"
|
|
)
|
|
|
|
// The file a machine transcodes from another is read through the hub by a token naming that
|
|
// one file: ranges pass through, the query can't point it anywhere else, and an unknown token
|
|
// is nothing.
|
|
func TestPlaySrc(t *testing.T) {
|
|
dir := t.TempDir()
|
|
p := filepath.Join(dir, "film.mp4")
|
|
if err := os.WriteFile(p, []byte("0123456789"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(dir, "other.mp4"), []byte("secret"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
s := &Server{fsLocal: files.Local{}, cfg: &config.Config{Listen: "10.0.0.234:8100"}}
|
|
u, err := s.srcURL("", "", p, false)
|
|
if err != nil || !strings.HasPrefix(u, "http://10.0.0.234:8100/api/play-src/") {
|
|
t.Fatalf("url %q %v", u, err)
|
|
}
|
|
tok := strings.TrimPrefix(u, "http://10.0.0.234:8100/api/play-src/")
|
|
get := func(tok, query, rng string) *httptest.ResponseRecorder {
|
|
r := httptest.NewRequest("GET", "/api/play-src/"+tok+query, nil)
|
|
r.SetPathValue("token", tok)
|
|
if rng != "" {
|
|
r.Header.Set("Range", rng)
|
|
}
|
|
w := httptest.NewRecorder()
|
|
s.playSrc(w, r)
|
|
return w
|
|
}
|
|
if w := get(tok, "", "bytes=2-4"); w.Code != 206 || w.Body.String() != "234" {
|
|
t.Fatalf("range: %d %q", w.Code, w.Body)
|
|
}
|
|
if w := get(tok, "?path="+filepath.Join(dir, "other.mp4"), ""); w.Body.String() != "0123456789" {
|
|
t.Fatalf("the query moved it: %q", w.Body)
|
|
}
|
|
if w := get("nope", "", ""); w.Code != 404 {
|
|
t.Fatalf("unknown token: %d", w.Code)
|
|
}
|
|
}
|