Commit Graph

2409 Commits

Author SHA1 Message Date
Arkadiusz Fal
36738572da Fix SwiftFormat and SwiftLint issues
- Fix indentation in AppSidebarNavigation, VideoCell
- Replace && with comma in PlayerModel condition
- Add SwiftLint suppression for necessary tvOS 17.0 availability check
- Update SwiftLint config to use renamed rules and disable false positives
2025-11-20 17:05:22 +01:00
Arkadiusz Fal
9a8ccc366c Clean up trending settings when feature flag is disabled
Add startup cleanup to remove trending-related settings when the feature flag is disabled:
- Remove trending from visible sections
- Reset startup section to home if it was set to trending
- Remove all trending favorite items

This ensures users don't have invalid/broken settings referencing the disabled trending feature.
2025-11-20 13:21:56 +01:00
Arkadiusz Fal
e9ca36f1db Fix Trending menu command to hide instead of disable
Change the Trending menu command to be completely hidden when the feature flag is disabled, rather than just being disabled and still visible in the UI.
2025-11-20 13:18:03 +01:00
Arkadiusz Fal
5b607687d9 Add feature flag to disable Trending functionality
Introduces a feature flag to disable the Trending section across the app. When disabled, all trending-related UI elements, navigation links, and settings are hidden.

Changes:
- Add trendingEnabled feature flag to FeatureFlags.swift (currently disabled)
- Hide Trending tab in AppTabNavigation, Sidebar, and TVNavigationView
- Remove Trending option from visible sections settings
- Remove Trending option from startup section picker
- Disable Trending menu command and keyboard shortcut
- Prevent Trending URL navigation in OpenURLHandler
- Hide Trending in FavoriteItemView navigation
2025-11-20 13:14:31 +01:00
Arkadiusz Fal
e723bb9147 Change Trending icon to arrow.up.right.circle.fill
Replace chart.bar.fill icon with arrow.up.right.circle.fill for the Trending section across tab bar and sidebar navigation.
2025-11-20 13:08:55 +01:00
Arkadiusz Fal
a3747a0975 Change Popular icon to chart.bar.fill
Replace arrow.up.right.circle.fill icon with chart.bar.fill for the Popular section across all navigation contexts (tab bar, sidebar, and view header).
2025-11-20 13:07:32 +01:00
Arkadiusz Fal
bb2bd86c07 Add feature flag to disable hide shorts functionality
The hide shorts feature is no longer working due to API changes that prevent reliable detection of short videos. This commit introduces a feature flag system to disable the functionality while preserving the ability to easily restore it if the API issue is resolved.

Changes:
- Add FeatureFlags.swift with hideShortsEnabled flag (currently disabled)
- Hide all HideShortsButtons UI elements when flag is disabled
- Disable shorts filtering logic in ContentItemView, FavoriteItemView, and FeedModel
- Preserve hideShorts user preference for future restoration
2025-11-20 13:05:12 +01:00
Arkadiusz Fal
680ac9a8a0 Fix keyboard shortcut conflict for Show Player command
Changed Show Player shortcut from Cmd+O to Cmd+Shift+P to avoid
conflict with system Open command.
2025-11-20 00:23:27 +01:00
Arkadiusz Fal
c1b23d20f2 Fix tab selection timing to wait for account sign-in
Tab selection was being set immediately during app configuration, before
the user account had completed sign-in. This caused tabs that require
authentication (like Subscriptions and Playlists) to not be properly
selected on startup since they weren't visible yet.

Changes:
- Add notification system for account configuration completion
- Post notification after all account types finish configuration:
  * Accounts with existing tokens
  * Accounts requiring sign-in (after network request completes)
  * Anonymous/public accounts
  * Error cases (missing credentials, network failures)
- Set up observer before account configuration to ensure notification
  is received
- Set tab selection only when account is fully configured
2025-11-19 23:24:21 +01:00
Arkadiusz Fal
b8f6dabbc9 Update SwiftUI-Introspect to support iOS 26
Upgrade SwiftUI-Introspect dependency from 1.3.0 to 26.0.0 and add iOS 26 support to the introspect modifier in AppSidebarNavigation.
2025-11-19 23:09:18 +01:00
Arkadiusz Fal
1c168bd982 Fix thumbnail aspect ratio to prevent stretching and layout jumps
Fixed issues with thumbnails being stretched vertically and layout jumping during image loading:
- Simplified VideoCellThumbnail to always use 16:9 aspect ratio with .fill mode
- Added matching 16:9 aspect ratio to placeholder with .fill mode to prevent layout shifts
- Removed quality-based aspect ratio selection (4:3 vs 16:9) in favor of consistent 16:9
- Ensures thumbnails maintain proper proportions on both iOS and macOS

This provides consistent sizing across platforms and eliminates the jump when images finish loading.
2025-11-19 23:01:52 +01:00
Arkadiusz Fal
42d53c30db Fix thumbnail aspect ratio in video grid cells
Thumbnails were being stretched vertically due to incorrect aspect ratio handling. Fixed by:
- Using .scaledToFill() on thumbnails to fill the container width
- Constraining container to 16:9 aspect ratio with .fit mode
- Adding matching aspect ratio to placeholder to prevent layout shift during loading

This ensures thumbnails maintain proper proportions while filling the full cell width.
2025-11-19 22:37:05 +01:00
Arkadiusz Fal
a55adb2e65 Fix thumbnail loading for video details
Explicitly specify thumbnail quality order instead of using Thumbnail.Quality.allCases to ensure proper thumbnail URL generation and loading priority.
2025-11-19 22:05:55 +01:00
Arkadiusz Fal
cea296c4b7 Fix audio session interrupting other apps on launch
Previously, the audio session was initialized immediately when the app launched, causing audio from other apps (like Music) to stop even when no video was playing in Yattee.

Changes:
- Remove audio session initialization from AppDelegate launch
- Remove audio session setup from MPVClient initialization
- Update setAudioSessionActive() to configure audio session category before activation

The audio session is now lazily initialized only when playback actually starts:
- For MPV backend: triggered by FILE_LOADED, PLAYBACK_RESTART, AUDIO_RECONFIG events
- For AVPlayer backend: triggered when play() is called

This allows music from other apps to continue playing until a video is actually played in Yattee.
2025-11-19 21:45:56 +01:00
Arkadiusz Fal
ea0ea427e7 Bump build number to 209 1.5.2-209 2025-11-19 18:55:21 +01:00
Arkadiusz Fal
f685e180d0 Update CHANGELOG.md for Build 209 2025-11-19 18:55:07 +01:00
Arkadiusz Fal
a37f3e4a07 Adjust tvOS video cell dimensions for better layout
Reduced video cell and grid item sizes on tvOS to improve layout spacing
and visual consistency. Changed grid item size from 600 to 560 pixels,
and adjusted video cell frame dimensions accordingly.
2025-11-19 18:54:51 +01:00
Arkadiusz Fal
33377f7e0e Fix nil crash when accessing stream.format
This commit addresses crashes caused by accessing nil format values on streams:

- QualityProfile.swift: Add guard check for stream.format to prevent nil access crash
- MPVBackend.swift: Add nil check in canPlay method before comparing format
- PlayerStreams.swift: Add nil check before comparing format in asset processing

The crashes occurred when stream.format was nil and accessed as an implicitly unwrapped optional, causing "Unexpectedly found nil while implicitly unwrapping an Optional value" errors.
2025-11-19 18:03:43 +01:00
Arkadiusz Fal
4b577a296b Fix array index out of bounds crash in audio track handling
This commit addresses crashes caused by race conditions when accessing audio track arrays:

- MPVBackend.swift: Use safe index clamping to prevent array out of bounds crashes when selecting audio tracks
- PlayerModel.swift: Add selectedAudioTrack computed property for thread-safe audio track access
- ControlsOverlay.swift: Use safe accessor with "Original" fallback label
- PlaybackSettings.swift: Use safe accessor with "Original" fallback label

This fix resolves approximately 37% of crashes (23 out of 62 crash logs) that were caused by index out of range errors in MPVBackend.playStream at line 345.
2025-11-19 18:01:02 +01:00
Arkadiusz Fal
e882d0264b Fix thumbnail sizing and aspect ratio issues in video cells (#896)
Fixed improperly sized and positioned thumbnails by removing duplicate aspect ratio constraints and standardizing to 4:3 format with fill content mode for better display.
2025-11-19 17:50:39 +01:00
Arkadiusz Fal
45f72ce4a1 Fix playing videos from channel view in modal opened in video player
Handle case where player is already presenting by using delayed dispatch instead of appending to onPresentPlayer callback queue.
2025-11-19 01:32:09 +01:00
Arkadiusz Fal
3536370798 Refactor fullscreen details layout from VStack to ZStack
Switch from VStack to ZStack layout for better control over detail view positioning in fullscreen mode. Add z-index layering to ensure proper stacking order of player backend and video details.
2025-11-19 00:57:00 +01:00
Arkadiusz Fal
a5275fd800 Remove verbose logging statements
Removed logging for audio session activation and partial update operations to reduce log noise.
2025-11-18 18:19:45 +01:00
Arkadiusz Fal
49278e13cd Fix audio track label showing "Original" instead of "Unknown"
Changed the default audio track content type from "Unknown" to "Original"
when the content type is not specified. This provides a more accurate
description for the default audio track.
2025-11-18 18:16:38 +01:00
Arkadiusz Fal
13d7a8d0a6 Simplify fullscreen handling for iOS
Remove unnecessary edgesIgnoringSafeArea modifier and simplify status bar hiding logic by removing iPad-specific conditional checks, making the fullscreen behavior more consistent across iOS devices.
2025-11-18 18:11:48 +01:00
Arkadiusz Fal
50efe94839 Add macOS-specific entitlements for MPV backend
Enable Allow Unsigned Executable Memory and Disable Library Validation
entitlements for macOS target only to support MPV player backend.
2025-11-18 16:59:17 +01:00
Arkadiusz Fal
1e7656a9eb Revert MPVKit to track main branch
Switch MPVKit package dependency from pinned revision back to tracking the main branch for latest updates.
2025-11-18 16:46:30 +01:00
Arkadiusz Fal
4c5b801c45 Fix Now Playing controls when switching between MPV and AVPlayer backends
When switching from AVPlayer to MPV backend, Now Playing controls (play/pause/seek) were disabled because AVPlayer maintained control of the remote command center and audio session. This fix ensures MPV can properly reclaim control.

Key changes:
- Clear AVPlayer's current item when switching to MPV to release media control
- Clear Now Playing info and set playback state to stopped before MPV takes over
- Reset remote command center by removing all targets (including AVPlayer's internal handlers) and re-adding custom handlers
- Force audio session deactivation/reactivation with .notifyOthersOnDeactivation
- Add forceReactivate parameter to setupAudioSessionForNowPlaying() for backend switches
- Ensure stream loading continues after Now Playing setup (don't return early)

The fix properly handles the transition by:
1. Clearing AVPlayer's media session completely
2. Scheduling async Now Playing setup without blocking stream loading
3. Resetting remote command handlers to reclaim control from AVPlayer
4. Re-activating audio session to establish MPV as the active player
2025-11-18 16:43:17 +01:00
Arkadiusz Fal
e6b6778ba1 Fix iOS Now Playing integration for MPV backend
The MPV backend now properly displays Now Playing information in iOS Control Center. The fix addresses the issue where the AVAudioSession would become inactive during MPV's playback lifecycle.

Key changes:
- Added setupAudioSessionForNowPlaying() method to activate AVAudioSession with proper playback category and movie playback mode
- Re-activate audio session at critical MPV events: FILE_LOADED, PLAYBACK_RESTART, AUDIO_RECONFIG, and during periodic updates
- Initialize audio session immediately after mpv_initialize() in MPVClient

The audio session must be re-activated at multiple points during playback, not just at initialization, to ensure iOS recognizes the app as playing media.
2025-11-18 16:20:30 +01:00
Arkadiusz Fal
9c15393ab4 Pin MPVKit to specific commit revision
Pins MPVKit dependency to commit 8db0d19d03adaf824588de7f7cdbc05b8e2016bc
instead of tracking the main branch to ensure build stability.
2025-11-15 23:30:53 +01:00
Arkadiusz Fal
5cfdd36237 Fix SPM cache clearing in macOS notarized build workflow
Expands cache clearing to include DerivedData and .build directories
to prevent corrupted artifact issues during dependency resolution.

Renames workflow file and updates job title to include macOS and
Xcode versions for clarity.
2025-11-15 23:13:58 +01:00
Arkadiusz Fal
e0cf927ebb Add GitHub Action for macOS notarized builds
Creates a standalone workflow to build and notarize macOS-only builds
without creating a GitHub release. Uses macOS 15 and Xcode 16.4.
The notarized build is available as a workflow artifact.
2025-11-15 23:10:01 +01:00
Arkadiusz Fal
2f0966973c Fix GitHub Actions build by clearing SPM cache 1.5.2-208 2025-11-15 21:22:11 +01:00
Arkadiusz Fal
460fd9cfc4 Update CHANGELOG.md for Build 208 2025-11-15 21:17:14 +01:00
Arkadiusz Fal
09e02477f0 Bump build number to 208 2025-11-15 21:16:06 +01:00
Arkadiusz Fal
349b42b2f7 Update Ruby dependencies in Gemfile.lock
- Update CFPropertyList from 3.0.7 to 3.0.8
- Update AWS SDK packages (aws-partitions, aws-sdk-core, aws-sdk-s3)
- Update faraday-cookie_jar dependency
- Update bundler version and add arm64-darwin-25 platform support
2025-11-15 20:27:32 +01:00
Arkadiusz Fal
e793e6c48b Fix tvOS build compatibility for Menu with primaryAction
Add availability check for tvOS 17.0+ when using Menu with primaryAction parameter. Falls back to simple Button for tvOS 15.0-16.x to maintain backward compatibility with the deployment target.
2025-11-15 20:20:48 +01:00
Arkadiusz Fal
3588bbd7e7 Improve iPad UI behavior and settings layout
- Fix status bar visibility on iPad to respect window fullscreen state
- Adjust settings view minimum heights for better content display
2025-11-15 20:12:30 +01:00
Arkadiusz Fal
21da42f23b Fix picker label visibility on macOS in settings
Add visible labels for all pickers in settings on macOS by wrapping them
in HStack with Text labels and Spacer() for proper alignment.

Fixed pickers:
- BrowsingSettings: Startup section, Thumbnails quality, Player bar gestures
- PlayerControlsSettings: Action button labels
- PlayerSettings: Source, Inspector, Caption size/color/languages, Sidebar

All picker labels now consistently display with left-aligned text and
right-aligned picker controls on macOS.
2025-11-15 20:08:18 +01:00
Arkadiusz Fal
5758417293 Fix SwiftLint and SwiftFormat violations
- Run SwiftFormat to fix indentation, spacing, and formatting issues
- Replace CGFloat with Double and NSRect with CGRect per style guide
- Remove redundant .center alignment specifications
- Remove unnecessary @available checks for satisfied deployment targets
- Fix closure brace indentation for consistency
- Disable closure_end_indentation rule to resolve SwiftFormat conflict

All linting checks now pass with zero errors and warnings.
2025-11-15 19:42:37 +01:00
Arkadiusz Fal
97ae843013 Fix main actor isolation warnings in HomeView
Wrap favoritesChanged.toggle() calls in MainActor.run blocks to ensure
main actor-isolated state mutations happen on the correct actor context.
This resolves Swift concurrency warnings when updating state from
nonisolated async contexts.
2025-11-15 19:41:19 +01:00
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