Commit Graph

2459 Commits

Author SHA1 Message Date
Arkadiusz Fal
d8d16280ff Fix Invidious login failing for passwords with special characters
Use URLComponents/URLQueryItem for standard form-URL encoding instead
of manual percent-encoding with CharacterSet.alphanumerics, which
included non-ASCII Unicode letters and had an unsafe raw-value fallback.
2026-02-12 06:04:16 +01:00
Arkadiusz Fal
d546c0a976 Fix subscriber count layout shift in VideoInfoView channel row 2026-02-12 06:00:14 +01:00
Arkadiusz Fal
fd41833532 Persist author cache to disk for instant channel info across restarts
Back the in-memory authorCache with a JSON file in ~/Library/Caches/AuthorCache/.
Disk is lazy-loaded on first lookup and saved asynchronously on each cache update.
Capped at 500 entries to prevent unbounded growth.

- Cache author data from video detail API responses (PlayerService, VideoInfoView)
- Replace ChannelView's private CachedChannelHeader with shared CachedChannelData
- Enrich author with cached avatar/subscriber count in VideoChannelRow, TVDetailsPanel, VideoInfoView
2026-02-12 05:47:43 +01:00
Arkadiusz Fal
d1d7edb5ec Fix Feed tab flashing ContentUnavailableView on initial load
When a cancelled load task fell through to `isLoading = false`, it
created a 1-frame gap where the empty view rendered before the
replacement task set `isLoading` back to `true`. Return early on
cancellation so the surviving task controls loading state.
2026-02-12 05:17:25 +01:00
Arkadiusz Fal
24e60916f8 Fix blurred background gradient not using DeArrow thumbnail 2026-02-12 05:08:22 +01:00
Arkadiusz Fal
cd2e0a6e81 Fix playlist rows in ChannelView not tappable in empty space 2026-02-12 05:04:40 +01:00
Arkadiusz Fal
ded130a8c3 Fix lock screen always showing 10s seek regardless of system controls setting 2026-02-12 05:02:41 +01:00
Arkadiusz Fal
78bc7e0063 Remove excessive logging 2026-02-12 04:44:16 +01:00
Arkadiusz Fal
6c30e745d9 Fix player dismiss gesture stuck after panel dismiss with comments expanded
Reset isCommentsExpanded and commentsFrame on the NavigationCoordinator
directly when the portrait panel is dismissed, since PortraitDetailsPanel
owns its own @State that doesn't sync back through .onChange during dismiss.
Also track comments overlay frame via GeometryReader so the dismiss gesture
can allow swipes outside the comments area instead of blanket-blocking.
2026-02-12 04:42:32 +01:00
Arkadiusz Fal
b6b6d280e1 Fix incomplete playlist loading by paginating through all pages
Playlists only loaded the first page of videos. Add full pagination for
both Invidious and Piped playlist endpoints (public and authenticated).
Deduplicate Invidious results by playlist index to handle its overlapping
page windows. Also fix URL encoding in Invidious login to use strict
form-encoding charset.
2026-02-12 02:02:32 +01:00
Arkadiusz Fal
7ac45b46a3 Fix pull-to-refresh scroll offset not resetting in InstanceBrowseView
Move .refreshable from the outer GeometryReader onto the ScrollView
itself so SwiftUI can properly coordinate the scroll offset bounce-back.
The ScrollView was inside an .overlay() which doesn't participate in
the parent's layout system, breaking the offset reset.

Closes #917
2026-02-12 01:21:54 +01:00
Arkadiusz Fal
288113d177 Fix URL scheme UI tests for YouTube deep links and content loading
Route HTTPS YouTube URLs through yattee://open?url= scheme since simctl
can't trigger Universal Links. Improve wait strategies: use player
expansion check for video tests, tree length threshold for channel/
playlist content loading. Add retry logic to cleanup_after_video.
2026-02-10 06:21:10 +01:00
Arkadiusz Fal
cae1226cfe Add URL scheme UI tests for deep link navigation
Test yattee:// custom scheme URLs navigate to correct screens:
playlists, bookmarks, history, downloads, channels, subscriptions,
continue-watching, and search. Handles iOS system confirmation dialog
via coordinate taps since it's invisible to AXe. Settings deep link
is excluded (known app bug - doesn't render when pushed to nav stack).
2026-02-10 05:45:19 +01:00
Arkadiusz Fal
9cd9506dcf Fix UI tests for onboarding flow and AddRemoteServer redesign
- Skip onboarding in tests by setting UserDefaults before launch
- Update all addSource.* identifiers to addRemoteServer.* for new flow
- Switch from identifier-based to text-based element lookups (iOS 26 AXe limitation)
- Add Yattee Server credential support in instance setup
- Update baseline screenshots for Home tab and settings
2026-02-10 00:05:39 +01:00
Arkadiusz Fal
3905fd8b18 Add AltStore source and separate update workflow from release pipeline
- Create standalone update-altstore.yml workflow (workflow_dispatch + workflow_call)
  that gets version from latest GitHub release tag instead of project.pbxproj
- Replace inline update_altstore job in release.yml with workflow_call reference
- Add altstore-source.json with app metadata and initial version entry
- Update README with revised features, TestFlight install link, and new logo assets
2026-02-09 21:37:39 +01:00
Arkadiusz Fal
13f7a0f0ca Fix panscan zoom pushing controls off screen for portrait videos 2026-02-09 08:22:16 +01:00
Arkadiusz Fal
612dce6b9f Refactor views 2026-02-09 01:13:02 +01:00
Arkadiusz Fal
8464464199 Fix locales 2026-02-09 00:13:46 +01:00
Arkadiusz Fal
05f921d605 Yattee v2 rewrite 2.0.0-250 2026-02-08 18:33:56 +01:00
Arkadiusz Fal
20d0cfc0c7 Use macos-26 runner for release workflow
macos-latest (macos-15) doesn't have iOS 26 / tvOS 26 platform
SDKs pre-installed, causing build failures. The macos-26 runner
ships with the required SDKs.
1.5.2-241
2026-02-07 20:53:38 +01:00
Arkadiusz Fal
7fe99b09ef Update build number 2026-02-07 20:24:45 +01:00
Arkadiusz Fal
78f155a3b9 Merge pull request #904 from telyn/support-invidious-empty-domain
Support Invidious servers which have unspecified domains (... at least for thumbnail URLs 🙂)
2025-12-22 23:07:29 +01:00
telyn
6f696c9262 [invidious] default thumbnail hostname to configured URL's
For context, Invidious performs a type check of its configuration during
bootup, and allows the "domain" to be unspecified, in which case the API
and HTML it generates includes path-only URLs. This is valid: in these
cases we should assume that the Host for those URLs is the same as
the Host we used to access the endpoint called.

This commit adds support for servers configured in such a way, by
defaulting the host of thumbnail URLs, to that used for authentication.
2025-12-22 14:59:39 +00:00
Arkadiusz Fal
b38bd3f444 Update changelog for build 211 1.5.2-211 2025-11-23 17:17:48 +01:00
Arkadiusz Fal
d8e079ac90 Bump build number to 211 2025-11-23 17:11:12 +01:00
Arkadiusz Fal
75812906c1 Update dependencies 2025-11-23 17:08:39 +01:00
Arkadiusz Fal
82570b7f34 Fix SwiftFormat indentation in VideoContextMenuView
Applied SwiftFormat indentation rules to conditional overlay block in iOS-specific code.
2025-11-23 17:02:07 +01:00
Arkadiusz Fal
e43eddc8e7 Fix iOS menu text disappearing in ChannelVideosView
Applied ZStack overlay fix to the channel menu in ChannelVideosView
where the channel name, avatar, subscriber count, and view count
would disappear when tapping the menu.

Uses the same pattern:
- Visible static label with channel info stays on screen
- Invisible Menu overlay with .opacity(0) handles interactions
- Prevents text/avatar disappearing and resizing animations
2025-11-23 14:34:29 +01:00
Arkadiusz Fal
c5137a8af8 Prefer fast-loading formats when switching to AVPlayer
When switching from MPV to AVPlayer, prioritize HLS and stream formats over non-streamable MP4/AVC1 formats to avoid long loading times.

Changes:
- Added isFastLoadingFormat() helper to AVPlayerBackend
- Modified streamByQualityProfile to prefer fast-loading formats for AVPlayer
- Falls back to non-streamable formats only if no fast-loading option exists
- Ensures quick backend switching without waiting for metadata download
2025-11-23 14:20:28 +01:00
Arkadiusz Fal
9177abb0ec Fix iOS menu text disappearing in navigation headers
Extended the ZStack overlay fix to all iOS navigation header menus
where text labels would disappear when tapping the menu:

- HomeView: "Home" title menu
- PopularView: "Popular" title with icon menu
- TrendingView: Country/flag title menu
- PlaylistsView: Playlist title with thumbnail menu
- ChannelPlaylistView: Playlist title with thumbnail menu
- OpenVideosView: Playback mode picker menu

All menus now use the same pattern as PlaybackSettings:
- Visible static label layer in ZStack
- Invisible Menu overlay with .opacity(0)
- Prevents text disappearing and resizing animations
2025-11-23 14:16:21 +01:00
Arkadiusz Fal
65e86d30ec Fix iOS playback settings menu text disappearing and resizing issues
When tapping menus in playback settings (playback mode, quality profile,
stream, rate, captions, audio track), the selected value text would
disappear and cause unwanted resizing animations.

Implemented ZStack overlay technique for all iOS menu buttons:
- Visible static label remains on screen
- Invisible Menu overlay (.opacity(0)) handles tap interactions
- Prevents text from disappearing when menu opens
- Eliminates resizing animations on option selection
2025-11-23 14:09:14 +01:00
Arkadiusz Fal
0c4609bcf1 Update dependencies 2025-11-23 13:43:43 +01:00
Arkadiusz Fal
36190e62f5 Restrict orientation locking to iPhone only
- Add device checks in Orientation enum to prevent locking on iPad
- Hide "Lock portrait mode" setting on iPad in BrowsingSettings
- Use Constants.isIPhone for consistent device detection
2025-11-23 13:41:03 +01:00
Arkadiusz Fal
e6e69eb757 Add optional AVPlayer support for non-streamable MP4/AVC1 formats
AVPlayer has a fundamental limitation with MP4/AVC1 progressive downloads where the moov atom position affects playback start time. When moov is at the end of the file, AVPlayer must download the entire file before starting playback. MPV doesn't have this limitation.

This commit adds an advanced setting to optionally enable these formats in AVPlayer with appropriate warnings:

- Added new setting: "Enable non-streamable formats (MP4/AVC1)"
- Default: disabled (formats hidden, MPV handles them)
- When enabled: MP4/AVC1 formats up to 1080p appear in AVPlayer quality selector
- Resolution limit: 1080p maximum (higher resolutions can't be played properly)
- Clear warning about slow loading and 1080p limitation
- Automatic stream refresh when setting is toggled
- Full import/export support for the setting
2025-11-23 13:32:16 +01:00
Arkadiusz Fal
41a33634ee Fix YouTube share links including port from Invidious instance
Fixes #870 where YouTube share links incorrectly included the port number
from the user's Invidious instance URL (e.g., http://www.youtube.com:3000
instead of http://www.youtube.com).

Added defensive logic to explicitly clear the port when creating share URLs
with frontend URL strings containing "youtube.com". This ensures YouTube
share links always use the standard format without port numbers, regardless
of the user's instance configuration.
2025-11-23 12:00:02 +01:00
Arkadiusz Fal
aa703f6531 Fix Invidious search API parameters
Update search query parameters to match Invidious API:
- Change sort_by to sort
- Change upload_date to date
- Change view_count to views

Fixes #881
2025-11-23 11:51:25 +01:00
Arkadiusz Fal
db80b6adbb Restrict tvOS Cancel button to versions below 18
The Cancel button in VideoContextMenuView now only appears on tvOS 17 and earlier using #unavailable(tvOS 18.0) check.
2025-11-23 01:20:38 +01:00
Arkadiusz Fal
6591d503d4 Restrict context menu overlay to iOS only
The tap-blocking overlay is only needed on iOS to dismiss the context menu
on tap. Removed it from macOS and tvOS where it was either blocking normal
interactions or not functional due to platform limitations.
2025-11-23 01:18:55 +01:00
Arkadiusz Fal
1eba731283 Fix home view empty sections taking excessive vertical space
Removed fixed height constraint from empty state in FavoriteItemView.
Empty sections now collapse to natural height instead of reserving
full content height (290px iOS/600px tvOS), improving space efficiency.
2025-11-22 23:54:33 +01:00
Arkadiusz Fal
0913c6d73c Fix tvOS controls overlay button text legibility
Improved text contrast on overlay buttons by:
- Applying foreground color directly to button labels to ensure proper override
- Using semi-transparent gray background for unfocused buttons instead of Color.secondary
- Removing accent color overrides from caption text to respect button styling

This ensures readable text in both focused (black on white) and unfocused
(white on gray) states.
2025-11-22 23:40:23 +01:00
Arkadiusz Fal
997de6468d Improve tvOS controls overlay with single-press menus
Changed context menus from press-and-hold to single-press for better UX:
- Quality profile selection
- Stream quality selection
- Captions selection
- Audio track selection

Updated ControlsOverlayButton to support tap actions via new onSelect parameter.
Replaced .contextMenu modifiers with .alert for instant menu access on tvOS.
Removed hint text and unnecessary 80px padding as single-press is self-evident.
2025-11-22 23:39:55 +01:00
Arkadiusz Fal
1397a2fee6 Fix tvOS captions list always showing as unavailable in MPV
The captions context menu on tvOS was always empty because it relied on
an .onAppear callback that was never triggered. The captionsPicker view
with .onAppear was only rendered on iOS/macOS, not tvOS.

Changes:
- Access captions directly from player.currentVideo?.captions instead of
  using a state variable populated via .onAppear
- Fix label logic to show "Disabled" when captions are available but not
  selected, and "Not available" only when video has no captions
- Remove unused state variables and helper functions
2025-11-22 23:06:56 +01:00
Arkadiusz Fal
660891f2a5 Add hide videos without duration setting to macOS instance settings
Added the "Experimental: Hide videos without duration" toggle to the
macOS instance settings view to match the iOS/tvOS implementation.
2025-11-22 22:54:45 +01:00
Arkadiusz Fal
2e27dcd2cf Fix Invidious captions URL when companion is enabled
Prefix caption URLs with /companion when invidiousCompanion is enabled in instance settings. This ensures captions are routed through the companion service, matching the behavior of video streams.
2025-11-22 22:52:46 +01:00
Arkadiusz Fal
5f53e53c7a Fix iOS fullscreen gesture collision with notification center
In fullscreen playback, swipe-down and timeline seek gestures now respect a 60pt safe zone at the top of the screen, allowing the system notification center gesture to work without triggering app gestures.
2025-11-22 20:11:14 +01:00
Arkadiusz Fal
73295e726a Fix iOS comments scrolling issue in video details view
Comments at the bottom of the comments view were not accessible on iOS
without entering fullscreen mode. The issue was caused by the VideoDetails
view being offset by the player height when not in fullscreen, but the
ScrollView padding didn't account for this offset.

Changes:
- Add SafeAreaModel observer for iOS platform
- Update bottom padding to dynamically account for player height offset
  and safe area insets based on fullscreen state
- When not in fullscreen: padding = player height + safe area bottom + 20
- When in fullscreen: padding = max(60, safe area bottom + 20)

This ensures all comments and video details content are fully scrollable
and visible regardless of fullscreen state.
2025-11-22 19:54:36 +01:00
Arkadiusz Fal
b0dfd2f9d2 Add experimental setting to hide videos without duration in Invidious
This adds a new instance setting for Invidious that filters out videos
without duration information from feeds, popular, trending, search results,
and channel pages. This can be used to hide YouTube Shorts.

The setting is labeled as "Experimental: Hide videos without duration" and
includes an explanation that it can be used to hide shorts.

Key changes:
- Added hideVideosWithoutDuration property to Instance model
- Updated InstancesBridge to serialize/deserialize the new setting
- Added UI toggle in InstanceSettings with explanatory footer text
- Implemented filtering in InvidiousAPI for:
  * Popular videos
  * Trending videos
  * Search results
  * Subscription feed
  * Channel content
- Videos accessed directly by URL are not filtered
2025-11-22 19:42:18 +01:00
Arkadiusz Fal
735e7d62b6 Update changelog for build 210 1.5.2-210 2025-11-20 18:00:31 +01:00
Arkadiusz Fal
320c16fcc7 Bump build number to 210 2025-11-20 17:56:24 +01:00
Arkadiusz Fal
8c5c503df2 Fix iPad iOS 18 keyboard dismissal issue in search
Removed auto-focus logic that was causing keyboard show/hide loop
on iPad with docked keyboard. The keyboard was repeatedly dismissing
immediately after appearing due to interaction between keyboard
notifications, focus state changes, and view updates.

Changes:
- Removed focused state and keyboard observer from SearchModel
- Removed iOS textField reference (kept macOS only)
- Removed auto-focus logic from FocusableSearchTextField on iOS
- Cleaned up unused focus-related code

The search field now works reliably when tapped manually on iPad.
Auto-focus still works on macOS where it doesn't cause issues.
2025-11-20 17:49:10 +01:00