Compare commits

..

40 Commits

Author SHA1 Message Date
Arkadiusz Fal
84a283ff1d Fix player size handling 2022-04-04 00:33:09 +02:00
Arkadiusz Fal
13688adb6e Minor fix 2022-04-04 00:18:49 +02:00
Arkadiusz Fal
f5b6c97003 Bump build and version number 2022-04-03 18:36:43 +02:00
Arkadiusz Fal
915cae2f5a Fix #86 2022-04-03 17:05:36 +02:00
Arkadiusz Fal
586fb2cee1 Improve EOF handling 2022-04-03 16:46:33 +02:00
Arkadiusz Fal
da0b25b14d Try to patch #78
Issue appears when app switches layout from tab to sidebar navigation
2022-04-03 15:36:58 +02:00
Arkadiusz Fal
d31aeea52a Limit formats available to AVPlayer 2022-04-03 15:36:58 +02:00
Arkadiusz Fal
812e2aef87 Fullscreen handling changes 2022-04-03 15:36:58 +02:00
Arkadiusz Fal
382cb30f2a Remove redunant update of player size 2022-04-03 15:36:58 +02:00
Arkadiusz Fal
91bc909b37 Fix project settings 2022-04-03 15:36:58 +02:00
Arkadiusz Fal
725dadf7c5 Improve keyboard shortcuts 2022-04-03 15:36:58 +02:00
Arkadiusz Fal
4d72844975 Minor fixes 2022-04-02 14:37:13 +02:00
Arkadiusz Fal
dc18e189aa Fix optional 2022-04-02 14:37:13 +02:00
Arkadiusz Fal
02349723a1 Add Package.resolved 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
4094abb8ba Bump build and version number 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
0b213e54ad Controls fixes 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
622dd5ba8a tvOS fixes 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
a77d72e2b6 Close fullscreen and restore portrait on closing player 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
755497eda5 Improve streams quality settings 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
48487f9707 Add tvOS mpv libraries 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
5ef47fc2a9 Fix player window on Mac 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
a26d02271d Minor improvements 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
10e5975b37 Bump version number 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
4178275e66 Add toggle for dislikes 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
207ba49977 Bump version number 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
4193972669 Minor fixes 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
2f395f19ad Add ReturnYoutubeDislike API 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
fc3ab0d8ae Fixes for MPV in macOS 2022-04-02 14:37:12 +02:00
Arkadiusz Fal
931107b8d5 Fix EOF handler 2022-04-02 14:36:45 +02:00
Arkadiusz Fal
a2d84a905c Minor improvements 2022-04-02 14:36:45 +02:00
Arkadiusz Fal
3327ee3fbd Add hide player button cancel action 2022-04-02 14:36:44 +02:00
Arkadiusz Fal
4227bb304e Prevent multiple seeks 2022-04-02 14:36:44 +02:00
Arkadiusz Fal
8d3e5b2a2d Add Now Playing info center updates 2022-04-02 14:36:44 +02:00
Arkadiusz Fal
ac1218a612 Hello, mpv! 🎉 2022-04-02 14:36:44 +02:00
Arkadiusz Fal
7a6820dde2 Reorganize toolbars placement 2022-04-02 14:36:16 +02:00
Arkadiusz Fal
836057578f Minor changes 2022-04-02 14:34:06 +02:00
Arkadiusz Fal
e39f4373bb Fix crashes (#69, #71) 2022-03-31 20:39:02 +02:00
Arkadiusz Fal
1490437537 Update README 2022-03-28 21:30:31 +02:00
Arkadiusz Fal
4f1b52826d Fix #109 2022-03-28 21:26:52 +02:00
Arkadiusz Fal
15e62468bb Update README 2022-03-27 23:13:53 +02:00
17 changed files with 287 additions and 62 deletions

View File

@@ -3,6 +3,6 @@ import AppKit
extension NSTextField {
override open var focusRingType: NSFocusRingType {
get { .none }
set {} // swiftlint:disable:this unused_setter_value
set {}
}
}

View File

@@ -92,17 +92,20 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
}
configureTransformer(pathPattern("search"), requestMethods: [.get]) { (content: Entity<JSON>) -> SearchPage in
let results = content.json.arrayValue.compactMap { json -> ContentItem in
let results = content.json.arrayValue.compactMap { json -> ContentItem? in
let type = json.dictionaryValue["type"]?.stringValue
if type == "channel" {
return ContentItem(channel: self.extractChannel(from: json))
} else if type == "playlist" {
return ContentItem(playlist: self.extractChannelPlaylist(from: json))
}
} else if type == "video" {
return ContentItem(video: self.extractVideo(from: json))
}
return nil
}
return SearchPage(results: results, last: results.isEmpty)
}

View File

@@ -152,7 +152,11 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
}
var signedIn: Bool {
!account.anonymous && !(account.token?.isEmpty ?? true)
guard let account = account else {
return false
}
return !account.anonymous && !(account.token?.isEmpty ?? true)
}
var subscriptions: Resource? {

View File

@@ -62,13 +62,11 @@ final class AVPlayerBackend: PlayerBackend {
func bestPlayable(_ streams: [Stream], maxResolution _: ResolutionSetting) -> Stream? {
streams.first { $0.kind == .hls } ??
streams.filter { $0.kind == .adaptive }.max { $0.resolution < $1.resolution } ??
streams.first
streams.max { $0.resolution < $1.resolution }
}
func canPlay(_ stream: Stream) -> Bool {
stream.kind == .hls || stream.kind == .stream || stream.videoFormat == "MPEG_4" ||
(stream.videoFormat.starts(with: "video/mp4") && stream.encoding == "h264")
stream.kind == .hls || (stream.kind == .stream && stream.resolution.height <= 720)
}
func playStream(

View File

@@ -17,7 +17,17 @@ final class MPVBackend: PlayerBackend {
var loadedVideo = false
var isLoadingVideo = true { didSet {
DispatchQueue.main.async { [weak self] in
self?.controls.isLoadingVideo = self?.isLoadingVideo ?? true
guard let self = self else {
return
}
self.controls.isLoadingVideo = self.isLoadingVideo
if !self.isLoadingVideo {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
self?.handleEOF = true
}
}
}
}}
@@ -29,6 +39,10 @@ final class MPVBackend: PlayerBackend {
}
updateControlsIsPlaying()
#if !os(macOS)
UIApplication.shared.isIdleTimerDisabled = model.presentingPlayer && isPlaying
#endif
}}
var playerItemDuration: CMTime?
@@ -39,6 +53,7 @@ final class MPVBackend: PlayerBackend {
private var clientTimer: RepeatingTimer!
private var handleEOF = false
private var onFileLoaded: (() -> Void)?
private var controlsUpdates = false
@@ -65,6 +80,13 @@ final class MPVBackend: PlayerBackend {
}
func playStream(_ stream: Stream, of video: Video, preservingTime: Bool, upgrading _: Bool) {
handleEOF = false
#if !os(macOS)
if model.presentingPlayer {
UIApplication.shared.isIdleTimerDisabled = true
}
#endif
let updateCurrentStream = {
DispatchQueue.main.async { [weak self] in
self?.stream = stream
@@ -255,7 +277,7 @@ final class MPVBackend: PlayerBackend {
private func updateControlsIsPlaying() {
DispatchQueue.main.async { [weak self] in
self?.controls.isPlaying = self?.isPlaying ?? false
self?.controls?.isPlaying = self?.isPlaying ?? false
}
}
@@ -299,7 +321,7 @@ final class MPVBackend: PlayerBackend {
}
func handleEndOfFile(_: UnsafePointer<mpv_event>!) {
guard !isLoadingVideo else {
guard handleEOF, !isLoadingVideo else {
return
}

View File

@@ -88,26 +88,6 @@ final class PlayerControlsModel: ObservableObject {
}
}
func toggleFullscreen(_ value: Bool) {
withAnimation(Animation.easeOut) {
resetTimer()
withAnimation(PlayerControls.animation) {
playingFullscreen = !value
}
#if os(iOS)
if playingFullscreen {
guard !(UIApplication.shared.windows.first?.windowScene?.interfaceOrientation.isLandscape ?? true) else {
return
}
Orientation.lockOrientation(.landscape, andRotateTo: .landscapeRight)
} else {
Orientation.lockOrientation(.allButUpsideDown, andRotateTo: .portrait)
}
#endif
}
}
func reset() {
currentTime = .zero
duration = .zero

View File

@@ -301,6 +301,10 @@ final class PlayerModel: ObservableObject {
backend.setNeedsDrawing(presentingPlayer)
controls.hide()
#if !os(macOS)
UIApplication.shared.isIdleTimerDisabled = presentingPlayer
#endif
if presentingPlayer, closePiPOnOpeningPlayer, playingInPictureInPicture {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
self?.closePiP()
@@ -414,8 +418,8 @@ final class PlayerModel: ObservableObject {
return "\(formatter.string(from: NSNumber(value: rate))!)×"
}
func closeCurrentItem() {
prepareCurrentItemForHistory()
func closeCurrentItem(finished: Bool = false) {
prepareCurrentItemForHistory(finished: finished)
currentItem = nil
backend.closeItem()
@@ -530,4 +534,25 @@ final class PlayerModel: ObservableObject {
currentArtwork = MPMediaItemArtwork(boundsSize: image!.size) { _ in image! }
}
func toggleFullscreen(_ isFullScreen: Bool) {
controls.resetTimer()
#if os(macOS)
Windows.player.toggleFullScreen()
#endif
controls.playingFullscreen = !isFullScreen
#if os(iOS)
if controls.playingFullscreen {
guard !(UIApplication.shared.windows.first?.windowScene?.interfaceOrientation.isLandscape ?? true) else {
return
}
Orientation.lockOrientation(.landscape, andRotateTo: .landscapeRight)
} else {
Orientation.lockOrientation(.allButUpsideDown, andRotateTo: .portrait)
}
#endif
}
}

View File

@@ -115,7 +115,7 @@ final class SearchModel: ObservableObject {
resource?.removeObservers(ownedBy: store)
resource = accounts.api.search(query, page: page?.nextPage)
resource = accounts.api.search(query, page: pageToLoad.nextPage)
resource.addObserver(store)
resource

View File

@@ -19,10 +19,10 @@
* Fullscreen playback, Picture in Picture and AirPlay support
* Stream quality selection
### Features in alpha testing for iOS and macOS
### Features in alpha testing
* New player component with custom controls, gestures and support for 4K playback
You can leave your feedback in [discussion on v1.4 release](https://github.com/yattee/yattee/discussions/75).
You can leave your feedback in [discussion on v1.4 release](https://github.com/yattee/yattee/discussions/93) or join [Matrix Channel](https://matrix.to/#/#yattee:matrix.org) for a chat. Thanks!
### Availability
|| Invidious | Piped |
@@ -53,6 +53,7 @@ You can browse and use accounts from one app and play videos with another (for e
## Contributing
If you're interestred in contributing, you can browse the [issues](https://github.com/yattee/yattee/issues) list or create a new one to discuss your feature idea. Every contribution is very welcome.
Join [Matrix Channel](https://matrix.to/#/#yattee:matrix.org) for a chat if you need an advice or want to discuss the project.
## License and Liability
Yattee and its components is shared on [AGPL v3](https://www.gnu.org/licenses/agpl-3.0.en.html) license.

View File

@@ -14,6 +14,7 @@ struct AppSidebarNavigation: View {
@EnvironmentObject<InstancesModel> private var instances
@EnvironmentObject<NavigationModel> private var navigation
@EnvironmentObject<PlayerModel> private var player
@EnvironmentObject<PlayerControlsModel> private var playerControls
@EnvironmentObject<PlaylistsModel> private var playlists
@EnvironmentObject<RecentsModel> private var recents
@EnvironmentObject<SearchModel> private var search
@@ -52,7 +53,7 @@ struct AppSidebarNavigation: View {
BrowserPlayerControls {
HStack(alignment: .center) {
Spacer()
Image(systemName: "play.tv")
Image(systemName: "4k.tv")
.renderingMode(.original)
.font(.system(size: 60))
.foregroundColor(.accentColor)
@@ -71,6 +72,7 @@ struct AppSidebarNavigation: View {
.environmentObject(instances)
.environmentObject(navigation)
.environmentObject(player)
.environmentObject(playerControls)
.environmentObject(playlists)
.environmentObject(recents)
.environmentObject(subscriptions)

View File

@@ -187,7 +187,7 @@ struct PlayerControls: View {
"Fullscreen",
systemImage: fullScreenLayout ? "arrow.down.right.and.arrow.up.left" : "arrow.up.left.and.arrow.down.right"
) {
model.toggleFullscreen(fullScreenLayout)
player.toggleFullscreen(fullScreenLayout)
}
#if !os(tvOS)
.keyboardShortcut(fullScreenLayout ? .cancelAction : .defaultAction)
@@ -204,8 +204,8 @@ struct PlayerControls: View {
#if os(tvOS)
.focused($focusedField, equals: .backward)
#else
.keyboardShortcut("k")
.keyboardShortcut(.leftArrow)
.keyboardShortcut("k", modifiers: [])
.keyboardShortcut(KeyEquivalent.leftArrow, modifiers: [])
#endif
#endif
@@ -237,8 +237,8 @@ struct PlayerControls: View {
#if os(tvOS)
.focused($focusedField, equals: .forward)
#else
.keyboardShortcut("l")
.keyboardShortcut(.rightArrow)
.keyboardShortcut("l", modifiers: [])
.keyboardShortcut(KeyEquivalent.rightArrow, modifiers: [])
#endif
#endif
}

View File

View File

@@ -234,6 +234,19 @@ struct VideoPlayerView: View {
PlayerControls(player: player)
}
#if os(iOS)
.onAppear {
// ugly patch for #78
guard player.activeBackend == .mpv else {
return
}
player.activeBackend = .appleAVPlayer
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
player.activeBackend = .mpv
}
}
#endif
}
var fullScreenLayout: Bool {

View File

@@ -92,6 +92,16 @@ struct YatteeApp: App {
.background(
HostingWindowFinder { window in
Windows.playerWindow = window
NotificationCenter.default.addObserver(
forName: NSWindow.willExitFullScreenNotification,
object: window,
queue: OperationQueue.main
) { _ in
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.player.controls.playingFullscreen = false
}
}
}
)
.onAppear { player.presentingPlayer = true }

View File

@@ -1961,6 +1961,34 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
37FF8BFC27F9A7AD0038199F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
37FF8BFD27F9A7B20038199F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
37FF8BFE27F9A7BA0038199F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
37FF8BFF27F9A7BC0038199F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
@@ -1968,6 +1996,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 37A3B17427255E7F000FB5EE /* Build configuration list for PBXNativeTarget "Open in Yattee (macOS)" */;
buildPhases = (
37FF8BFF27F9A7BC0038199F /* Headers */,
37A3B15327255E7F000FB5EE /* Sources */,
37A3B15427255E7F000FB5EE /* Frameworks */,
37A3B15527255E7F000FB5EE /* Resources */,
@@ -1985,6 +2014,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 37A3B1902725735F000FB5EE /* Build configuration list for PBXNativeTarget "Open in Yattee (iOS)" */;
buildPhases = (
37FF8BFE27F9A7BA0038199F /* Headers */,
37A3B1752725735F000FB5EE /* Sources */,
37A3B1762725735F000FB5EE /* Frameworks */,
37A3B1772725735F000FB5EE /* Resources */,
@@ -2034,6 +2064,7 @@
buildConfigurationList = 37D4B0EF2671614900C925CA /* Build configuration list for PBXNativeTarget "Yattee (macOS)" */;
buildPhases = (
37CC3F4A270CE8D000608308 /* ShellScript */,
37FF8BFC27F9A7AD0038199F /* Headers */,
37D4B0CB2671614900C925CA /* Sources */,
37D4B0CC2671614900C925CA /* Frameworks */,
37D4B0CD2671614900C925CA /* Resources */,
@@ -2108,6 +2139,7 @@
buildConfigurationList = 37D4B177267164B000C925CA /* Build configuration list for PBXNativeTarget "Yattee (tvOS)" */;
buildPhases = (
37CC3F49270CE8CA00608308 /* ShellScript */,
37FF8BFD27F9A7B20038199F /* Headers */,
37D4B154267164AE00C925CA /* Sources */,
37D4B155267164AE00C925CA /* Frameworks */,
37D4B156267164AE00C925CA /* Resources */,
@@ -3057,7 +3089,7 @@
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -3070,7 +3102,7 @@
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.4.alpha.1;
MARKETING_VERSION = 1.4.alpha.3;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
@@ -3091,7 +3123,7 @@
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -3104,7 +3136,7 @@
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.4.alpha.1;
MARKETING_VERSION = 1.4.alpha.3;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
@@ -3123,7 +3155,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
@@ -3135,7 +3167,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.4.alpha.1;
MARKETING_VERSION = 1.4.alpha.3;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
@@ -3155,7 +3187,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
@@ -3167,7 +3199,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.4.alpha.1;
MARKETING_VERSION = 1.4.alpha.3;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
@@ -3319,7 +3351,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
@@ -3343,7 +3375,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Vendor/mpv/iOS/lib",
);
MARKETING_VERSION = 1.4.alpha.2;
MARKETING_VERSION = 1.4.alpha.3;
OTHER_LDFLAGS = "-lstdc++";
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app.alpha;
PRODUCT_NAME = Yattee;
@@ -3361,7 +3393,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
@@ -3381,7 +3413,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Vendor/mpv/iOS/lib",
);
MARKETING_VERSION = 1.4.alpha.2;
MARKETING_VERSION = 1.4.alpha.3;
OTHER_LDFLAGS = "-lstdc++";
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app.alpha;
PRODUCT_NAME = Yattee;
@@ -3403,7 +3435,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
@@ -3422,7 +3454,7 @@
"$(PROJECT_DIR)/Vendor/mpv/macOS/lib",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.4.alpha.2;
MARKETING_VERSION = 1.4.alpha.3;
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
PRODUCT_NAME = Yattee;
SDKROOT = macosx;
@@ -3441,7 +3473,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_TEAM = "";
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
@@ -3460,7 +3492,7 @@
"$(PROJECT_DIR)/Vendor/mpv/macOS/lib",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.4.alpha.2;
MARKETING_VERSION = 1.4.alpha.3;
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
PRODUCT_NAME = Yattee;
SDKROOT = macosx;
@@ -3577,7 +3609,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
@@ -3597,7 +3629,7 @@
"$(PROJECT_DIR)/Vendor/mpv",
"$(PROJECT_DIR)/Vendor/mpv/tvOS",
);
MARKETING_VERSION = 1.4.alpha.2;
MARKETING_VERSION = 1.4.alpha.3;
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app.alpha;
PRODUCT_NAME = Yattee;
SDKROOT = appletvos;
@@ -3615,7 +3647,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 31;
CURRENT_PROJECT_VERSION = 32;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = "";
ENABLE_PREVIEWS = YES;
@@ -3635,7 +3667,7 @@
"$(PROJECT_DIR)/Vendor/mpv",
"$(PROJECT_DIR)/Vendor/mpv/tvOS",
);
MARKETING_VERSION = 1.4.alpha.2;
MARKETING_VERSION = 1.4.alpha.3;
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app.alpha;
PRODUCT_NAME = Yattee;
SDKROOT = appletvos;

View File

@@ -0,0 +1,131 @@
{
"pins" : [
{
"identity" : "alamofire",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Alamofire/Alamofire.git",
"state" : {
"revision" : "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864",
"version" : "5.5.0"
}
},
{
"identity" : "defaults",
"kind" : "remoteSourceControl",
"location" : "https://github.com/sindresorhus/Defaults",
"state" : {
"revision" : "119f654d44f7b90f00dc11f7dd1c94a36f12576b",
"version" : "6.2.1"
}
},
{
"identity" : "libwebp-xcode",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/libwebp-Xcode.git",
"state" : {
"revision" : "2b3b43faaef54d1b897482428428357b7f7cd08b",
"version" : "1.2.1"
}
},
{
"identity" : "pincache",
"kind" : "remoteSourceControl",
"location" : "https://github.com/pinterest/PINCache",
"state" : {
"branch" : "master",
"revision" : "9ca06045b5aff12ee8c0ef5880aa8469c4896144"
}
},
{
"identity" : "pinoperation",
"kind" : "remoteSourceControl",
"location" : "https://github.com/pinterest/PINOperation.git",
"state" : {
"revision" : "44d8ca154a4e75a028a5548c31ff3a53b90cef15",
"version" : "1.2.1"
}
},
{
"identity" : "sdwebimage",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImage.git",
"state" : {
"revision" : "2e63d0061da449ad0ed130768d05dceb1496de44",
"version" : "5.12.5"
}
},
{
"identity" : "sdwebimagepinplugin",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImagePINPlugin.git",
"state" : {
"revision" : "bd73a4fb30352ec311303d811559c9c46df4caa4",
"version" : "0.3.0"
}
},
{
"identity" : "sdwebimageswiftui",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git",
"state" : {
"revision" : "cd8625b7cf11a97698e180d28bb7d5d357196678",
"version" : "2.0.2"
}
},
{
"identity" : "sdwebimagewebpcoder",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImageWebPCoder.git",
"state" : {
"revision" : "95a6838df13bc08d8064cf7e048b787b6e52348d",
"version" : "0.8.4"
}
},
{
"identity" : "siesta",
"kind" : "remoteSourceControl",
"location" : "https://github.com/bustoutsolutions/siesta",
"state" : {
"revision" : "43f34046ebb5beb6802200353c473af303bbc31e",
"version" : "1.5.2"
}
},
{
"identity" : "sparkle",
"kind" : "remoteSourceControl",
"location" : "https://github.com/sparkle-project/Sparkle",
"state" : {
"branch" : "2.x",
"revision" : "f250bead4b943ef9711c61274a1f52e380afa0e8"
}
},
{
"identity" : "swift-log",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-log.git",
"state" : {
"revision" : "5d66f7ba25daf4f94100e7022febf3c75e37a6c7",
"version" : "1.4.2"
}
},
{
"identity" : "swiftui-introspect",
"kind" : "remoteSourceControl",
"location" : "https://github.com/siteline/SwiftUI-Introspect.git",
"state" : {
"revision" : "f2616860a41f9d9932da412a8978fec79c06fe24",
"version" : "0.1.4"
}
},
{
"identity" : "swiftyjson",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SwiftyJSON/SwiftyJSON.git",
"state" : {
"revision" : "b3dcd7dbd0d488e1a7077cb33b00f2083e382f07",
"version" : "5.0.1"
}
}
],
"version" : 2
}

View File

@@ -42,6 +42,10 @@ enum Windows: String, CaseIterable {
Self.main.focus()
}
}
func toggleFullScreen() {
window?.toggleFullScreen(nil)
}
}
struct HostingWindowFinder: NSViewRepresentable {