Roadmap, programming bible, metadata and matching design and asset inventory, as approved by Paul on 1 November 2026. Keeps both source briefs and the line-up concept sheet in the project, since their only copies were in Codex's working folders. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
142 lines
8.6 KiB
Markdown
142 lines
8.6 KiB
Markdown
# Orbit TV — local prototype
|
|
|
|
A native Android TV prototype for review on Paul's Xiaomi TV Box S 3rd Gen.
|
|
|
|
Roadmap and plans: [docs/roadmap.md](docs/roadmap.md), [programming bible](docs/programming-bible.md), [metadata and matching](docs/metadata-and-matching.md), [asset inventory](docs/asset-inventory.md).
|
|
|
|
## Revision 0.6.0 — one scheduled Emby channel
|
|
|
|
Paul confirmed the 0.5.0 strip hides and displays correctly. The next increment adds a
|
|
sample guide for one real channel: Menu → Connect Emby → Check 20 items → Create sample channel.
|
|
It checks at most five media-source metadata responses and keeps up to three eligible titles.
|
|
A precise UTC timeline repeats the lineup, joins in progress and advances automatically.
|
|
Watch channel uses the ordinary clock; Check transition jumps near an end for a quick handover
|
|
check and is labelled as a test. It may affect normal provider viewing history.
|
|
Now/Next in the strip and sample guide comes from that timeline. Pause/seek remain on-demand
|
|
features; the scheduled channel follows the clock. Back returns to the sample guide.
|
|
No channel, credentials or tokens are persisted yet. See docs/sample-scheduled-channel.md.
|
|
This version needs approval before TV installation and real channel/rollover acceptance testing.
|
|
|
|
## Revision 0.5.0 — Classic programme strip
|
|
|
|
Paul confirmed 0.4.0 played real provider media. This visual revision replaces its persistent
|
|
top banner/stock controller with a bottom classic programme strip that hides after five seconds
|
|
of active playback. OK reveals it; while visible OK toggles pause/play, and left/right seek.
|
|
The channel/guide/subtitle legend is visual only for now, as requested. Back still returns
|
|
to the sample. The stock subtitle/audio menu is not shown in this presentation pass.
|
|
See docs/classic-programme-strip.md. Logo artwork also loses the CRT's white cabinet outline.
|
|
The new presentation needs its own TV acceptance check and approval before installation.
|
|
|
|
## Revision 0.4.0 — small-sample playback test
|
|
|
|
The 20-item connection check succeeded on Paul's Xiaomi box. The next revision makes those
|
|
sample items playable, retaining the temporary login in memory until the sample screen exits.
|
|
Select a title, use fullscreen pause/seek/audio/subtitle controls, and Back to return to the sample.
|
|
Direct streaming is tested first: no automatic video transcoding, full scan or saved credentials.
|
|
Playback may update normal provider watch history. See docs/emby-playback-test.md for boundaries.
|
|
|
|
The 0.4.0 APK was installed, and Paul confirmed real media playback. An original gold/charcoal
|
|
OrbOffice drive-in ticket logo concept is included in design/, separately from the app interface.
|
|
Brand-name clearance is not established. The Android CLI skill was assessed, not installed.
|
|
|
|
## Revision 0.3.0 — Connect Emby
|
|
|
|
Menu → Connect Emby opens an on-TV username/password form for the selected provider.
|
|
Check 20 items performs one sign-in, one metadata-page request and a temporary-session logout.
|
|
The sample shows titles, media types, durations and available container/codec metadata.
|
|
No password, token or sample is persisted. Credentials stay out of chat and the APK.
|
|
The connection screen blocks screenshots and clears transient data when backgrounded.
|
|
The fixed provider URL is displayed before submission; no real account has been used in tests.
|
|
This does not yet import a library or play Emby video. See docs/emby-connection-check.md.
|
|
|
|
The prior 0.2.0 APK was installed and verified on Paul's Xiaomi box. The 0.3.0 build was subsequently installed; Paul confirmed the 20-record sample succeeded.
|
|
Later profile requirements are recorded in docs/profiles-roadmap.md.
|
|
|
|
## Revision 0.2.0
|
|
|
|
- Top navigation is now 1 Menu / 2 TV Guide / 3 Box Office.
|
|
- Menu links to the guide, OrbOffice and Services (including the OrbHive Bedlam roadmap).
|
|
- OrbOffice has two selectable fictional event ticket previews with an original perforated stub design.
|
|
- Barlow and Barlow Condensed are bundled for the new sections; their OFL licences are in licenses/.
|
|
- Existing guide and fullscreen playback-bar styling is preserved.
|
|
- Proper logo work is deferred; Paul wants a centred mark with safe padding in the TV app tile.
|
|
- Reproduce the design previews with design/render-designs.sh (requires FigCraft CLI and Pillow).
|
|
Fonts are loaded from a project-local XDG data directory, without a system font installation.
|
|
|
|
The first APK was installed on Paul's Xiaomi box. Paul confirmed navigation, tuning,
|
|
fullscreen playback and the bottom programme bar worked. Revision 0.2.0 was subsequently installed and verified on the box.
|
|
|
|
## What works in source
|
|
|
|
- Offline TV guide with three fictional channels and three half-hour columns.
|
|
- D-pad focus, programme descriptions, OK to tune the current show, Back to the guide.
|
|
- Current programme is determined from fixed UTC slots, not app launch time.
|
|
- Media3 joins the original 30-minute local demo video at the scheduled offset.
|
|
- One player moves between guide preview and fullscreen; playback pauses in background.
|
|
- Box Office is a ticket preview; Services keeps OrbHive Bedlam as an explicit roadmap item.
|
|
- Independent loopback-only TypeScript guide API, with no runtime npm dependencies.
|
|
- Editable FigCraft mockup and VectorCraft wordmark.
|
|
|
|
The Android app uses its bundled Kotlin schedule. It does not call the TypeScript service yet.
|
|
The same fictional titles and slot algorithm are duplicated for this proof of concept;
|
|
replace these with an API contract before adding real channel editing.
|
|
All channels use the same silent original test signal. This is not an Emby integration.
|
|
Titles and synopses are fictional. No third-party programme footage is included.
|
|
|
|
## Build
|
|
|
|
Prerequisites: Java 21; Android platform 36, build-tools 36.0.0 and platform-tools.
|
|
The inspected SDK is /opt/android-sdk. android/local.properties records that machine-local path
|
|
and is excluded from version control. Set ANDROID_HOME on another machine and create an
|
|
appropriate local.properties if needed.
|
|
|
|
Run `./build-android.sh` from the project root. The checked-in wrapper downloads the
|
|
SHA-256-pinned Gradle 9.3.1 distribution. Google/Maven Central access is needed initially.
|
|
Build dependencies, debug signing key and Gradle caches stay under .tooling/ when using the script.
|
|
The build uses AGP 9.1.1 and its built-in Kotlin support, with Compose compiler 2.2.10.
|
|
APK: android/app/build/outputs/apk/debug/app-debug.apk
|
|
Tests: android/app/build/test-results/testDebugUnitTest/
|
|
Lint: android/app/build/reports/lint-results-debug.html
|
|
|
|
## Backend
|
|
|
|
Requires Node 24 and npm. This PikaOS Node package lacks native TypeScript support,
|
|
so compilation uses the pinned TypeScript dev dependency.
|
|
|
|
```
|
|
cd server
|
|
npm ci --ignore-scripts
|
|
npm test
|
|
npm start
|
|
```
|
|
|
|
The development server binds only to 127.0.0.1:4317. Stop with Ctrl+C.
|
|
GET /health; GET /guide; optional ?at=<epoch-milliseconds>&count=1..48.
|
|
`node smoke-test.mjs` starts the service, checks responses and stops it automatically.
|
|
|
|
## Xiaomi hardware testing
|
|
|
|
The PC was paired with Paul's box; 0.1.0 and 0.2.0 were installed successfully. Ask before installing a new revision.
|
|
After approving a connection method, use Google's platform-tools to pair/connect as
|
|
supported by the box, then install the debug APK with `adb install -r <apk-path>`.
|
|
The launcher entry is Orbit TV. Pairing prompts and IP/port details come from the device;
|
|
do not guess them or expose ADB outside your trusted network.
|
|
The demo runs entirely on-device and needs no PC backend connection.
|
|
|
|
Acceptance checks on hardware:
|
|
1. Navigate every guide cell using only arrows and OK; check readable focus and text at sofa distance.
|
|
2. Tune each current programme, return with Back, open future programme information.
|
|
3. Open at 18 minutes past a half-hour and confirm Media3 joins around 18 minutes.
|
|
4. Cross a half-hour boundary in fullscreen and guide; ensure guide and video switch together.
|
|
5. Background/resume across a slot boundary; verify the current schedule is rejoined.
|
|
6. Check Box Office and Services return paths. Record Android version and output resolution.
|
|
|
|
## Remaining work
|
|
|
|
Paul confirmed playback, focus and remote navigation on 0.1.0 and praised the installed 0.2.0 revision. New connection form/keyboard behaviour needs hardware testing. No emulator was installed.
|
|
No Emby credentials or authenticated library have been accessed by development tools.
|
|
The provider's public identification API was checked read-only. No VPS administration was performed. No services or firewall were changed.
|
|
Emby indexing, incremental reconciliation, parental rules, calendar programming blocks,
|
|
channel editing, theme switching, seasonal events and OrbHive Bedlam are not implemented.
|
|
Open-source licensing and final branding remain decisions for Paul.
|