mirror of
https://github.com/screentinker/screentinker.git
synced 2026-06-17 11:42:40 -06:00
Each playlist item can carry schedule blocks (active days, start/end time-of-day, optional start/end dates). An item plays when the screen's local "now" matches at least one block; an item with no blocks always plays. #74 covers time-of-day/day-of-week windows including overnight wrap; #75 covers inclusive date ranges (auto-expiry). Evaluation is on-device, so dayparting and expiry work offline. - Shared evaluator contract: shared/schedule-vectors.json (39 vectors — DST US+AU, overnight-wrap anchoring, timezone correctness, date boundaries). Canonical JS evaluator in server/lib/schedule-eval.js; Kotlin and Tizen ports kept in lockstep by drift guards (Tizen byte-diff test, Kotlin JUnit reads the shared JSON, new android-test CI job). - All three players (web, Android, Tizen) filter by schedule against their own clock, idle with a "Nothing scheduled" message + 30s re-check when everything is filtered, and fail open on any evaluator error. - Editor: per-item schedule modal + row badge in the playlist editor; client validation mirrors the server; editing marks the playlist draft. - Part B (behaviour change): device/group schedule overrides now evaluate in each device's effective timezone instead of server-local time. - Device detail shows the reported timezone + a clock-skew warning. - i18n for en/es/fr/de/pt across all new strings (namespaced itemsched.* to avoid colliding with the device-schedule calendar's schedule.*). - CHANGELOG documents the feature, the Part B change, the fail-open guarantee, and the scheduled-single-video re-render tradeoff. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
34 lines
1.4 KiB
Bash
Executable file
34 lines
1.4 KiB
Bash
Executable file
#!/bin/bash
|
|
# Build the ScreenTinker Tizen .wgt.
|
|
# - If the Tizen CLI is available, sign with a security profile (arg 1, default
|
|
# "ScreenTinker") and emit a signed, TV-installable .wgt.
|
|
# - Otherwise, emit an UNSIGNED .wgt (plain zip) — fine for inspection / the
|
|
# URL-Launcher path, but TVs need a signed package.
|
|
# Only the app files are packaged (README/build script/.gitignore are excluded).
|
|
set -e
|
|
cd "$(dirname "$0")"
|
|
OUT="ScreenTinker.wgt"
|
|
FILES="config.xml index.html icon.png css js"
|
|
|
|
# Make the Tizen CLI discoverable if installed in the default location.
|
|
[ -d "$HOME/tizen-studio/tools/ide/bin" ] && export PATH="$HOME/tizen-studio/tools/ide/bin:$PATH"
|
|
rm -f "$OUT"
|
|
|
|
# #74/#75: refresh the bundled schedule evaluator from the single source so the
|
|
# .wgt always ships the canonical (byte-identical) copy, never a stale duplicate.
|
|
cp ../server/lib/schedule-eval.js js/schedule-eval.js
|
|
|
|
if command -v tizen >/dev/null 2>&1; then
|
|
PROFILE="${1:-ScreenTinker}"
|
|
echo "Tizen CLI found — signing with profile '$PROFILE'…"
|
|
STAGE="$(mktemp -d)"
|
|
cp -r $FILES "$STAGE"/
|
|
tizen package -t wgt -s "$PROFILE" -- "$STAGE" -o "$PWD" >/dev/null
|
|
rm -rf "$STAGE"
|
|
echo "Signed $OUT ready ($(du -h "$OUT" | cut -f1))."
|
|
else
|
|
echo "Tizen CLI not found — building UNSIGNED $OUT."
|
|
zip -r -X "$OUT" $FILES -x '*.DS_Store' '_*' >/dev/null
|
|
echo "Built $OUT ($(du -h "$OUT" | cut -f1), UNSIGNED — sign before installing on a TV)."
|
|
fi
|