|
| 1 | +name: snap-mac |
| 2 | +on: push |
| 3 | +jobs: |
| 4 | + r: |
| 5 | + runs-on: macos-latest |
| 6 | + strategy: |
| 7 | + fail-fast: false |
| 8 | + matrix: |
| 9 | + gpu: ["auto", "software"] |
| 10 | + steps: |
| 11 | + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 |
| 12 | + with: { node-version: 22 } |
| 13 | + - run: brew install ffmpeg && pip3 install --break-system-packages pillow |
| 14 | + - name: project |
| 15 | + run: | |
| 16 | + mkdir p && cd p |
| 17 | + cat > index.html <<'H' |
| 18 | + <!doctype html> |
| 19 | + <html><head><meta charset="UTF-8" /> |
| 20 | + <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script> |
| 21 | + <style>body{margin:0;width:640px;height:360px;overflow:hidden;background:#000}.scene{position:absolute;inset:0;opacity:0;visibility:hidden}</style></head> |
| 22 | + <body> |
| 23 | + <div id="root" data-composition-id="main" data-start="0" data-duration="30" data-width="640" data-height="360"> |
| 24 | + <div id="s0" class="scene" style="background:#0000ff"></div> |
| 25 | + <div id="s1" class="scene" style="background:#ff0000"></div> |
| 26 | + <div id="s2" class="scene" data-composition-id="g" data-composition-src="g.html" data-start="11.5" data-duration="0.3" data-track-index="1"></div> |
| 27 | + <div id="s3" class="scene" style="background:#ffff00"></div> |
| 28 | + <div id="s4" class="scene" data-composition-id="p" data-composition-src="p.html" data-start="12.05" data-duration="17.95" data-track-index="2"></div> |
| 29 | + </div> |
| 30 | + <script> |
| 31 | + window.__timelines = window.__timelines || {}; |
| 32 | + var tl = gsap.timeline({ paused: true }); |
| 33 | + tl.set("#s0", { autoAlpha: 1 }, 0).set("#s0", { autoAlpha: 0 }, 11.3); |
| 34 | + tl.set("#s1", { autoAlpha: 1 }, 11.3).set("#s1", { autoAlpha: 0 }, 11.5); |
| 35 | + tl.set("#s3", { autoAlpha: 1 }, 11.8).set("#s3", { autoAlpha: 0 }, 12.05); |
| 36 | + tl.set("#s2", { autoAlpha: 1 }, 11.5).set("#s2", { autoAlpha: 0 }, 11.8); |
| 37 | + tl.set("#s4", { autoAlpha: 1 }, 12.05); |
| 38 | + tl.to({}, { duration: 30 }, 0); |
| 39 | + window.__timelines["main"] = tl; |
| 40 | + </script> |
| 41 | + </body></html> |
| 42 | + H |
| 43 | + mk() { cat > $1.html <<H |
| 44 | + <template id="$1-template"><div id="$1" data-composition-id="$1" data-width="640" data-height="360"><div class="box" style="position:absolute;inset:0;background:#$2"></div><script>window.__timelines = window.__timelines || {}; var t = gsap.timeline({ paused: true }); t.fromTo("#$1 .box", { opacity: 0.99 }, { opacity: 1, duration: 1 }); window.__timelines["$1"] = t;</script></div></template> |
| 45 | + H |
| 46 | + } |
| 47 | + mk g 00ff00 |
| 48 | + mk p ff00ff |
| 49 | + cat > ../check.py <<'PY' |
| 50 | + import glob |
| 51 | + from PIL import Image |
| 52 | + names = {"0000ff":"BLUE(opening)","ff0000":"red","00ff00":"green","ffff00":"yellow","ff00ff":"purple"} |
| 53 | + exp = ["BLUE(opening)","red","green","yellow","purple"] |
| 54 | + files = sorted(glob.glob(".hyperframes/artifacts/snapshots/*/frame-*.png"))[:5] |
| 55 | + got = [] |
| 56 | + for f in files: |
| 57 | + im = Image.open(f).convert("RGB"); r,g,b = im.getpixel((im.width//2, im.height//2)) |
| 58 | + near = min(names, key=lambda k: sum(abs(a-int(k[i*2:i*2+2],16)) for i,a in enumerate((r,g,b)))) |
| 59 | + got.append(names[near]) |
| 60 | + print("RESULT", " ".join(got), "OK" if got == exp else "WRONG-FRAME") |
| 61 | + PY |
| 62 | + - name: runs |
| 63 | + working-directory: p |
| 64 | + run: | |
| 65 | + flag=""; [ "${{ matrix.gpu }}" = software ] && flag="--no-browser-gpu" |
| 66 | + run() { for i in 1 2 3 4 5 6; do rm -rf .hyperframes; npx -y hyperframes@0.8.207 snapshot $flag --at 11.25,11.37,11.60,11.94,12.15 > snap.log 2>&1; echo "$1 run $i exit $?"; python3 ../check.py; done; } |
| 67 | + run idle |
| 68 | + for n in 1 2 3 4 5 6; do (ffmpeg -hide_banner -loglevel error -f lavfi -i testsrc2=size=1920x1080:rate=30 -t 400 -c:v libx264 -preset slow -f null - &) ; done |
| 69 | + sleep 3 |
| 70 | + run loaded |
0 commit comments