Captions selection UI now groups subtitles by language, allowing users to select a language first and then choose a specific subtitle. Added LanguageSelectionView and LanguageSubtitlesView components, updated SettingsOverlay and CaptionsView to support the new flow, and enhanced ChevronLink to show selection state. This improves usability for users with multiple subtitle options per language.
Introduces the HIDE_PROXY_ONBOARDING config option to conditionally hide proxy onboarding steps in the UI. Updates OnboardingPage to use this config for rendering logic and adjusts card layouts accordingly. Also adds support for displaying additional sources heading when relevant, and updates English locale strings for clarity.
Implement user-initiated source skipping functionality:
- Add skipCurrentSource function to abort current source and all its embeds
- Create AbortController per source and propagate through provider stack
- Mark skipped sources and embeds with 'skipped' status
- Add skip button to scraping UI with translation support
- Filter out skipped source results in PlayerView to prevent playback
- Add fallback to direct fetch when proxy URL is unavailable
- Track failed sources and embeds in player store
- Add 'skipped' status type to ScrapeCard component
Technical details:
- AbortController is created per source in startEvent callback
- Signal is dynamically retrieved via wrapper functions
- Skipped sources continue to next source without showing error screen
- Skip button is passed through component hierarchy via callbacks
- Resume from specific source maintains skip state between attempts
Resolves user ability to manually skip slow or failing sources during media scraping
- Add assetsInclude config to treat WASM as assets
- Prevent WASM files from being inlined as base64 with assetsInlineLimit
This ensures WASM files from dependencies are properly served as
separate assets instead of being embedded as data URLs.
Introduces a reusable useIntersectionObserver hook and a LazyMediaCarousel component to defer rendering of carousels until they are near the viewport. Updates discoverContent and AllMovieLists to use LazyMediaCarousel, improving performance by only loading carousels as needed. Priority carousels (e.g., top of page) are loaded immediately.
Moved intersection observer logic for lazy loading images from MediaCarousel into MediaCard, allowing each card to handle its own image loading. Simplified MediaCarousel by removing its intersection observer and related loading state, improving component separation and maintainability.
Split the monolithic externalSubtitles.ts into separate modules for each provider (febbox, opensubtitles, vdrk, wyzie) and a new index.ts for orchestration and exports. This improves maintainability and clarity by isolating provider-specific logic.
Introduces tracking of failed embeds per source in the player store, adds logic to mark embeds as failed on playback errors, and filters out failed embeds when selecting sources. Also ensures failed sources and embeds are cleared when a working source is found. This improves error handling and fallback behavior for sources with multiple embeds.
Introduces a mechanism to track failed sources in the player store. When a playback error occurs, the current source is marked as failed and subsequent attempts will skip these sources. Failed sources are cleared when a working source is found. UI text is updated to reflect the new behavior.
Introduces a new user preference to automatically resume playback from the next available source when a playback error occurs. Updates settings UI, preferences store, and player error handling to support this feature, including new translations and backend support. Manual resume remains available if the feature is disabled.
Xprime's own site has ads, but people have found pstream (which doesnt have ads) and moves here since there are no ads. Xprime is losing money and is finding it difficult to support the proxies and servers.
clean up ad for xprime when switching sources or destroying player
new method for tracking if ad is shown
Revert "Track XPrime ad script load state in player"
This reverts commit c50bdd9ad8.
Track XPrime ad script load state in player
Adds xprimeAdScriptLoaded state and setter to the player store. Updates XPrimeAdOverlay to only show when the ad script is loaded, and base display logic to set the load state based on script events. This ensures the overlay only appears when the ad script is ready.
remove infinite loop
When conditions are met → show becomes true → timer starts
Timer fires after 5s → show becomes false
Effect re-runs (because show changed) → show becomes true again → new timer starts
Loop repeats infinitely
Refactor XPrime ad injection so it loads when the source changes