- Make glassEffect iOS-only as it's not available on other platforms
- Use ultraThinMaterial fallback for macOS and tvOS
- Fixes build error in GitHub Actions with Xcode 16.4
Added checks to skip the framework conversion script when running in
CI environments (GitHub Actions). The script now exits early if either
CI or GITHUB_ACTIONS environment variables are set.
This ensures:
- Script only runs for local development builds
- GitHub Actions builds use frameworks as-is from MPVKit
- iOS/tvOS builds on macOS 15 with Xcode 16.4 work without conversion
🤖 Generated with Claude Code (https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit implements a workaround for MPVKit shipping frameworks as
shallow bundles, which are incompatible with macOS Developer ID
distribution requirements.
Changes:
1. Raised macOS deployment target to 14.0
- Matches MPVKit's minimum requirement
- Previous: 11.0
- New: 14.0
2. Added Run Script phase to convert frameworks
- Converts MPVKit frameworks from shallow to versioned bundles
- Required for macOS Developer ID code signing
- Runs after framework embedding
- Converts all 28 MPVKit frameworks during build
3. Modified fastlane build process
- Build and archive without export
- Create PKG directly from archive
- Avoids extended attribute issues from export process
4. Pinned MPVKit to specific commit
- Commit: e7e914a70e943f0d4f050c9ede793af8f6e74ad7
- Ensures consistent framework structure
Known Issues:
- Some frameworks (Libplacebo, Libluajit) have signature issues after
conversion that still prevent successful notarization
- This is a workaround; the root issue should be fixed in MPVKit by
providing macOS-compatible versioned bundle frameworks
See minimal reproduction project at:
/tmp/MPVKit-Notarization-Issue/MPVKitNotarizationTest/
Related: MPVKit should provide macOS-specific XCFrameworks with
versioned bundles for proper Developer ID distribution support.
🤖 Generated with Claude Code (https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add print_log: true to notarize action to display detailed error
messages when notarization fails in GitHub Actions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit resolves multiple build errors caused by using APIs that
require newer OS versions than the deployment targets (macOS 11.0 and
tvOS 15.0).
macOS fixes:
- Add missing init(frame:) initializer to PlayerLayerView
- Add availability checks for textSelection modifier (macOS 12.0+)
- Add availability checks for AttributedString (macOS 12.0+)
- Add availability checks for listStyle.inset(alternatesRowBackgrounds:) (macOS 12.0+)
- Add availability checks for focusScope modifier (macOS 12.0+)
- Correct listRowSeparator availability from macOS 12.0 to 13.0
tvOS fixes:
- Use older onChange(of:) signature compatible with tvOS 15.0
- Add availability check for Menu with primaryAction (tvOS 17.0+)
All changes include appropriate fallbacks for older OS versions to
maintain backward compatibility.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Bundler 2.6.3 requires Ruby >= 3.1.0, but workflows were using Ruby 3.0.7,
causing build failures. Updated both release and bump-build workflows to use
Ruby 3.1.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Adds five new languages to the Xcode project knownRegions that have at least 50% translation coverage from Weblate:
- Finnish (fi): 100%
- Indonesian (id): 100%
- Korean (ko): 100%
- Dutch (nl): 81.9%
- Swedish (sv): 77.4%
Languages with less than 50% coverage (ars, kab, sk) were not added.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace sheet presentation with fullScreenCover for Settings and Accounts views on tvOS
- Add proper background color to Settings and Accounts screens on tvOS
- Clean up trailing whitespace in HomeView
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add TVOSPlainToggleStyle for cleaner toggle appearance on tvOS
- Remove focus overlays from settings navigation links and buttons
- Apply plain button and list styles across all settings screens
- Implement custom system controls picker for tvOS to avoid focus overlay
- Update SettingsPickerModifier with platform-specific styling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Refactor orientation logic when entering fullscreen to better handle
button-initiated vs gesture-initiated transitions:
- Consolidate orientation determination into a single expression that
considers whether fullscreen was initiated by button or gesture
- When initiated by button, always use rotateToLandscapeOnEnterFullScreen
preference
- When initiated by gesture, respect current device orientation if already
in landscape, otherwise use preference
- Apply .landscape lock only for button-initiated transitions, .all for
gesture-initiated (when not orientation locked)
This provides more intuitive behavior where button taps rotate to preferred
orientation, while gestures respect current device orientation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Improve spacing in PlaybackSettings view by adding top padding to the
playback speed section for better visual separation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit addresses multiple SwiftUI performance bottlenecks identified
through code analysis, focusing on view rendering efficiency, list
performance, and memory usage optimization.
Key improvements:
- HomeView: Optimize async task management using structured concurrency
with async let to handle multiple Defaults updates in a single task
- VideoCell: Remove GeometryReader from VideoCellThumbnail to eliminate
layout thrashing; change @ObservedObject to computed property for shared
ThumbnailsModel
- ThumbnailView: Cache URL extension computation in init() instead of
recalculating on every body evaluation
- FavoriteItemView: Replace filter().prefix() with early-exit loop and
capacity reservation for significant performance gain on large lists
- ContentItemView: Optimize FetchRequest creation with direct predicate
construction only for video items, empty predicate for others
- VideoPlayerView: Fix playerSize didSet trigger by moving
updateSidebarQueue() calls to explicit onChange/onAppear handlers
- FeedView: Replace .unique() with Set-based deduplication for O(n)
performance and reduced allocations
- VerticalCells: Remove expensive sorting on every redraw; items should
be pre-sorted from source
These optimizations follow SwiftUI best practices by minimizing expensive
computations in view bodies, caching computed values, using efficient data
structures, and avoiding unnecessary redraws and layout passes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Refactor controls bar background styling with platform-specific effects:
- Add Liquid Glass effect for iOS 26+ using new glassEffect API
- Fallback to ultraThinMaterial for iOS 15-25
- Fallback to blurred black overlay for iOS 14 and earlier
- Extract background logic into reusable applyControlsBackground modifier
- Adjust controls bar vertical offset for better alignment
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Apply compact row styling to channel list items on iOS to reduce vertical spacing and improve visual density. Uses listRowSpacing(0) on iOS 15+ and custom insets for consistent padding across all iOS versions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
SearchTextField improvements:
- Add flexible width constraints (minWidth: 250, maxWidth: .infinity) for macOS
- Restructure iOS layout to use HStack instead of ZStack for better alignment
- Add invisible spacer to maintain consistent width when clear button is hidden
- Adjust padding for more balanced appearance
- Remove fixed width from fieldBorder to support flexible sizing
SearchView improvements:
- Wrap in GeometryReader to calculate available width dynamically
- Add searchFieldWidth() helper to compute optimal search field width
- Account for navigation buttons and internal padding
- Apply dynamic width to both FocusableSearchTextField and SearchTextField
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add logging for video and audio asset URLs during stream filtering to help debug stream selection issues.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add proper validation and fallback logic for audio track selection in MPV backend:
- Validate audio track index is within bounds before switching
- Handle streams without separate audio tracks (single asset streams)
- Reset selectedAudioTrackIndex if out of bounds
- Add fallback path for streams without audioTracks array
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Extract and provide all available audio tracks (ORIGINAL, DUBBED, etc.) from Piped API instead of only using the first ORIGINAL track. This allows users to select between different audio languages and track types.
Changes:
- Extract all M4A audio tracks grouped by type and language
- Keep highest bitrate stream for each unique track combination
- Sort tracks with ORIGINAL first, then others alphabetically
- Pass audio tracks array to Stream for player selection
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Clear the published string when a proper publishedAt date is extracted from uploadDate to prevent duplicate or inconsistent date display. Only fallback to string-based published date when no structured date is available.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Update companion API endpoint URLs to use /companion/latest_version instead of /latest_version to match the correct API path structure.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>