Repository navigation
v29.2.0
Highlights
- Redesigned WebRTC webcam studio: it opens with a local camera and microphone preview that only the broadcaster sees. The channel goes live only after Start broadcast, and End broadcast returns to the preview. (c4c7bee, 9c72190, 6f8f47e)
- Stripe duplicate-charge protection: single wallet payments and subscriptions now reuse idempotency keys and use per-user locks, so retries, timeouts and double clicks do not create a second charge or customer. (1561d42, 27a6822, 8d760a1)
- AI Companion subtitles: the Companion transcript of a video can be copied to the player as a SubtitleSwitcher subtitle. This happens automatically after processing, or manually. (f1627ea)
- Category list cache: adding, editing or deleting a category is reflected immediately, instead of a stale cached list being served. Related to WWBN/AVideo#10600. (d2f0f70)
New features
- WebRTC studio (c4c7bee, 9c72190, 6f8f47e):
- Camera and microphone selectors, including front and rear camera options. The selected devices are remembered for future visits.
- Detects devices being connected or disconnected during a session, and shows clear messages for permission and device errors.
- Screen sharing is under advanced settings.
- A chat panel that does not cover the preview, a guided help tour, and pt_BR translations.
- Status labels (Connecting, Starting broadcast, You are live, Ending broadcast) reflect what the server confirms. A lost connection keeps End broadcast available instead of assuming the broadcast ended.
- Companion subtitles in the AI plugin (f1627ea, 32ac611):
- The transcript is saved as a SubtitleSwitcher track once processing ends. A scheduled task also covers videos whose tab was closed.
- The automatic copy never replaces a subtitle in the same language that it did not create, such as a manual upload or an ai.ypt.me transcription.
- The Copy subtitle to player button asks before replacing one.
- The Companion widget icons were updated.
- Stripe single payments (
plugin/StripeYPT/getIntent.json.php, YPTWallet Stripe button) (1561d42, 27a6822):- The PaymentIntent idempotency key is saved and replayed after timeouts.
- A per-user guard blocks duplicate payments, timed by when Stripe recorded the charge.
- A different amount or an expired attempt cancels the old client secret before a new one is created.
- A repeated click only checks the existing payment's status.
- Error responses are clearer. A definite validation error, such as an amount below Stripe's minimum, can be corrected and retried.
- The wallet is still credited by the
charge.succeededwebhook.
- Stripe subscriptions (8d760a1):
- Subscription creation uses idempotency keys and an advisory lock across PHP workers.
- Every Stripe customer already linked locally is checked before a new one is created.
- Local rows whose customer was canceled, deleted or is missing are relinked to the new customer.
Fixes
- Category cache (d2f0f70):
- The category list cache key now includes a fingerprint of the
categoriestable, so a change shows up without waiting for cache deletion. With the Cache plugin, deletion only happens on the per-minute cron. objects/categories.json.phpno longer returns broken JSON when PHP prints warnings.- DataTables-style
search[value]parameters are handled. - Cached directory paths are reset after cache directories are removed.
- The category list cache key now includes a fingerprint of the
- Restreamer:
plugin/Live/standAloneFiles/restreamer.json.phpno longer starts a PHP session, and closes a session only if one is active. (2ad80db)
Dependencies
- Composer:
- npm:
- GitHub Actions:
Other changes
- The Dependabot auto-merge workflow now handles errors, and its token setup is documented in
.github/DEPENDABOT_AUTOMERGE.md. (62e4f8b) - Added regression tests for the WebRTC studio, Companion subtitles, Stripe checkout and category caching. Contributor guidance now covers Stripe payments, the per-request SQL read cache and delayed cache invalidation. (c4c7bee, f1627ea, 1561d42, 27a6822, 8d760a1, d2f0f70)
Upgrade notes
- Stripe restricted keys: the single-payment duplicate guard reads the charge time from Stripe, which needs the Charges: Read permission on a restricted key. The rest of the flow only needs PaymentIntents. Without that permission, the guard logs a warning and falls back to a 5-minute observation window. (27a6822)
- Single-payment state is stored under
videos/stripe-payment-locks/. It is not cache, and it is meant to survive cache cleanup. (1561d42, 27a6822) - Companion subtitles require the SubtitleSwitcher plugin to be enabled. Otherwise the Companion tab asks you to enable it. (f1627ea)
Full changelog: v29.1.1...v29.2.0
Release commit: 789de965a652
Original automated release notes
29.2.0 (2026-09-28)
Features
- add support for Companion subtitles, including scheduling and manual copy functionality (f1627ea)
- enhance cache handling and add regression tests for category caching (d2f0f70)
- enhance Dependabot auto-merge workflow with error handling and documentation for token setup (62e4f8b)
- enhance Stripe subscription handling with idempotency keys and error management (8d760a1)
- Enhance WebRTC functionality with improved device management and UI updates (9c72190)
- Improve WebRTC button functionality and UI consistency (6f8f47e)
- StripeYPT: enhance single payment handling and add payment status check functionality (27a6822)
- StripeYPT: implement single payment intent handling and improve error responses (1561d42)
- update companion widget icons for improved user experience (32ac611)
Fixes
- restreamer: ensure session is closed only if active and add config for session handling (2ad80db)
Dependencies
- bump actions/checkout from 4 to 7 (69ff7b9)
- bump actions/setup-node from 4 to 7 (cf0af5a)
- bump actions/upload-artifact from 4 to 7 (08d3cde)
- bump aws/aws-sdk-php from 3.395.6 to 3.395.7 (4fcc6b4)
- bump aws/aws-sdk-php from 3.395.7 to 3.398.0 (ee791fa)
- bump google/apiclient from 2.19.4 to 2.20.0 (d4518df)
- bump google/apiclient-services from 0.459.0 to 0.460.0 (4c8123e)
- bump intro.js from 8.5.0 to 8.6.0 (f5b30da)
- bump james-heinrich/getid3 from 1.9.26 to 1.9.27 (1fc8586)
- bump socket.io-client from 4.8.3 to 4.8.4 (e08c7d3)
- bump tinymce from 8.9.1 to 8.9.2 (5bf1b13)
Other changes
- Refactor WebRTC Studio: Enhance UI and functionality (c4c7bee)
Release commit: 789de965a652