8cb1f9f479
Publish SDK (PyPI) / publish (push) Waiting to run
Publish SDK (npm) / publish (@aionui/officecli-sdk) (push) Waiting to run
Publish SDK (npm) / publish (@officecli/officecli-sdk) (push) Waiting to run
Publish SDK (npm) / publish (@officecli/sdk) (push) Waiting to run
Publish SDK (npm) / publish (officecli-sdk) (push) Waiting to run
SDK smoke / smoke (windows-latest) (push) Waiting to run
SDK smoke / smoke (macos-latest) (push) Waiting to run
SDK smoke / smoke (ubuntu-latest) (push) Waiting to run
Skill parity / diff (push) Waiting to run
119 lines
4.8 KiB
Bash
Executable File
119 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
||
# Video Showcase — generates video.pptx with an embedded MP4 (poster, sizing,
|
||
# volume, autoplay, loop, trim) across four slides.
|
||
# CLI twin of video.py (officecli Python SDK). Both produce an equivalent video.pptx.
|
||
#
|
||
# Requirements (for the generated media): pip install imageio imageio-ffmpeg numpy
|
||
# Usage: ./video.sh [officecli path]
|
||
# NOTE: intentionally NO `set -e`. Like the SDK twin's doc.batch, this script
|
||
# tolerates forward-compat 'UNSUPPORTED props' warnings (officecli exit 2) and
|
||
# keeps building so the full document is produced.
|
||
CLI="${1:-officecli}"
|
||
DIR="$(dirname "$0")"
|
||
FILE="$DIR/video.pptx"
|
||
|
||
# --- Generate the demo video + poster into a temp dir (mirrors video.py) ------
|
||
TMP="$(mktemp -d "${TMPDIR:-/tmp}/officecli_video_XXXXXX")"
|
||
VIDEO="$TMP/demo.mp4"
|
||
COVER="$TMP/cover.png"
|
||
trap 'rm -rf "$TMP"' EXIT
|
||
|
||
echo "[1/3] Generating video and cover image..."
|
||
python3 - "$VIDEO" "$COVER" <<'PY'
|
||
import sys
|
||
try:
|
||
import imageio.v3 as iio
|
||
import numpy as np
|
||
except ImportError:
|
||
print("ERROR: imageio not installed. Run: pip install imageio imageio-ffmpeg numpy")
|
||
sys.exit(1)
|
||
|
||
video_path, cover_path = sys.argv[1], sys.argv[2]
|
||
W, H, FPS, DURATION = 640, 360, 30, 3
|
||
total_frames = FPS * DURATION
|
||
frames = []
|
||
for i in range(total_frames):
|
||
t = i / (total_frames - 1)
|
||
frame = np.zeros((H, W, 3), dtype=np.uint8)
|
||
for y in range(H):
|
||
yf = y / H
|
||
r = int(20 + 60 * t + 40 * yf)
|
||
g = int(30 + 80 * (1 - abs(t - 0.5) * 2) * (1 - yf))
|
||
b = int(80 + 120 * (1 - t) + 50 * yf)
|
||
frame[y, :, 0] = min(r, 255)
|
||
frame[y, :, 1] = min(g, 255)
|
||
frame[y, :, 2] = min(b, 255)
|
||
cx = int(100 + t * (W - 200)); cy = H // 2; radius = 40
|
||
yy, xx = np.ogrid[:H, :W]
|
||
mask = (xx - cx) ** 2 + (yy - cy) ** 2 < radius ** 2
|
||
frame[mask, 0] = 255; frame[mask, 1] = 200; frame[mask, 2] = 50
|
||
for row in range(3):
|
||
bar_y = 60 + row * 50
|
||
bar_w = int(200 + 100 * (1 - abs(t - 0.5) * 2))
|
||
frame[bar_y:bar_y + 12, 50:50 + bar_w, :] = [200, 200, 220]
|
||
frames.append(frame)
|
||
iio.imwrite(video_path, frames, fps=FPS)
|
||
iio.imwrite(cover_path, frames[0])
|
||
PY
|
||
|
||
echo "[2/3] Building presentation: $FILE"
|
||
rm -f "$FILE"
|
||
$CLI create "$FILE"
|
||
$CLI open "$FILE"
|
||
|
||
# ---- Slide 1: Title slide with gradient background ----
|
||
$CLI add "$FILE" / --type slide --prop layout=title
|
||
$CLI set "$FILE" /slide[1] --prop background=radial:1B2838-4472C4-bl
|
||
$CLI set "$FILE" /slide[1]/placeholder[ctrTitle] --prop text="Video Demo" --prop color=FFFFFF --prop size=44
|
||
$CLI set "$FILE" /slide[1]/placeholder[subTitle] --prop text="Embedded video with officecli" --prop color=B4C7E7 --prop size=20
|
||
|
||
# ---- Slide 2: Video slide ----
|
||
$CLI add "$FILE" / --type slide --prop title="Animated Video"
|
||
$CLI set "$FILE" /slide[2] --prop background=0D1B2A
|
||
$CLI set "$FILE" /slide[2]/shape[1] --prop color=FFFFFF
|
||
$CLI add "$FILE" /slide[2] --type video \
|
||
--prop src="$VIDEO" \
|
||
--prop poster="$COVER" \
|
||
--prop x=2cm --prop y=4cm --prop width=22cm --prop height=12.5cm \
|
||
--prop volume=80 --prop autoplay=true
|
||
|
||
# ---- Slide 3: Video info with chart ----
|
||
$CLI add "$FILE" / --type slide --prop title="Video Properties"
|
||
$CLI set "$FILE" /slide[3] --prop background=1B2838
|
||
$CLI set "$FILE" /slide[3]/shape[1] --prop color=FFFFFF
|
||
$CLI add "$FILE" /slide[3] --type shape \
|
||
--prop text="Resolution: 640x360\nFPS: 30\nDuration: 3s\nFormat: MP4" \
|
||
--prop font=Consolas --prop size=16 --prop color=B4C7E7 \
|
||
--prop x=1cm --prop y=4cm --prop width=10cm --prop height=6cm \
|
||
--prop fill=0D1B2A --prop line=4472C4 --prop linewidth=1pt
|
||
$CLI add "$FILE" /slide[3] --type chart \
|
||
--prop chartType=bar --prop title="Frame Colors" \
|
||
--prop categories="Red,Green,Blue" \
|
||
--prop "series1=Start:20,30,200" \
|
||
--prop "series2=End:80,30,80" \
|
||
--prop colors=E74C3C,27AE60 \
|
||
--prop x=13cm --prop y=4cm --prop width=12cm --prop height=8cm
|
||
|
||
# ---- Slide 4: loop / trimStart / trimEnd ----
|
||
$CLI add "$FILE" / --type slide --prop title="loop / trimStart / trimEnd"
|
||
$CLI set "$FILE" /slide[4] --prop background=0D1B2A
|
||
$CLI set "$FILE" /slide[4]/shape[1] --prop color=FFFFFF
|
||
# loop=true — video restarts after it reaches the end
|
||
# trimStart / trimEnd — play only a sub-range of the video (seconds)
|
||
$CLI add "$FILE" /slide[4] --type video \
|
||
--prop src="$VIDEO" \
|
||
--prop poster="$COVER" \
|
||
--prop x=2cm --prop y=4cm --prop width=22cm --prop height=12.5cm \
|
||
--prop volume=60 --prop autoplay=true \
|
||
--prop loop=true --prop trimStart=0 --prop trimEnd=2
|
||
$CLI add "$FILE" /slide[4] --type shape \
|
||
--prop text="loop=true trimStart=0 trimEnd=2\nVideo loops continuously; playback is clipped to the 0–2s range." \
|
||
--prop size=14 --prop color=B4C7E7 \
|
||
--prop x=1cm --prop y=17cm --prop width=24cm --prop height=2cm
|
||
|
||
$CLI close "$FILE"
|
||
|
||
echo "[3/3] Validating..."
|
||
$CLI validate "$FILE"
|
||
echo "Generated: $FILE"
|