Commit Graph

2508 Commits

Author SHA1 Message Date
github-actions[bot]
52bb32afdf Bump build number to 253 2026-04-18 20:38:00 +02:00
Arkadiusz Fal
40212fb34c Skip build number commit when already up to date
The release job fails when the build number in the repo already matches
the computed value, causing git commit to exit with code 1 on an empty
changeset. Now we check for staged changes before committing.
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
109d165dac Revert app icon name to Yattee2 for Icon Composer
The Yattee2.icon/ Icon Composer file is the correct source for app
icons. The previous change to AppIcon was incorrect — AppIcon.appiconset
is an empty legacy placeholder with no actual PNGs.
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
c2ee65cacd Use macos-26 runner for Xcode 26 SDK support
iOS 26 APIs (matchedTransitionSource on ToolbarContent, etc.) require
the Xcode 26 SDK which is only available on macos-26 runners.
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
c53b0b3386 Fix app icon name to match asset catalog
ASSETCATALOG_COMPILER_APPICON_NAME was set to "Yattee2" but the
asset catalog only has "AppIcon.appiconset".
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
bf1ed95281 Set code_sign_identity in update_code_signing_settings
Without explicit identity, xcodebuild defaults to "iOS Development"
which doesn't exist on CI. Set "Apple Distribution" for App Store
builds and "Developer ID Application" for notarized builds.
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
03bf8d2654 Use fastlane update_code_signing_settings for manual signing
Replaced sed-based CODE_SIGN_STYLE override with fastlane's
update_code_signing_settings which also sets PROVISIONING_PROFILE_SPECIFIER.
This fixes the YatteeShareExtension build failure where it couldn't
find a provisioning profile under manual signing.
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
aca9ab6a0b Skip GitHub release when any build job fails
Adding !failure() check so skipped builds (not selected) still allow
the release, but actual build failures block it.
2026-04-18 20:38:00 +02:00
github-actions[bot]
2aca95e3fa Bump build number to 252 2026-04-18 20:38:00 +02:00
Arkadiusz Fal
0529c9105c Fix build number file path and remove update_fastlane in CI
- Write latest_build_number.txt to repo root using explicit path
  (fastlane runs from fastlane/ subdir, so relative path was wrong)
- Remove update_fastlane from before_all to avoid CI instability
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
161be24ad3 Fix release workflow by updating Ruby from 3.1 to 3.4
Ruby 3.1 is EOL and bundle install fails with exit code 5 on
latest macOS runners. Updated to match .ruby-version (3.4.8).
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
3b605020ed Update CHANGELOG 2026-04-18 20:38:00 +02:00
Arkadiusz Fal
ee49671ea2 Fix release workflow to support non-main branches 2026-04-18 20:38:00 +02:00
Arkadiusz Fal
7dd2ee1582 Add git-cliff based changelog generator
Bash wrapper around git-cliff with cliff.toml config for regex-based
commit parsers handling skip patterns and category matching.
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
bb1e7ddd68 Auto-increment build number in release workflow
Query App Store Connect for the latest TestFlight build number across
all platforms (iOS, tvOS, macOS) and auto-increment it, eliminating
the need for the separate bump-build workflow.
2026-04-18 20:38:00 +02:00
Arkadiusz Fal
2f1e699623 Update localizable 2026-04-18 20:37:35 +02:00
Arkadiusz Fal
e6834b6eff Add DEV badge on iCloud settings for debug builds
Shows an orange "DEV" capsule next to the iCloud row in Settings and a
development environment notice at the top of iCloud settings, helping
distinguish CloudKit dev environment from production during development.
2026-04-18 20:37:35 +02:00
Arkadiusz Fal
07003a36d7 Fix deleted playlists resurrecting from iCloud after app restart
Pending deletes were lost across app restarts because
recoverPersistedPendingChanges() never reconstructed CKRecord.ID
objects from persisted record names. Additionally, incoming iCloud
records for deleted playlists were blindly applied, and orphaned
playlist items in CloudKit would recreate placeholder playlists.

- Rebuild pendingDeletes array from UserDefaults on recovery
- Guard applyRemoteRecord against records pending local deletion
- Skip deferred items whose parent playlist is pending deletion
- Queue all playlist item deletions when deleting a playlist
- Clean up placeholder playlists for pending-delete playlists
2026-04-18 20:37:35 +02:00
Arkadiusz Fal
e38e4cca3a Fix feed channel filter avatars showing placeholders instead of images
The filter strip was passing the Invidious instance URL as serverURL to
AvatarURLBuilder, which built a Yattee Server-style /avatar/ path that
doesn't exist on Invidious. Now passes the actual Yattee Server URL
(matching SubscriptionsView pattern) and enriches channels from
CachedChannelData as a fallback when the API doesn't return thumbnails.
2026-04-18 20:37:35 +02:00
Arkadiusz Fal
904e4366fb Bump build number to 251 2026-04-18 20:37:35 +02:00
Arkadiusz Fal
fae390cff6 Fix build number 2026-04-18 20:37:35 +02:00
Arkadiusz Fal
1ac4e089fc Add Fastlane config and update release workflow for v2
Single unified "Yattee" scheme replaces per-platform schemes.
Release workflow now has toggleable platform inputs instead of
matrix strategy. Standalone mac notarized workflow removed in
favor of the build_mac_notarized toggle. Share extension bundle
ID updated from Open-in-Yattee to ShareExtension.
2026-04-18 20:37:35 +02:00
Arkadiusz Fal
7c33f7e9f3 Change default layout settings 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
7cea57c343 Update media browser view options sheet layout 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
d045a64b63 Persist media browser view options per source
Save sort order, sort direction, and show-only-playable filter to
UserDefaults keyed by source ID so preferences survive navigation.
2026-04-18 20:37:25 +02:00
Arkadiusz Fal
7abd3a86fc Move close video button from toolbar into now playing card in RemoteControlView 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
5c82c37339 Add Enable All / Disable All menu to channel notifications settings 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
e4d275ad42 Show video thumbnail in mini player during PiP
When PiP is active, the MPV render view shows a black frame since
rendering goes to the PiP sample buffer layer. Overlay the video
thumbnail (preferring DeArrow) on top to cover the black area,
fading it in/out smoothly when PiP starts/stops.
2026-04-18 20:37:25 +02:00
Arkadiusz Fal
2faae65e8b Add context menu and swipe actions to related videos in VideoInfoView 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
49a44da90e 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-04-18 20:37:25 +02:00
Arkadiusz Fal
fa0536549a Fix subscriber count layout shift in VideoInfoView channel row 2026-04-18 20:37:25 +02:00
Arkadiusz Fal
ef3cddefeb 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-04-18 20:37:25 +02:00
Arkadiusz Fal
e3606dbb3a 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-04-18 20:37:25 +02:00
Arkadiusz Fal
02de3d0bd5 Fix blurred background gradient not using DeArrow thumbnail 2026-04-18 20:37:25 +02:00
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