Commit Graph

2368 Commits

Author SHA1 Message Date
Arkadiusz Fal
8b889da2ef Add retry mechanism for AVPlayer file load errors
Implemented automatic retry logic with exponential backoff (2, 4, 6 seconds) when file loading fails in AVPlayerBackend. Retries up to 3 times before showing error to user. Retry state is properly reset on successful loads. This matches the retry implementation added to MPVBackend in commit b6df73f9.
2025-11-15 19:33:01 +01:00
Arkadiusz Fal
25a07aa666 Update GitHub Actions to use latest macOS and Xcode versions
- Update macOS build job to use macos-latest and Xcode 26.0.1 (matching iOS/tvOS)
- Update bump-build workflow to use latest action versions (checkout@v4, create-pull-request@v7)
- Add cache-version to ruby/setup-ruby for consistency
2025-11-15 19:24:12 +01:00
Arkadiusz Fal
ada4189aea Refactor dirty region handling in MPVOGLView
Simplify the conditional logic for marking dirty regions by using optional binding instead of force unwrapping.
2025-11-15 15:44:29 +01:00
Arkadiusz Fal
98bdd5d6a5 Fix iOS Now Playing Info Center integration for AVPlayer backend
This commit enables proper Now Playing Info Center integration on iOS, allowing video playback information to appear in Control Center and Lock Screen with working remote controls.

Key changes:
- Activate audio session on app launch with setCategory(.playback, mode: .moviePlayback) and setActive(true)
- Set up remote commands on first play() call instead of during app initialization to avoid claiming Now Playing slot prematurely
- Remove removeTarget(nil) calls that were claiming Now Playing without content
- Enable remote commands (play, pause, toggle, seek) explicitly and add proper target handlers
- Use backend.isPlaying instead of PlayerModel.isPlaying to avoid race conditions
- Include playback rate (1.0 for playing, 0.0 for paused) in Now Playing info
- Update Now Playing info on main queue for thread safety
- Update Now Playing when switching between backends
- Remove audio session deactivation from pause() and stop() methods

Note: This fix works for AVPlayer backend. MPV backend has fundamental incompatibility with iOS Now Playing system.
2025-11-15 15:44:05 +01:00
Arkadiusz Fal
1fc609057e Fix horizontal content extending behind sidebar on iPad
Modified HorizontalCells to conditionally apply edgesIgnoringSafeArea based on navigation style. In sidebar mode (iPad), content now respects safe areas and won't overlap with the sidebar. In tab mode (iPhone), content maintains full-width scrolling behavior.
2025-11-15 12:04:01 +01:00
Arkadiusz Fal
adf282d0e2 Add left padding to video details overlay on iPad in non-fullscreen mode
When displaying the video details overlay on iPad in non-fullscreen windows,
add 65px of left padding (50px for system controls width + 15px spacing) to
prevent content from overlapping with iPad system controls.
2025-11-15 11:51:00 +01:00
Arkadiusz Fal
7812fc6a8d Add horizontal padding to player controls in non-fullscreen iPad windows
When the iPad window is resized (not fullscreen), player controls now have 10px horizontal padding from the edges for better spacing and visual comfort.
2025-11-15 11:39:14 +01:00
Arkadiusz Fal
0fcdf2398e Fix video player overlay to respect window fullscreen state on iOS
Change edgesIgnoringSafeArea from .all to conditional based on
Constants.isWindowFullscreen to properly handle safe areas when
not in fullscreen mode.
2025-11-15 11:30:30 +01:00
Arkadiusz Fal
a464b15e29 Fix MPV player vertical positioning in fullscreen mode
Remove incorrect safe area insets from offsetY calculation that was
causing unequal black bars (smaller top, larger bottom). Now properly
centers video with equal padding like AVPlayer backend.
2025-11-15 11:29:58 +01:00
Arkadiusz Fal
bc8adc6348 Allow video player to extend into safe areas on iOS 2025-11-15 11:21:59 +01:00
Arkadiusz Fal
caeea2a1cd Update MPVKit dependency 2025-11-15 11:21:36 +01:00
Arkadiusz Fal
ccdfdf781d Add window fullscreen detection and improve iPad controls spacing
Adds fullscreen detection utility to Constants.swift to determine if the window occupies the full screen on iOS. Uses this to conditionally add leading padding to player controls on iPad in non-fullscreen windows, preventing overlap with system window controls.
2025-11-15 00:04:30 +01:00
Arkadiusz Fal
c47c52f8f3 Enable resizable windows on iPad
Changed UIRequiresFullScreen to NO to allow pixel-perfect window
resizing on iPad. Also moved ITSAppUsesNonExemptEncryption to
project settings for cleaner configuration.
2025-11-14 23:27:14 +01:00
Arkadiusz Fal
d5f9a24efa Fix player controls clipping in resizable iPad windows
When playing video fullscreen in a resizable window on iPad, the player
height was being forced to UIScreen.main.bounds.size.height, which is
the full screen size. In resizable windows, this caused the player
container to extend beyond the visible window bounds, clipping controls
at the bottom.

Now on iPad, the player uses natural geometry provided by its container
which respects actual window bounds, while iPhone continues using
screen-based calculation for proper fullscreen behavior.
2025-11-14 23:26:20 +01:00
Arkadiusz Fal
2ca08c8af5 Hide orientation lock controls on iPad
The orientation lock feature is not applicable on iPad devices, so the lock orientation button and settings are now hidden when running on iPad.
2025-11-14 23:08:11 +01:00
Arkadiusz Fal
fcb97a5591 Remove verbose logging from MPV rendering
Removed debug log statements for screen refresh rate and successful render context calls to reduce log noise.
2025-11-14 20:51:05 +01:00
Arkadiusz Fal
763580203b Fix button styling and safe area handling on iOS
Added plain button style for rate increase/decrease buttons on iOS. Fixed safe area insets in VerticalCells to respect sidebar navigation style on iOS.
2025-11-14 20:49:48 +01:00
Arkadiusz Fal
b88169c7dd Improve video layer rendering on macOS
Refactored glUpdate to use requestRedraw method for better control. Added needsRedraw flag to prevent redundant display calls. Enabled asynchronous drawing on VideoLayer for improved performance. Modified displayLinkCallback to only report swap without triggering display to avoid flooding the main thread.
2025-11-14 20:24:33 +01:00
Arkadiusz Fal
ddf997ee58 Simplify stream description by removing instance info
Removed instance description from stream description string to simplify the display and avoid showing redundant backend information.
2025-11-14 20:10:13 +01:00
Arkadiusz Fal
9d8fb0cfa2 Add nil safety check for currentTime in MPVBackend
Added guard check to return early if currentTime is nil in getTimeUpdates. Simplified optional unwrapping by using the guarded currentTime value throughout the method.
2025-11-14 20:04:54 +01:00
Arkadiusz Fal
a0a54bced9 Improve layout stability and disable unwanted animations
Added height reservation to FavoriteItemView to prevent layout shifts during content loading. Changed HomeView to use LazyVStack for better performance. Converted QueueView from LazyVStack to VStack. Disabled animations on content count changes across multiple views to prevent jarring layout transitions. Added width constraint to stream button in PlaybackSettings.
2025-11-14 20:02:07 +01:00
Arkadiusz Fal
6c3da98465 Add macOS 26 compatibility for search UI
Removed border overlay on search text field for macOS 26+ to match new design guidelines. Added conditional padding to sort label for better alignment on macOS 26+.
2025-11-14 19:32:39 +01:00
Arkadiusz Fal
6aef3f10b1 Improve playback settings UI controls on macOS
Standardized picker and button sizing with consistent alignment and control sizes. Added SettingsPickerModifier to all macOS pickers with menu style. Improved rate buttons with proper sizing and alignment. Added text truncation for stream descriptions to prevent overflow.
2025-11-14 19:28:26 +01:00
Arkadiusz Fal
500c787063 Fix edgesIgnoringSafeArea availability for iOS only
Wrapped edgesIgnoringSafeArea modifier in iOS platform check to fix build issues on other platforms.
2025-11-14 19:07:55 +01:00
Arkadiusz Fal
8f97c40257 Refactor player controls and improve custom controls visibility
Restructured PlayerControls view hierarchy by extracting controls content into a separate computed property for better code organization. Added shouldShowCustomControls property to VideoPlayerView to properly determine when custom controls should be shown vs system controls. Updated hover logic to only show/hide custom controls when appropriate.
2025-11-14 18:58:28 +01:00
Arkadiusz Fal
b8cde410c5 Update default visible sections from trending to popular
Changed the default visible sections to include popular instead of trending.
2025-11-14 18:58:28 +01:00
Arkadiusz Fal
6511d4c9ba Add nil safety checks for stream resolution handling
Added comprehensive nil checks for stream resolution values across PlayerBackend, QualityProfile, and PlayerQueue to prevent crashes when streams have missing resolution metadata. Also added backend nil checks in PlayerQueue.
2025-11-14 18:58:27 +01:00
Arkadiusz Fal
b6df73f949 Add retry mechanism for MPV file load errors
Implemented automatic retry logic with exponential backoff (2, 4, 6 seconds) when file loading fails in MPVBackend. Retries up to 3 times before showing error to user. Retry state is properly reset on successful loads.
2025-11-14 18:58:27 +01:00
Arkadiusz Fal
11a2ef207c Remove debug print statement from thumbnail URL handling
Cleaned up debug logging that was printing final thumbnail URLs in InvidiousAPI.
2025-11-14 18:58:12 +01:00
Arkadiusz Fal
a9fcc5ce99 Bump build number to 207 1.5.2-207 2025-11-10 13:00:38 +01:00
Arkadiusz Fal
7bfb212e6d Restore build_and_notarize lane to original version
- Reverts custom PKG creation from archive
- Uses build_mac_app with export_method developer-id
- Fixes directory not found error in GitHub Actions
2025-11-10 13:00:14 +01:00
Arkadiusz Fal
e91eac0522 Bump build number to 206 2025-11-10 12:48:13 +01:00
Arkadiusz Fal
bec29668a0 Fix glassEffect API availability for macOS and tvOS
- 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
2025-11-10 12:47:11 +01:00
Arkadiusz Fal
86b74d53ca Bump build number to 205 2025-11-10 12:40:20 +01:00
Arkadiusz Fal
797ba61ddd Skip framework conversion script in CI/GitHub Actions
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>
2025-11-10 12:39:13 +01:00
Arkadiusz Fal
2959f0b387 Lower macOS build runner to macOS 15 with Xcode 16.4
Changed mac_notarized job to use:
- runs-on: macos-15 (was macos-latest)
- xcode-version: 16.4 (was 26.0.1)

This configuration was previously working for Yattee builds.
iOS and tvOS builds remain on macos-latest with Xcode 26.0.1.

Reference: https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md

🤖 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-10 12:36:15 +01:00
Arkadiusz Fal
bf40f527ea Add macOS framework conversion for Developer ID distribution
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>
2025-11-10 12:32:32 +01:00
Arkadiusz Fal
469e9a4eb9 Enable notarization error logging
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>
2025-11-09 19:01:25 +01:00
Arkadiusz Fal
ce7ba207ea Fix API availability issues for macOS 11.0 and tvOS 15.0
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>
2025-11-09 18:53:06 +01:00
Arkadiusz Fal
b0aaf0080b Fix Xcode version to 26.0.1 in release workflow
Use Xcode 26.0.1 (the default stable version on macOS 26 runners) instead
of latest-stable to avoid selecting Xcode 26.1 RC which has missing SDK
components. This fixes the "iOS 26.1 is not installed" error during builds.

Reference: https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:38:23 +01:00
Arkadiusz Fal
3c63aa51be Update Ruby version to 3.1 in GitHub Actions workflows
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>
2025-11-09 18:31:25 +01:00
Arkadiusz Fal
946d4c4f16 Update changelog for build 204 2025-11-09 18:25:32 +01:00
Arkadiusz Fal
161282af0b Bump build number to 204 2025-11-09 18:20:50 +01:00
Arkadiusz Fal
37c6f6abbe Add localization support for Finnish, Indonesian, Korean, Dutch, and Swedish
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>
2025-11-09 18:19:40 +01:00
Arkadiusz Fal
6129d724c5 Update dependencies 2025-11-09 18:14:35 +01:00
Arkadiusz Fal
be4e1adb9b Fix all SwiftLint violations across codebase
Resolves 130+ violations including deployment target checks, code style issues, and formatting inconsistencies. Adds SwiftLint disable comments for compiler-required availability checks while maintaining deployment target compliance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:14:35 +01:00
Arkadiusz Fal
4840c9a05f Use fullScreenCover for Settings and Accounts on tvOS
- 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>
2025-11-09 18:14:35 +01:00
Arkadiusz Fal
e0ca48fd44 Improve tvOS settings UI styling and navigation
- 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>
2025-11-09 18:14:35 +01:00
Arkadiusz Fal
495dcec874 Add macOS build script and update Swift package dependencies
Add custom build phase script to fix macOS framework bundle structure and
clean module caches:
- Converts shallow bundles (iOS-style) to versioned bundles (macOS-style)
- Cleans Swift module caches for macOS builds to prevent cache issues
- Creates proper symlink structure for macOS frameworks (Versions/Current)
- Handles Info.plist, Headers, Modules, and Resources directories

Update Swift Package Manager dependencies:
- SDWebImage: 5.21.0 → 5.21.3
- SDWebImageWebPCoder: 0.14.6 → 0.15.0
- swift-log: 1.6.3 → 1.6.4
- Package.resolved format: version 2 → version 3

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:14:35 +01:00
Arkadiusz Fal
8123770614 Improve fullscreen orientation handling for iOS player
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>
2025-11-09 18:14:35 +01:00