Commit Graph

2524 Commits

Author SHA1 Message Date
Arkadiusz Fal
41c11d8839 Fix playlist rows in ChannelView not tappable in empty space 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
aaf53ef9d1 Fix lock screen always showing 10s seek regardless of system controls setting 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
f010650e5e Remove excessive logging 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
5f00f4934c 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-04-18 20:37:25 +02:00
Arkadiusz Fal
ecaf553326 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-04-18 20:37:25 +02:00
Arkadiusz Fal
0e0922dad0 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-04-18 20:37:25 +02:00
Arkadiusz Fal
7b43184a38 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-04-18 20:37:25 +02:00
Arkadiusz Fal
307d6f7350 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-04-18 20:37:25 +02:00
Arkadiusz Fal
3666154510 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-04-18 20:37:25 +02:00
Arkadiusz Fal
37c75f25b0 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-04-18 20:37:25 +02:00
Arkadiusz Fal
f022b3dc30 Fix panscan zoom pushing controls off screen for portrait videos 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
11a8c79e21 Refactor views 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
425a2c590d Fix locales 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
100df744d9 Yattee v2 rewrite 2026-04-18 20:37:24 +02:00
Arkadiusz Fal
d94a50f8c3 Retry SPM dependency resolve to work around binary-target race
xcodebuild's resolvePackageDependencies sometimes fails with
"already exists in file system" when multiple binary xcframework
targets from the same release URL try to extract concurrently.
The failing target varies across runs, confirming a race, not a
missing-file problem. Wipe the three SPM cache roots between
attempts and retry up to three times before giving up; once the
resolve succeeds, fastlane's own resolve step reuses the cache.
1.5.2-257
2026-04-18 19:41:42 +02:00
Arkadiusz Fal
b7edbe5683 Pin Xcode 26.0.1 for release and broaden SPM cache clear
Xcode 26.2 (the new default on macos-26) hits a SwiftPM race where
binary xcframework downloads fail with "already exists in file system".
Xcode 26.0.1 — the toolchain the last successful release ran against —
resolved the same deps cleanly. Also download the iOS platform if the
runner image only ships the platform bundled with the default Xcode,
and clear SPM cache more broadly rather than only the artifacts dir.
2026-04-18 19:33:48 +02:00
Arkadiusz Fal
42849c1aae Drop explicit Xcode 26.0.1 selection on release workflow
setup-xcode was switching to /Applications/Xcode_26.0.1.app, which on
the macos-26 runner lacks the iOS 26.0 platform SDK. The runner's
default Xcode has it bundled. Matches rewrite/v2.
2026-04-18 19:25:31 +02:00
Arkadiusz Fal
11f0dff4e2 Pass is_key_content_base64: true to app_store_connect_api_key
The DEVELOPER_KEY_CONTENT secret is stored base64-encoded, so fastlane
needs to be told to decode it before parsing. Matches the approach on
rewrite/v2. Removes the openssl-shell-out workaround from the previous
commits, which was solving the wrong problem.
2026-04-18 19:10:04 +02:00
Arkadiusz Fal
a26044cc04 Un-escape \n in DEVELOPER_KEY_CONTENT before openssl conversion
GitHub secrets store multi-line PEMs as a single line with literal "\n"
sequences. Fastlane's app_store_connect_api_key action un-escapes them
via gsub before use; the helper must do the same before writing the
temp file, otherwise openssl sees garbage.
2026-04-18 19:05:44 +02:00
Arkadiusz Fal
c978ec6b89 Work around invalid curve name on CI runners
The hosted macOS runner's OpenSSL rejects Apple's PKCS#8 .p8 key via
OpenSSL::PKey::EC.new with "invalid curve name". Shell out to system
openssl to convert the key to SEC1/traditional PEM before handing it
to fastlane's app_store_connect_api_key action.

Ref: fastlane/fastlane#20593
2026-04-18 19:03:27 +02:00
Arkadiusz Fal
4a69172bed Bump CI Ruby to 3.3
Fastlane 2.232 transitive deps (public_suffix 7, multi_json 1.20)
require Ruby >= 3.2, and Ruby 3.1 is EOL since March 2025.
2026-04-18 18:57:21 +02:00
Arkadiusz Fal
0db1c08b98 Bump fastlane to 2.232 to fix invalid curve name on CI
Works around OpenSSL::PKey::ECError when parsing App Store Connect
API .p8 keys on the updated GitHub-hosted macOS runner image.
2026-04-18 18:47:22 +02:00
Arkadiusz Fal
f9ecfcd3dd Fix README 2026-04-18 18:36:42 +02:00
Arkadiusz Fal
b9351b502c Update changelog 2026-04-18 18:33:24 +02:00
Arkadiusz Fal
f28fdcec96 Bump build number 2026-04-18 18:31:19 +02:00
Arkadiusz Fal
ba3da4fc03 Wire Finnish, Indonesian, Korean, Dutch, Swedish into Localizable.strings build
Commit 37c6f6abb added fi/id/ko/nl/sv to knownRegions but never registered
their .strings files, so Xcode never copied them into the app bundle and the
runtime fell back to English even when the scheme forced one of these
languages. Adds the missing PBXFileReference entries and includes them in
the Localizable.strings PBXVariantGroup.
2026-04-18 18:25:57 +02:00
Arkadiusz Fal
627ee48325 Update README 2026-04-18 17:59:44 +02:00
Arkadiusz Fal
f23b010241 Merge pull request #903 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2026-04-18 12:28:59 +02:00
Sketch6580
9a5d377ae0 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/zh_Hans/
2026-04-02 01:09:50 +00:00
ButterflyOfFire
b789e320e0 Translated using Weblate (Kabyle)
Currently translated at 17.0% (96 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/kab/
2026-03-26 16:09:49 +00:00
Ghost of Sparta
6bdb187d18 Translated using Weblate (Hungarian)
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/hu/
2026-03-13 08:09:48 +00:00
Sketch6580
ca36254661 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (562 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/zh_Hans/
2026-02-07 20:54:12 +01:00
Aditya Bhat
3312e1df82 Translated using Weblate (Kannada)
Currently translated at 1.6% (9 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/kn/
2026-02-07 20:54:12 +01:00
Aditya Bhat
a484aaf889 Added translation using Weblate (Kannada) 2026-02-07 20:54:11 +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