mirror of
https://github.com/yattee/yattee.git
synced 2025-12-14 03:58:14 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea0ea427e7 | ||
|
|
f685e180d0 | ||
|
|
a37f3e4a07 | ||
|
|
33377f7e0e | ||
|
|
4b577a296b | ||
|
|
e882d0264b | ||
|
|
45f72ce4a1 | ||
|
|
3536370798 | ||
|
|
a5275fd800 | ||
|
|
49278e13cd | ||
|
|
13d7a8d0a6 | ||
|
|
50efe94839 | ||
|
|
1e7656a9eb | ||
|
|
4c5b801c45 | ||
|
|
e6b6778ba1 | ||
|
|
9c15393ab4 | ||
|
|
5cfdd36237 | ||
|
|
e0cf927ebb |
59
.github/workflows/build-mac-notarized-macos15-xcode16.4.yml
vendored
Normal file
59
.github/workflows/build-mac-notarized-macos15-xcode16.4.yml
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
name: Build and notarize macOS app (macOS 15, Xcode 16.4)
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
APP_NAME: Yattee
|
||||
FASTLANE_USER: ${{ secrets.FASTLANE_USER }}
|
||||
FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
|
||||
ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }}
|
||||
TEAM_ID: ${{ secrets.TEAM_ID }}
|
||||
DEVELOPER_KEY_ID: ${{ secrets.DEVELOPER_KEY_ID }}
|
||||
DEVELOPER_KEY_ISSUER_ID: ${{ secrets.DEVELOPER_KEY_ISSUER_ID }}
|
||||
DEVELOPER_KEY_CONTENT: ${{ secrets.DEVELOPER_KEY_CONTENT }}
|
||||
TEMP_KEYCHAIN_USER: ${{ secrets.TEMP_KEYCHAIN_USER }}
|
||||
TEMP_KEYCHAIN_PASSWORD: ${{ secrets.TEMP_KEYCHAIN_PASSWORD }}
|
||||
DEVELOPER_APP_IDENTIFIER: ${{ secrets.DEVELOPER_APP_IDENTIFIER }}
|
||||
GIT_AUTHORIZATION: ${{ secrets.GIT_AUTHORIZATION }}
|
||||
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
|
||||
CERTIFICATES_GIT_URL: ${{ secrets.CERTIFICATES_GIT_URL }}
|
||||
|
||||
jobs:
|
||||
mac_notarized:
|
||||
name: Build and notarize macOS app (macOS 15, Xcode 16.4)
|
||||
runs-on: macos-15
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '3.1'
|
||||
bundler-cache: true
|
||||
cache-version: 1
|
||||
- name: Replace signing certificate to Direct with Developer ID
|
||||
run: |
|
||||
sed -i '' 's/match AppStore/match Direct/' Yattee.xcodeproj/project.pbxproj
|
||||
sed -i '' 's/3rd Party Mac Developer Application/Developer ID Application/' Yattee.xcodeproj/project.pbxproj
|
||||
- uses: maxim-lobanov/setup-xcode@v1
|
||||
with:
|
||||
xcode-version: '16.4'
|
||||
- name: Clear SPM cache
|
||||
run: |
|
||||
rm -rf ~/Library/Caches/org.swift.swiftpm/artifacts
|
||||
rm -rf ~/Library/Developer/Xcode/DerivedData
|
||||
rm -rf .build
|
||||
- uses: maierj/fastlane-action@v3.0.0
|
||||
with:
|
||||
lane: mac build_and_notarize
|
||||
- run: |
|
||||
echo "BUILD_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 CURRENT_PROJECT_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
|
||||
echo "VERSION_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 MARKETING_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
|
||||
- run: |
|
||||
echo "APP_PATH=fastlane/builds/${{ env.VERSION_NUMBER }}-${{ env.BUILD_NUMBER }}/macOS/Yattee.app" >> $GITHUB_ENV
|
||||
echo "ZIP_PATH=fastlane/builds/${{ env.VERSION_NUMBER }}-${{ env.BUILD_NUMBER }}/macOS/Yattee-${{ env.VERSION_NUMBER }}-macOS.zip" >> $GITHUB_ENV
|
||||
- name: ZIP build
|
||||
run: /usr/bin/ditto -c -k --keepParent ${{ env.APP_PATH }} ${{ env.ZIP_PATH }}
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: mac-notarized-build
|
||||
path: ${{ env.ZIP_PATH }}
|
||||
if-no-files-found: error
|
||||
162
CHANGELOG.md
162
CHANGELOG.md
@@ -1,180 +1,42 @@
|
||||
## Build 208
|
||||
## Build 209
|
||||
|
||||
## What's Changed
|
||||
|
||||
**iPad Enhancements:**
|
||||
* Fix Now Playing controls for both MPV and AVPlayer backends
|
||||
* Fix thumbnail sizing and aspect ratio issues in video cells (#896)
|
||||
* Adjust tvOS video cell dimensions for better layout
|
||||
* Fix playing videos from channel view in modal opened in video player
|
||||
* Fix audio track label showing "Original" instead of "Unknown"
|
||||
* Simplify fullscreen handling for iOS
|
||||
* Add macOS-specific entitlements for MPV backend
|
||||
|
||||
## Previous builds
|
||||
|
||||
**Build 208:**
|
||||
* Enable resizable windows on iPad
|
||||
* Improve iPad UI behavior and settings layout
|
||||
* Fix horizontal content extending behind sidebar on iPad
|
||||
* Add proper padding to player controls and video details in non-fullscreen iPad windows
|
||||
* Hide orientation lock controls on iPad (not applicable for iPad)
|
||||
|
||||
**iOS Improvements:**
|
||||
* Fix video player overlay to respect window fullscreen state
|
||||
* Allow video player to extend into safe areas
|
||||
* Fix iOS Now Playing Info Center integration for AVPlayer backend
|
||||
* Fix button styling and safe area handling
|
||||
|
||||
**macOS Improvements:**
|
||||
* Fix picker label visibility in settings
|
||||
* Improve video layer rendering
|
||||
* Add macOS 26 compatibility for search UI
|
||||
* Improve playback settings UI controls
|
||||
|
||||
**Player & Playback:**
|
||||
* Add retry mechanism for file load errors (both MPV and AVPlayer)
|
||||
* Fix MPV player vertical positioning in fullscreen mode
|
||||
* Improve player controls visibility and layout
|
||||
* Add nil safety checks for stream resolution and playback time handling
|
||||
* Refactor dirty region handling in MPV video rendering
|
||||
* Remove verbose logging from MPV rendering
|
||||
|
||||
**UI/UX:**
|
||||
* Improve layout stability and reduce unwanted animations
|
||||
* Simplify stream description by removing instance info
|
||||
* Update default visible sections from trending to popular
|
||||
|
||||
**Maintenance:**
|
||||
* Update MPVKit dependency
|
||||
* Update Ruby dependencies
|
||||
* Fix SwiftLint and SwiftFormat violations
|
||||
* Fix main actor isolation warnings
|
||||
* Update GitHub Actions to latest macOS and Xcode versions
|
||||
|
||||
## Previous builds
|
||||
|
||||
**Build 204:**
|
||||
* Fix Invidious companion API endpoint path
|
||||
* Fix issues with audio tracks in Piped (crash)
|
||||
* Improve MPV backend audio track handling
|
||||
* Add Liquid Glass effect to player controls bar
|
||||
* Use fullScreenCover for Settings and Accounts on tvOS
|
||||
* Improve tvOS settings UI styling and navigation
|
||||
* Improve fullscreen orientation handling for iOS player
|
||||
* Fix published date handling in Piped API
|
||||
* Optimize SwiftUI performance throughout the app
|
||||
* Improve search field layout and responsiveness
|
||||
* Add localization support for Finnish, Indonesian, Korean, Dutch, and Swedish
|
||||
* Update dependencies
|
||||
|
||||
**Build 201:**
|
||||
* MPV audio track switching and fix default audio language by @n3d1117 in https://github.com/yattee/yattee/pull/874
|
||||
* Feat: Added caption support for Piped backend by @craftycorvid in https://github.com/yattee/yattee/pull/867
|
||||
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/877
|
||||
* Add support for invidious companion by @lifo9 in https://github.com/yattee/yattee/pull/863
|
||||
* Add skip, play/pause, and fullscreen shortcuts to macOS player (by @rickykresslein)
|
||||
* Added Settings Import/Export
|
||||
* Export all settings, instances and accounts
|
||||
* Import selected elements from the file
|
||||
* Include unencrypted passwords in the export or provide them during the import
|
||||
* Import via URL for tvOS
|
||||
* Added Controls setting "Action button labels" icon or icon and text
|
||||
* Added Advanced setting for MPV: "deinterlace"
|
||||
* Add help text to all header buttons (by @rickykresslein)
|
||||
* History Setting: hide the recent activity in the sidebar or limit the number of items shown (by @rickykresslein)
|
||||
* Fix issues with empty comments (by @stonerl)
|
||||
* Improved Invidious comments (by @stonerl)
|
||||
* Allow import of accounts to manually added (not imported) instances
|
||||
* Add import export of missing settings
|
||||
* macOS: Fix settings windows layout
|
||||
* Fix seek OSD layout on tvOS, revert OSD position
|
||||
* Allow users to disable fullscreen swipe gesture by @stonerl in https://github.com/yattee/yattee/pull/814
|
||||
* Proper audio interrupt and route change handling by @stonerl in https://github.com/yattee/yattee/pull/815
|
||||
* Improved subtitle handling by @stonerl in https://github.com/yattee/yattee/pull/817
|
||||
* Improvements to MPVGLView by @stonerl in https://github.com/yattee/yattee/pull/818
|
||||
* Add drag gestures to video details by @stonerl in https://github.com/yattee/yattee/pull/820
|
||||
* Fix uneven playback when using MPV and not syncing refreshrate by @blennster in https://github.com/yattee/yattee/pull/833
|
||||
* Norwegian Language by @mmaalo in https://github.com/yattee/yattee/pull/834
|
||||
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/836
|
||||
* Update MPVKit to v0.39.0 by @stonerl in https://github.com/yattee/yattee/pull/824
|
||||
* Update SwiftUI-Introspect by @stonerl in https://github.com/yattee/yattee/pull/813
|
||||
* Orientation/Fullscreen fixes and cleanup by @stonerl in https://github.com/yattee/yattee/pull/806
|
||||
* More robust resolution handling by @stonerl in https://github.com/yattee/yattee/pull/807
|
||||
* MPV: improved A/V sync by @stonerl in https://github.com/yattee/yattee/pull/805
|
||||
* Retry loading video before presenting error by @stonerl in https://github.com/yattee/yattee/pull/810
|
||||
* Refactor Search by @stonerl in https://github.com/yattee/yattee/pull/809
|
||||
* iOS: Simplified fullscreen and orientation by @stonerl in https://github.com/yattee/yattee/pull/786
|
||||
* macOS: only apply player shortcuts when window is active by @stonerl in https://github.com/yattee/yattee/pull/802
|
||||
* player controls: add background opacity selection by @stonerl in https://github.com/yattee/yattee/pull/799
|
||||
* add missing Shorts resolutions by @stonerl in https://github.com/yattee/yattee/pull/797
|
||||
* use -O1 on macOS by @stonerl in https://github.com/yattee/yattee/pull/801
|
||||
* Gestures: swipe up toggles fullscreen by @stonerl in https://github.com/yattee/yattee/pull/778
|
||||
* don’t open video when dismissing context menu by @stonerl in https://github.com/yattee/yattee/pull/780
|
||||
* mpv: remove video layer when entering background by @stonerl in https://github.com/yattee/yattee/pull/793
|
||||
* hi-res invidious logos by @stonerl in https://github.com/yattee/yattee/pull/791
|
||||
* enable -O3 by @stonerl in https://github.com/yattee/yattee/pull/794
|
||||
* Better audio ducking by @stonerl in https://github.com/yattee/yattee/pull/779
|
||||
* fix picture in picture by @stonerl in https://github.com/yattee/yattee/pull/789
|
||||
* Invidious: propper HTTP basic auth support by @stonerl in https://github.com/yattee/yattee/pull/762
|
||||
* Apply correct orientation by @stonerl in https://github.com/yattee/yattee/pull/770
|
||||
* Circular Invidious logo by @stonerl in https://github.com/yattee/yattee/pull/769
|
||||
* Video Thumbnails: retry 3 times fetching from URL by @stonerl in https://github.com/yattee/yattee/pull/768
|
||||
* Make thumbnail fill the view in music mode by @stonerl in https://github.com/yattee/yattee/pull/766
|
||||
* Changes to defaults by @stonerl in https://github.com/yattee/yattee/pull/767
|
||||
* Fixed fullscreen handling for backgrounding by @stonerl in https://github.com/yattee/yattee/pull/772
|
||||
* Update now playing info when using system controls – Partial fix for 503 by @stonerl in https://github.com/yattee/yattee/pull/765
|
||||
* Stop making videos with unknown length shorts. by @derspyy in https://github.com/yattee/yattee/pull/849
|
||||
* Add Hungarian to locales list
|
||||
* Fix crash on HLS live playback by @stonerl in https://github.com/yattee/yattee/pull/775
|
||||
* Fix mpv crashing on macOS by @stonerl in https://github.com/yattee/yattee/pull/754
|
||||
* Refreshed icons for iOS and macOS by @stonerl in https://github.com/yattee/yattee/pull/752
|
||||
* Add new MPVKit repo by @stonerl in https://github.com/yattee/yattee/pull/753
|
||||
* Add Chinese (Simplified) - zh-Hans to LanguageCodes by @stonerl in https://github.com/yattee/yattee/pull/757
|
||||
* Color changes to VideoActions by @stonerl in https://github.com/yattee/yattee/pull/759
|
||||
* Hide VideoActions Bar when no buttons is visible by @stonerl in https://github.com/yattee/yattee/pull/760
|
||||
* Improved stream resolution handling by @stonerl in https://github.com/yattee/yattee/pull/747
|
||||
* Fix some potential crashes by @stonerl in https://github.com/yattee/yattee/pull/748
|
||||
* Fix regression and improve curentChapter handling by @stonerl in https://github.com/yattee/yattee/pull/749
|
||||
* Refined chapter font scaling by @stonerl in https://github.com/yattee/yattee/pull/750
|
||||
* Improved thumbnail handling by @stonerl in https://github.com/yattee/yattee/pull/740
|
||||
* iOS: make timestamps in comments touchable by @stonerl in https://github.com/yattee/yattee/pull/741
|
||||
* Improvements to opening channels from Videos by @stonerl in https://github.com/yattee/yattee/pull/742
|
||||
* Allow hiding comments by @stonerl in https://github.com/yattee/yattee/pull/744
|
||||
* Add option to exit fullscreen on end by @stonerl in https://github.com/yattee/yattee/pull/570
|
||||
* Only updateWatch status while video is playing by @stonerl in https://github.com/yattee/yattee/pull/745
|
||||
* Xcode 16 - update recommended settings by @stonerl in https://github.com/yattee/yattee/pull/737
|
||||
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/724
|
||||
* tvOS: Allow account picker by long pressing channels button in subscriptions view by @patelhiren in https://github.com/yattee/yattee/pull/704
|
||||
* tvOS: Refined Subscriptions View by @patelhiren in https://github.com/yattee/yattee/pull/697
|
||||
* More responsive UI when Favorites are used. by @stonerl in https://github.com/yattee/yattee/pull/695
|
||||
* Improved conditional proxying by @stonerl in https://github.com/yattee/yattee/pull/696
|
||||
* Don't show related in sidebar when disabled in settings by @stonerl in https://github.com/yattee/yattee/pull/635
|
||||
* Handle audio session interrupts by other media by @stonerl in https://github.com/yattee/yattee/pull/640
|
||||
* Only show Queue header in sidebar view by @stonerl in https://github.com/yattee/yattee/pull/642
|
||||
* SponsorBlock Improvements by @stonerl in https://github.com/yattee/yattee/pull/639
|
||||
* Chapter title on jump by @stonerl in https://github.com/yattee/yattee/pull/655
|
||||
* Restart finished video by @stonerl in https://github.com/yattee/yattee/pull/646
|
||||
* SponsorBlock jump to end instead of pausing by @stonerl in https://github.com/yattee/yattee/pull/648
|
||||
* Call correct class of SDImageAWebPCoder by @stonerl in https://github.com/yattee/yattee/pull/664
|
||||
* Fix handling and displaying captions by @stonerl in https://github.com/yattee/yattee/pull/636
|
||||
* Advanced settings: make number fields .numPad by @stonerl in https://github.com/yattee/yattee/pull/661
|
||||
* Preserve time on stream change by @stonerl in https://github.com/yattee/yattee/pull/651
|
||||
* Switch to previous backend when leaving PiP by @stonerl in https://github.com/yattee/yattee/pull/641
|
||||
* Handle deep links by @timonus in https://github.com/yattee/yattee/pull/645
|
||||
* Music Mode: don't bindPlayerToLayer when entering foreground by @stonerl in https://github.com/yattee/yattee/pull/644
|
||||
* Allow user to disable thumbnails and jump to current chapter in horizontal view by @stonerl in https://github.com/yattee/yattee/pull/665
|
||||
* Rework qualitiy settings by @stonerl in https://github.com/yattee/yattee/pull/650
|
||||
* HLS: set target bitrate / AVPlayer: higher resolution by @stonerl in https://github.com/yattee/yattee/pull/667
|
||||
* Fix #619: Remove ports from shared YouTube links by @0x000C in https://github.com/yattee/yattee/pull/627
|
||||
* XCode enable IDEPreferLogStreaming by @stonerl in https://github.com/yattee/yattee/pull/638
|
||||
* Conditional proxying by @stonerl in https://github.com/yattee/yattee/pull/662
|
||||
* HomeView: Changes to Favourites and History Widget by @stonerl in https://github.com/yattee/yattee/pull/672
|
||||
* Snappy UI - Offloading non UI task to background threads by @stonerl in https://github.com/yattee/yattee/pull/671
|
||||
* Fix PiP Mode Not Working Using MPV by @stonerl in https://github.com/yattee/yattee/pull/676
|
||||
* Fix thumbnails failing to load on tvOS by @patelhiren in https://github.com/yattee/yattee/pull/688
|
||||
* speed up sorting for Stream by @stonerl in https://github.com/yattee/yattee/pull/681
|
||||
* faster chapter extraction by @stonerl in https://github.com/yattee/yattee/pull/682
|
||||
* Invidious: add images to chapters by @stonerl in https://github.com/yattee/yattee/pull/685
|
||||
* Improved Captions handling by @stonerl in https://github.com/yattee/yattee/pull/684
|
||||
* Add User-Agent to request by @stonerl in https://github.com/yattee/yattee/pull/680
|
||||
* MPV: speed up playback start by @stonerl in https://github.com/yattee/yattee/pull/689
|
||||
* Advanced Settings: cache-pause-initial by @stonerl in https://github.com/yattee/yattee/pull/679
|
||||
* Changed description for Format reordering by @stonerl in https://github.com/yattee/yattee/pull/677
|
||||
* Add Chinese (Traditional) localization (by @rexcsk)
|
||||
* Localization fixes
|
||||
* Updated localizations
|
||||
* Upgraded dependencies
|
||||
* Fixed reported crash
|
||||
* Other minor changes and improvements
|
||||
|
||||
**Big thanks to the current, past and future project contributors!**
|
||||
|
||||
@@ -220,7 +220,7 @@ final class MPVBackend: PlayerBackend {
|
||||
typealias AreInIncreasingOrder = (Stream, Stream) -> Bool
|
||||
|
||||
func canPlay(_ stream: Stream) -> Bool {
|
||||
stream.format != .av1
|
||||
stream.format != nil && stream.format != .av1
|
||||
}
|
||||
|
||||
func playStream(_ stream: Stream, of video: Video, preservingTime: Bool, upgrading: Bool) {
|
||||
@@ -338,11 +338,11 @@ final class MPVBackend: PlayerBackend {
|
||||
|
||||
// Handle streams with multiple audio tracks
|
||||
if !stream.audioTracks.isEmpty {
|
||||
if stream.selectedAudioTrackIndex >= stream.audioTracks.count {
|
||||
stream.selectedAudioTrackIndex = 0
|
||||
}
|
||||
// Ensure the index is within bounds to prevent race conditions
|
||||
let safeIndex = min(max(0, stream.selectedAudioTrackIndex), stream.audioTracks.count - 1)
|
||||
stream.selectedAudioTrackIndex = safeIndex
|
||||
|
||||
stream.audioAsset = AVURLAsset(url: stream.audioTracks[stream.selectedAudioTrackIndex].url)
|
||||
stream.audioAsset = AVURLAsset(url: stream.audioTracks[safeIndex].url)
|
||||
let fileToLoad = self.model.musicMode ? stream.audioAsset.url : stream.videoAsset.url
|
||||
let audioTrack = self.model.musicMode ? nil : stream.audioAsset.url
|
||||
|
||||
@@ -504,7 +504,10 @@ final class MPVBackend: PlayerBackend {
|
||||
updateControls()
|
||||
}
|
||||
|
||||
model.updateNowPlayingInfo()
|
||||
#if !os(macOS)
|
||||
model.setupAudioSessionForNowPlaying()
|
||||
model.updateNowPlayingInfo()
|
||||
#endif
|
||||
|
||||
handleSegmentsThrottle.execute {
|
||||
model.handleSegments(at: currentTime)
|
||||
@@ -594,6 +597,11 @@ final class MPVBackend: PlayerBackend {
|
||||
onFileLoaded = nil
|
||||
// Reset retry state on successful load
|
||||
resetRetryState()
|
||||
// Re-activate audio session for Now Playing
|
||||
#if !os(macOS)
|
||||
model.setupAudioSessionForNowPlaying()
|
||||
model.updateNowPlayingInfo()
|
||||
#endif
|
||||
|
||||
case MPV_EVENT_PROPERTY_CHANGE:
|
||||
let dataOpaquePtr = OpaquePointer(event.pointee.data)
|
||||
@@ -611,10 +619,22 @@ final class MPVBackend: PlayerBackend {
|
||||
onFileLoaded = nil
|
||||
// Reset retry state on successful playback restart
|
||||
resetRetryState()
|
||||
// Re-activate audio session for Now Playing
|
||||
#if !os(macOS)
|
||||
model.setupAudioSessionForNowPlaying()
|
||||
model.updateNowPlayingInfo()
|
||||
#endif
|
||||
|
||||
case MPV_EVENT_VIDEO_RECONFIG:
|
||||
model.updateAspectRatio()
|
||||
|
||||
case MPV_EVENT_AUDIO_RECONFIG:
|
||||
// Re-activate audio session when audio is reconfigured
|
||||
#if !os(macOS)
|
||||
model.setupAudioSessionForNowPlaying()
|
||||
model.updateNowPlayingInfo()
|
||||
#endif
|
||||
|
||||
case MPV_EVENT_SEEK:
|
||||
isSeeking = true
|
||||
|
||||
|
||||
@@ -135,6 +135,12 @@ final class MPVClient: ObservableObject {
|
||||
|
||||
checkError(mpv_initialize(mpv))
|
||||
|
||||
#if !os(macOS)
|
||||
// Set up audio session for Now Playing support
|
||||
backend?.model.setupAudioSessionForNowPlaying()
|
||||
backend?.model.updateNowPlayingInfo()
|
||||
#endif
|
||||
|
||||
let api = UnsafeMutableRawPointer(mutating: (MPV_RENDER_API_TYPE_OPENGL as NSString).utf8String)
|
||||
var initParams = mpv_opengl_init_params(
|
||||
get_proc_address: getProcAddress,
|
||||
|
||||
@@ -440,11 +440,19 @@ final class PlayerModel: ObservableObject {
|
||||
|
||||
#if os(iOS)
|
||||
if !playingInPictureInPicture, showingPlayer {
|
||||
onPresentPlayer.append { [weak self] in
|
||||
changeBackendHandler?()
|
||||
self?.playNow(video, at: time)
|
||||
if presentingPlayer {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
|
||||
guard let self else { return }
|
||||
changeBackendHandler?()
|
||||
self.playNow(video, at: time)
|
||||
}
|
||||
} else {
|
||||
onPresentPlayer.append { [weak self] in
|
||||
changeBackendHandler?()
|
||||
self?.playNow(video, at: time)
|
||||
}
|
||||
show()
|
||||
}
|
||||
show()
|
||||
return
|
||||
}
|
||||
#endif
|
||||
@@ -640,8 +648,45 @@ final class PlayerModel: ObservableObject {
|
||||
fromBackend.pause()
|
||||
}
|
||||
|
||||
// Update Now Playing when switching backends to ensure the new backend takes control
|
||||
updateNowPlayingInfo()
|
||||
// When switching away from AVPlayer, clear its current item to release Now Playing control
|
||||
#if !os(macOS)
|
||||
if from == .appleAVPlayer && to == .mpv {
|
||||
avPlayerBackend.avPlayer.replaceCurrentItem(with: nil)
|
||||
|
||||
// Clear Now Playing info entirely before MPV takes over
|
||||
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
|
||||
MPNowPlayingInfoCenter.default().playbackState = .stopped
|
||||
|
||||
logger.info("Cleared AVPlayer's Now Playing control")
|
||||
|
||||
// Schedule Now Playing setup after a brief delay, but don't block stream loading
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
|
||||
guard let self else { return }
|
||||
|
||||
// Re-activate audio session when switching to MPV to ensure Now Playing controls work
|
||||
// Force deactivate/reactivate to take control from AVPlayer
|
||||
self.setupAudioSessionForNowPlaying(forceReactivate: true)
|
||||
// Reset and re-enable remote commands to take control from AVPlayer
|
||||
self.updateRemoteCommandCenter(reset: true)
|
||||
// Set up Now Playing for MPV
|
||||
self.updateNowPlayingInfo()
|
||||
|
||||
logger.info("Set up Now Playing for MPV backend")
|
||||
}
|
||||
// Continue to load the stream (don't return early)
|
||||
} else if to == .mpv {
|
||||
// Re-activate audio session when switching to MPV to ensure Now Playing controls work
|
||||
// Force deactivate/reactivate to take control from AVPlayer
|
||||
setupAudioSessionForNowPlaying(forceReactivate: true)
|
||||
// Re-enable remote commands to take control from AVPlayer
|
||||
updateRemoteCommandCenter()
|
||||
updateNowPlayingInfo()
|
||||
} else {
|
||||
updateNowPlayingInfo()
|
||||
}
|
||||
#else
|
||||
updateNowPlayingInfo()
|
||||
#endif
|
||||
|
||||
guard var stream, changingStream else {
|
||||
return
|
||||
@@ -656,6 +701,12 @@ final class PlayerModel: ObservableObject {
|
||||
toBackend.play()
|
||||
// Update Now Playing after resuming playback on new backend
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
||||
#if !os(macOS)
|
||||
if to == .mpv {
|
||||
self?.setupAudioSessionForNowPlaying(forceReactivate: true)
|
||||
self?.updateRemoteCommandCenter(reset: true)
|
||||
}
|
||||
#endif
|
||||
self?.updateNowPlayingInfo()
|
||||
}
|
||||
}
|
||||
@@ -950,13 +1001,27 @@ final class PlayerModel: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
func updateRemoteCommandCenter() {
|
||||
func updateRemoteCommandCenter(reset: Bool = false) {
|
||||
let commandCenter = MPRemoteCommandCenter.shared()
|
||||
let skipForwardCommand = commandCenter.skipForwardCommand
|
||||
let skipBackwardCommand = commandCenter.skipBackwardCommand
|
||||
let previousTrackCommand = commandCenter.previousTrackCommand
|
||||
let nextTrackCommand = commandCenter.nextTrackCommand
|
||||
|
||||
// If resetting (e.g., after AVPlayer was active), remove all targets and re-add them
|
||||
if reset {
|
||||
logger.info("Resetting remote command center to reclaim control from AVPlayer")
|
||||
commandCenter.playCommand.removeTarget(nil)
|
||||
commandCenter.pauseCommand.removeTarget(nil)
|
||||
commandCenter.togglePlayPauseCommand.removeTarget(nil)
|
||||
commandCenter.changePlaybackPositionCommand.removeTarget(nil)
|
||||
skipForwardCommand.removeTarget(nil)
|
||||
skipBackwardCommand.removeTarget(nil)
|
||||
previousTrackCommand.removeTarget(nil)
|
||||
nextTrackCommand.removeTarget(nil)
|
||||
remoteCommandCenterConfigured = false
|
||||
}
|
||||
|
||||
if !remoteCommandCenterConfigured {
|
||||
remoteCommandCenterConfigured = true
|
||||
|
||||
@@ -986,25 +1051,21 @@ final class PlayerModel: ObservableObject {
|
||||
return .success
|
||||
}
|
||||
|
||||
commandCenter.playCommand.isEnabled = true
|
||||
commandCenter.playCommand.addTarget { [weak self] _ in
|
||||
self?.play()
|
||||
return .success
|
||||
}
|
||||
|
||||
commandCenter.pauseCommand.isEnabled = true
|
||||
commandCenter.pauseCommand.addTarget { [weak self] _ in
|
||||
self?.pause()
|
||||
return .success
|
||||
}
|
||||
|
||||
commandCenter.togglePlayPauseCommand.isEnabled = true
|
||||
commandCenter.togglePlayPauseCommand.addTarget { [weak self] _ in
|
||||
self?.togglePlay()
|
||||
return .success
|
||||
}
|
||||
|
||||
commandCenter.changePlaybackPositionCommand.isEnabled = true
|
||||
commandCenter.changePlaybackPositionCommand.addTarget { [weak self] remoteEvent in
|
||||
guard let event = remoteEvent as? MPChangePlaybackPositionCommandEvent else { return .commandFailed }
|
||||
|
||||
@@ -1014,6 +1075,12 @@ final class PlayerModel: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
// Always re-enable commands to ensure they work after backend switches
|
||||
commandCenter.playCommand.isEnabled = true
|
||||
commandCenter.pauseCommand.isEnabled = true
|
||||
commandCenter.togglePlayPauseCommand.isEnabled = true
|
||||
commandCenter.changePlaybackPositionCommand.isEnabled = true
|
||||
|
||||
switch Defaults[.systemControlsCommands] {
|
||||
case .seek:
|
||||
previousTrackCommand.isEnabled = false
|
||||
@@ -1149,6 +1216,24 @@ final class PlayerModel: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
func setupAudioSessionForNowPlaying(forceReactivate: Bool = false) {
|
||||
#if !os(macOS)
|
||||
do {
|
||||
let audioSession = AVAudioSession.sharedInstance()
|
||||
|
||||
// If forcing reactivation (e.g., after backend switch), deactivate first
|
||||
if forceReactivate {
|
||||
try? audioSession.setActive(false, options: .notifyOthersOnDeactivation)
|
||||
}
|
||||
|
||||
try audioSession.setCategory(.playback, mode: .moviePlayback, options: [])
|
||||
try audioSession.setActive(true, options: [])
|
||||
} catch {
|
||||
logger.error("Failed to set up audio session: \(error)")
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
func updateCurrentArtwork() {
|
||||
guard let video = currentVideo,
|
||||
let thumbnailURL = video.thumbnailURL(quality: Constants.isIPhone ? .medium : .maxres)
|
||||
@@ -1490,4 +1575,11 @@ final class PlayerModel: ObservableObject {
|
||||
var availableAudioTracks: [Stream.AudioTrack] {
|
||||
(backend as? MPVBackend)?.availableAudioTracks ?? []
|
||||
}
|
||||
|
||||
var selectedAudioTrack: Stream.AudioTrack? {
|
||||
let tracks = availableAudioTracks
|
||||
guard !tracks.isEmpty else { return nil }
|
||||
let safeIndex = min(max(0, selectedAudioTrackIndex), tracks.count - 1)
|
||||
return tracks[safeIndex]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ extension PlayerModel {
|
||||
for stream in streams {
|
||||
streamProcessingQueue.async(group: streamProcessingGroup) {
|
||||
let forbiddenAssetTestGroup = DispatchGroup()
|
||||
if !hasAllowedAsset, !hasForbiddenAsset, !instance.proxiesVideos, stream.format != Stream.Format.unknown {
|
||||
if !hasAllowedAsset, !hasForbiddenAsset, !instance.proxiesVideos, stream.format != nil && stream.format != Stream.Format.unknown {
|
||||
let (nonHLSAssets, hlsURLs) = self.getAssets(from: [stream])
|
||||
if let firstStream = nonHLSAssets.first {
|
||||
let asset = firstStream.0
|
||||
|
||||
@@ -81,6 +81,11 @@ struct QualityProfile: Hashable, Identifiable, Defaults.Serializable {
|
||||
return false
|
||||
}
|
||||
|
||||
// Safety check: Ensure stream has a format
|
||||
guard let streamFormat = stream.format else {
|
||||
return false
|
||||
}
|
||||
|
||||
let defaultResolution = Stream.Resolution.custom(height: 720, refreshRate: 30)
|
||||
let resolutionMatch = resolution.value ?? defaultResolution >= streamResolution
|
||||
|
||||
@@ -88,7 +93,7 @@ struct QualityProfile: Hashable, Identifiable, Defaults.Serializable {
|
||||
return true
|
||||
}
|
||||
|
||||
let formatMatch = formats.compactMap(\.streamFormat).contains(stream.format)
|
||||
let formatMatch = formats.compactMap(\.streamFormat).contains(streamFormat)
|
||||
|
||||
return resolutionMatch && formatMatch
|
||||
}
|
||||
|
||||
@@ -203,7 +203,7 @@ class Stream: Equatable, Hashable, Identifiable {
|
||||
}
|
||||
|
||||
var description: String {
|
||||
"\(displayLanguage) (\(content ?? "Unknown"))"
|
||||
"\(displayLanguage) (\(content ?? "Original"))"
|
||||
}
|
||||
|
||||
var isDubbed: Bool {
|
||||
|
||||
@@ -48,7 +48,7 @@ struct ContentView: View {
|
||||
#endif
|
||||
}
|
||||
#if os(iOS)
|
||||
.overlay(videoPlayer.edgesIgnoringSafeArea(Constants.isWindowFullscreen ? .init() : .all))
|
||||
.overlay(videoPlayer)
|
||||
.sheet(isPresented: $navigation.presentingShareSheet) {
|
||||
if let shareURL = navigation.shareURL {
|
||||
ShareSheet(activityItems: [shareURL])
|
||||
|
||||
@@ -458,7 +458,7 @@ struct ControlsOverlay: View {
|
||||
Menu {
|
||||
audioTrackPicker
|
||||
} label: {
|
||||
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||
Text(player.selectedAudioTrack?.displayLanguage ?? "Original")
|
||||
.frame(maxWidth: 240, alignment: .trailing)
|
||||
}
|
||||
.transaction { t in t.animation = .none }
|
||||
@@ -468,7 +468,7 @@ struct ControlsOverlay: View {
|
||||
.frame(height: 40)
|
||||
#else
|
||||
ControlsOverlayButton(focusedField: $focusedField, field: .audioTrack) {
|
||||
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||
Text(player.selectedAudioTrack?.displayLanguage ?? "Original")
|
||||
.frame(maxWidth: 320)
|
||||
}
|
||||
.contextMenu {
|
||||
|
||||
@@ -151,7 +151,6 @@ final class MPVOGLView: GLKView {
|
||||
|
||||
// Check if we need partial updates
|
||||
if needsPartialUpdate() {
|
||||
logger.info("Performing partial update with scissor test.")
|
||||
glEnable(GLenum(GL_SCISSOR_TEST))
|
||||
}
|
||||
|
||||
|
||||
@@ -503,7 +503,7 @@ struct PlaybackSettings: View {
|
||||
Menu {
|
||||
audioTrackPicker
|
||||
} label: {
|
||||
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||
Text(player.selectedAudioTrack?.displayLanguage ?? "Original")
|
||||
.frame(maxWidth: 240, alignment: .trailing)
|
||||
}
|
||||
.transaction { t in t.animation = .none }
|
||||
@@ -513,7 +513,7 @@ struct PlaybackSettings: View {
|
||||
.frame(height: 40)
|
||||
#else
|
||||
ControlsOverlayButton(focusedField: $focusedField, field: .audioTrack) {
|
||||
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||
Text(player.selectedAudioTrack?.displayLanguage ?? "Original")
|
||||
.frame(maxWidth: 320)
|
||||
}
|
||||
.contextMenu {
|
||||
|
||||
@@ -268,7 +268,7 @@ struct VideoPlayerView: View {
|
||||
.ignoresSafeArea()
|
||||
#else
|
||||
GeometryReader { geometry in
|
||||
VStack(spacing: 0) {
|
||||
ZStack(alignment: .top) {
|
||||
player.playerBackendView
|
||||
.modifier(
|
||||
VideoPlayerSizeModifier(
|
||||
@@ -305,6 +305,7 @@ struct VideoPlayerView: View {
|
||||
#endif
|
||||
|
||||
.background(Color.black)
|
||||
.zIndex(1)
|
||||
|
||||
if !detailsHiddenInFullScreen {
|
||||
VideoDetails(
|
||||
@@ -313,6 +314,7 @@ struct VideoPlayerView: View {
|
||||
sidebarQueue: $sidebarQueue
|
||||
)
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
||||
.frame(height: geometry.size.height)
|
||||
#if os(macOS)
|
||||
// TODO: Check whether this is needed on macOS.
|
||||
.onDisappear {
|
||||
@@ -323,8 +325,9 @@ struct VideoPlayerView: View {
|
||||
#endif
|
||||
.id(player.currentVideo?.cacheKey)
|
||||
.transition(.opacity)
|
||||
.offset(y: detailViewDragOffset)
|
||||
.offset(y: (fullScreenDetails ? 0 : player.playerSize.height) + detailViewDragOffset)
|
||||
.gesture(detailsDragGesture)
|
||||
.zIndex(2) // Ensure details are on top
|
||||
} else {
|
||||
VStack {}
|
||||
}
|
||||
@@ -412,7 +415,7 @@ struct VideoPlayerView: View {
|
||||
if !newValue { player.controls.hideOverlays() }
|
||||
}
|
||||
#if os(iOS)
|
||||
.statusBar(hidden: Constants.isIPad ? Constants.isWindowFullscreen : fullScreenPlayer)
|
||||
.statusBar(hidden: fullScreenPlayer)
|
||||
.backport
|
||||
.toolbarBackground(colorScheme == .light ? .white : .black)
|
||||
.backport
|
||||
|
||||
@@ -84,7 +84,7 @@ struct VerticalCells<Header: View>: View {
|
||||
#if os(iOS)
|
||||
return verticalSizeClass == .regular ? 320 : 800
|
||||
#elseif os(tvOS)
|
||||
return 600
|
||||
return 560
|
||||
#else
|
||||
return 320
|
||||
#endif
|
||||
@@ -92,7 +92,7 @@ struct VerticalCells<Header: View>: View {
|
||||
|
||||
var adaptiveGridItemMaximumSize: Double {
|
||||
#if os(tvOS)
|
||||
return 600
|
||||
return 560
|
||||
#else
|
||||
return .infinity
|
||||
#endif
|
||||
|
||||
@@ -39,7 +39,7 @@ struct VideoCell: View {
|
||||
Button(action: playAction) {
|
||||
content
|
||||
#if os(tvOS)
|
||||
.frame(width: 580, height: channelOnThumbnail ? 470 : 500)
|
||||
.frame(width: 550, height: channelOnThumbnail ? 446 : 480)
|
||||
#endif
|
||||
}
|
||||
.opacity(contentOpacity)
|
||||
@@ -440,7 +440,6 @@ struct VideoCell: View {
|
||||
#endif
|
||||
}
|
||||
.mask(RoundedRectangle(cornerRadius: thumbnailRoundingCornerRadius))
|
||||
.aspectRatio(Constants.aspectRatio16x9, contentMode: .fill)
|
||||
}
|
||||
|
||||
private var time: String? {
|
||||
|
||||
@@ -1507,6 +1507,7 @@
|
||||
37E21DC52CDE528A008DF47C /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = ta.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
37E32DD42EC0D63600A63F29 /* TVOSPlainToggleStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TVOSPlainToggleStyle.swift; sourceTree = "<group>"; };
|
||||
37E64DD026D597EB00C71877 /* SubscribedChannelsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribedChannelsModel.swift; sourceTree = "<group>"; };
|
||||
37E6AF002ECCCCD50001DB2B /* Yattee (macOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Yattee (macOS).entitlements"; sourceTree = "<group>"; };
|
||||
37E6D79B2944AE1A00550C3D /* FeedModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedModel.swift; sourceTree = "<group>"; };
|
||||
37E6D79F2944CD3800550C3D /* CacheStatusHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheStatusHeader.swift; sourceTree = "<group>"; };
|
||||
37E70922271CD43000D34DDE /* WelcomeScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeScreen.swift; sourceTree = "<group>"; };
|
||||
@@ -2221,6 +2222,7 @@
|
||||
37BE0BD826A214500092E2DB /* macOS */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
37E6AF002ECCCCD50001DB2B /* Yattee (macOS).entitlements */,
|
||||
374C0542272496E4009BDDBE /* AppDelegate.swift */,
|
||||
37FD43DB270470B70073EE42 /* InstancesSettings.swift */,
|
||||
37B7CFED2A19789F001B0564 /* MacOSPiPDelegate.swift */,
|
||||
@@ -4140,7 +4142,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
|
||||
@@ -4171,7 +4173,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||
@@ -4202,7 +4204,7 @@
|
||||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 14.0;
|
||||
@@ -4222,7 +4224,7 @@
|
||||
buildSettings = {
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 14.0;
|
||||
@@ -4386,7 +4388,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
@@ -4440,7 +4442,7 @@
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
|
||||
@@ -4490,11 +4492,11 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Shared/Yattee.entitlements;
|
||||
CODE_SIGN_ENTITLEMENTS = "macOS/Yattee (macOS).entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
@@ -4528,12 +4530,12 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = Shared/Yattee.entitlements;
|
||||
CODE_SIGN_ENTITLEMENTS = "macOS/Yattee (macOS).entitlements";
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
@@ -4568,7 +4570,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4591,7 +4593,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4616,7 +4618,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4640,7 +4642,7 @@
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
@@ -4666,7 +4668,7 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
@@ -4706,7 +4708,7 @@
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -4746,7 +4748,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
@@ -4769,7 +4771,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 208;
|
||||
CURRENT_PROJECT_VERSION = 209;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
|
||||
23
macOS/Yattee (macOS).entitlements
Normal file
23
macOS/Yattee (macOS).entitlements
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.files.user-selected.read-only</key>
|
||||
<true/>
|
||||
<key>com.apple.security.files.bookmarks.app-scope</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
<key>com.apple.security.temporary-exception.mach-lookup.global-name</key>
|
||||
<array>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)-spki</string>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)-spks</string>
|
||||
</array>
|
||||
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
Reference in New Issue
Block a user