Repository navigation
Reel: streaming service sample with core DRM streaming API - #6086
shai-almog wants to merge 34 commits into
Conversation
AES-128 HLS on every port whose player decrypts it, Widevine/ClearKey on Android through the framework MediaPlayer DRM API, FairPlay on iOS through AVContentKeySession, and stream request headers on Android. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…DASH and availability (red-team round 1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Catalog, recommendations, playback with AES-128/ClearKey keys served only to live sessions, Widevine/FairPlay license proxying, plans, rentals and coupons, ads, studio uploads in checked pieces, a packaging worker, moderation with frame blocklists, quizzes, polls, branching and certificates, an admin console API and the demo catalog of Blender open movies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Quality cap on cenc.mp4, device sign-out ends its OAuth grant, downloads withdrawn on suspension/sharing and dead with their device, server-side profile PIN keys and kids edits, re-review of changed published titles, stale approvals refused, renewal retries a day apart, coupons once per account, rentals only of published titles, DRM scheme packaging checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eclares it A @mapped record gathers its components in locals named _<component>, and readXml declares helper locals of the same shape (_kids, _i, _e, _ch). A record with a component named kids therefore failed to build on the generated source. Components now take two underscores. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fications The Codename One client for every mode, with the device id sent on each request, and a backend Notifier: new episodes to followers on the devices that asked, and account news (new sign-in, failed payment, moderation). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eplace bytecode-compliance runs before process-annotations, so it read the previous build's generated mappers and REST clients; after a shared DTO changed, the stale mapper named a constructor that no longer exists and failed the build. Processing now records the class files it wrote beside the output directory, and the check leaves those out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Player: a session opened after the viewer left is stopped; heartbeats run on their own timer so dialogs and the chapters list no longer silence them, and report paused during ads; offline playback blocks screenshots, carries the watermark and releases the player. Ads: one guarded finish per ad that stops the countdown. Uploads: one forward stream per file and a synchronous status check on resync; no answer is retried. Downloads: listed from the device so they work offline, forgotten on sign-out and server change, and a failed one is cleaned up and reported. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The simulator suite (viewer, studio, moderation, admin) and the browser run now drive Reel's own screens; all four simulator flows pass against a JVM server. reel.yml runs the server tests on the JVM, compiled and on each database, the simulator and browser runs, and the device builds. The bundles carry Reel's strings in five languages, the last food-delivery text and comments are gone, tools/fetch-demo-media.sh packages the Blender films the server reads, and server.sh runs on the JDK in JAVA_HOME. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Registered beside Parley (template picker, brand, generated README, matrix test, fixtures, sync script); check-template.sh builds a generated project. The fixture generator now looks for the sample's name in its three exact spellings: "reel" sits inside "hasMoreElements". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The compiled server's class library has no regular expressions or time zones: String.split, replaceAll and SimpleDateFormat.setTimeZone become Rows.split, Rows.words and Rows.utcDay, held to the JDK's answers by RowsTest. Artwork shows a film mark until (or unless) the picture arrives, the title actions get room for their words, and the hero buttons a gap. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed ads A heartbeat and a download license now check again that the title is published and the plan or a rental covers it; a download needs its device still signed in; an ad event counts only for a campaign the server served that session; Download is offered only where ClearKey plays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing installed a JdkHost on a compiled server, so every MessageDigest algorithm was unavailable. The host wraps the shared Hash (MD5 to SHA-512) and supplies random bytes; the JVM twin is a no-op. SelfTest checks the known answers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two requests for the same image URL raced: the second found the file the first had opened but not yet written and handed back an image of zero bytes, which threw on first use. A failed download leaves the same empty entry. Either is now treated as absent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…view Also: fetch-demo-media.sh runs the packager on JAVA_HOME's java, the admin user page shows None for an account with no plan, and scripts/reel is MIT-0 like the other Initializr samples for the header gate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 12 screenshots: 12 matched. |
Cloudflare Preview
|
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
|
Compared 227 screenshots: 227 matched. |
|
Compared 206 screenshots: 206 matched. Benchmark ResultsDetailed Performance Metrics
|
|
Compared 191 screenshots: 191 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
|
Compared 206 screenshots: 206 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows x64Runner CPU: Intel64 Family 6 Model 106 Stepping 6, GenuineIntel (baseline 1 performance regression:
1 improvement past the baseline (not a failure; rebaseline to lock it in):
Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
A change that moves performance ON PURPOSE records the new baseline in Result: performance regression |
|
Compared 206 screenshots: 206 matched. ParparVM vs HotSpot (JDK 25): Linux x64Runner CPU: AMD EPYC 7763 64-Core Processor (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
|
Compared 206 screenshots: 206 matched. ParparVM vs HotSpot (JDK 25): Linux arm64Runner CPU: Neoverse-N2 (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
|
Compared 206 screenshots: 206 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows arm64Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
Flutter vs Codename OneSame application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor. android9 interleaved rounds; host load 0.74, 2.13, 1.71
Compute -- the VM workloads (
Gate: within tolerance against
ios9 interleaved rounds; host load 33.0, 21.69, 12.33
Compute -- the VM workloads ( Not measured: iOS compute is not measured: a device build needs signed hardware, and on the simulator Flutter runs its JIT debug engine rather than AOT code. The macOS row runs the same ParparVM and Dart AOT compilers on the same Apple silicon. Gate: within tolerance against
javascript9 interleaved rounds; host load 1.98, 1.28, 0.56
Compute -- the VM workloads (
Gate: within tolerance against
linux9 interleaved rounds; host load 0.22, 2.9, 2.45
Compute -- the VM workloads (
Gate: within tolerance against
macos9 interleaved rounds; host load 1.5, 13.66, 18.36
Compute -- the VM workloads (
Gate: within tolerance against
windows9 interleaved rounds
Compute -- the VM workloads (
Gate: within tolerance against
Codename One wins 26 of 26 measured metrics across 6 platform(s). |
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AES-128 is supported by the default implementation, header values with line breaks are rejected, DASH is no longer claimed, the iOS FairPlay path checks its license URL, and Android stops preparing a player closed during license acquisition. The guide documents the FairPlay certificate as a URL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The implementor's guide includes its snippets from docs/demos and from tagged PlayerForm code, as the guide gate requires; scripts/reel is an allowed include root and in the docs workflow's paths. - check-native-signatures compiles the backend with the class library's JdkHost, which ClassLibraryHost extends. - The media origin creates its directory, so a server with no packaged media answers 404 for art rather than failing the request. - The web test switches the admin to the console from the menu: staff open watching, like everyone else. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 192 screenshots: 192 matched. Benchmark Results
Detailed Performance Metrics
ParparVM vs HotSpot (JDK 25): macOS arm64Runner CPU: Apple M1 (Virtual) (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
Result: no regression |
The home screen and a title's page lead with the artwork across the whole width (Backdrop), shaded into the page by a per-row alpha gradient so the title stays readable. Rows are landscape tiles; on a wide window the sections sit along the top bar and the hero text moves left. Dark is the default theme, the app has its own icon, and posters are frames picked by hand instead of the opening titles. run-e2e.sh now runs the desktop pass on every OS through an in-memory preferences store, sizes the window like a laptop and keeps both sets of captures; the guide gains desktop shots and fresh phone shots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Compared 189 screenshots: 189 matched. Benchmark Results
Build and Run Timing
Detailed Performance Metrics
|
Reel follows master's Initializr changes: a complete-app choice in the regrouped picker, the JUnit 5 engine in its template pom, and a REEL leg in the released-download e2e. Reel needs the core DRM API from this PR, so the page offers it only from REEL_SINCE and e2e-shipped.sh skips it before then. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reel plays through the core DRM API this PR adds, which no release before 7.0.280 has. GeneratorModel.sinceFor(template) is now the one gate: the page does not list Reel below it, validateOptions refuses to generate it, and the fixtures and tests generate each template at its own gate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Player: auto-hiding transport (back/forward 10s, play/pause), scrub bar with elapsed and remaining time, chapters, next episode, and an Audio & subtitles sheet with subtitle, audio and quality choices. Subtitles are WebVTT drawn by the app; audio and quality reopen at the same position. - A stream that fails keeps the player up with the reason instead of leaving. - Title page: rating, advisories, HD/4K/CC, languages, share sheet, and a course explainer with progress. Home rows carry captions. - Settings: streaming quality, subtitle language and caption size. - Studio: content advisories and subtitle tracks per video. - Backend: subtitle tracks, audio tracks, qualities, shared watch page. - E2e: PlaybackTest and AccountTest capture the new screens; the guide shows them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- run-e2e.sh hard-links the packaged media (tools/fetch-demo-media.sh) into the test profile's media directory when it exists, so local captures show real artwork, playing video and live captions. CI has none and is unchanged. Symbolic links do not work: StaticFiles refuses a path that resolves outside its root, which 403'd every variant playlist. - PlaybackTest starts the viewer's plan first (no pre-roll over the film) and waits for the picture to move and for the Spanish cue. - JavaSE ffmpeg player: scale decoded frames to the probed size. With an HLS master playlist ffmpeg can decode a different variant than the one probed, and the frames were read at the wrong stride. - Guide: the Oxford comma Vale counted as an issue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l's demos Follows master's java.time ORM mapping: an un-annotated Instant is the same BIGINT of epoch milliseconds, so no migration changes; wire DTOs keep milliseconds. The skill's demo guide names Reel, which the matrix test requires of every demo template. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # docs/developer-guide/languagetool-accept.txt
|
Compared 188 screenshots: 188 matched. Benchmark Results
Detailed Performance Metrics
|
# Conflicts: # maven/build-engine/src/main/java/com/codename1/maven/processors/MappingAnnotationProcessor.java
…vers Reel takes master's per-template floor (templateSince, NOT-OFFERED marker) instead of its own. Its settings no longer ask for location, the camera or Face ID, which only Savor used, and Savor's dead styles, wording and the courier time-on-line helper are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion one Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reel is a full-stack streaming sample at
scripts/reel, in the same shape as Wayline, Savor and Parley. It works like Netflix or YouTube, with a training-academy mode. It adds a core streaming API with DRM, which the app needs.Core
StreamRequest,DrmConfigandDrmScheme(com.codename1.media). They stream HLS and DASH, with ClearKey, AES-128, Widevine and FairPlay, through each port's native player.MediaManager.isDrmSupportedreports which schemes a device can play.MessageDigestworks on a ParparVM server. Before this, every algorithm was unavailable there.SelfTestchecks the known answers.The sample
tools/packager, which runsffmpeg), chapters and interactions, review submission and analytics.tools/fetch-demo-media.shdownloads and packages them at build time; nothing is committed.Reel-Users-GuideandReel-Implementors-Guidein the developer guide.check-template.shpasses..github/workflows/reel.yml.Verification
@authortags, and Vale on the new guides.run-web-e2e.sh, which needs Playwright).🤖 Generated with Claude Code