mirror of
https://github.com/yattee/yattee.git
synced 2025-12-13 11:38:15 +00:00
Compare commits
7 Commits
v1.3-beta.
...
v1.3-beta.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a9ccd6b0f2 | ||
|
|
76273a4724 | ||
|
|
8370714b61 | ||
|
|
d096fdb344 | ||
|
|
5b12dbcb1e | ||
|
|
d1ed896166 | ||
|
|
3630cd404d |
@@ -20,13 +20,47 @@ final class SponsorBlockAPI: ObservableObject {
|
|||||||
switch name {
|
switch name {
|
||||||
case "selfpromo":
|
case "selfpromo":
|
||||||
return "Self-promotion"
|
return "Self-promotion"
|
||||||
|
|
||||||
case "music_offtopic":
|
case "music_offtopic":
|
||||||
return "Offtopic in Music Videos"
|
return "Offtopic in Music Videos"
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return name.capitalized
|
return name.capitalized
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func categoryDetails(_ name: String) -> String? {
|
||||||
|
guard SponsorBlockAPI.categories.contains(name) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
switch name {
|
||||||
|
case "sponsor":
|
||||||
|
return "Part of a video promoting a product or service not directly related to the creator. " +
|
||||||
|
"The creator will receive payment or compensation in the form of money or free products."
|
||||||
|
|
||||||
|
case "selfpromo":
|
||||||
|
return "Promoting a product or service that is directly related to the creator themselves. " +
|
||||||
|
"This usually includes merchandise or promotion of monetized platforms."
|
||||||
|
|
||||||
|
case "intro":
|
||||||
|
return "Segments typically found at the start of a video that include an animation, " +
|
||||||
|
"still frame or clip which are also seen in other videos by the same creator."
|
||||||
|
|
||||||
|
case "outro":
|
||||||
|
return "Typically near or at the end of the video when the credits pop up and/or endcards are shown."
|
||||||
|
|
||||||
|
case "interaction":
|
||||||
|
return "Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)."
|
||||||
|
|
||||||
|
case "music_offtopic":
|
||||||
|
return "For videos which feature music as the primary content."
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func loadSegments(videoID: String, categories: Set<String>, completionHandler: @escaping () -> Void = {}) {
|
func loadSegments(videoID: String, categories: Set<String>, completionHandler: @escaping () -> Void = {}) {
|
||||||
guard !skipSegmentsURL.isNil, self.videoID != videoID else {
|
guard !skipSegmentsURL.isNil, self.videoID != videoID else {
|
||||||
completionHandler()
|
completionHandler()
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ extension Defaults.Keys {
|
|||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
static let honorSystemOrientationLock = Key<Bool>("honorSystemOrientationLock", default: true)
|
static let honorSystemOrientationLock = Key<Bool>("honorSystemOrientationLock", default: true)
|
||||||
static let enterFullscreenInLandscape = Key<Bool>("enterFullscreenInLandscape", default: UIDevice.current.userInterfaceIdiom == .phone)
|
static let enterFullscreenInLandscape = Key<Bool>("enterFullscreenInLandscape", default: UIDevice.current.userInterfaceIdiom == .phone)
|
||||||
|
static let lockLandscapeOnRotation = Key<Bool>("lockLandscapeOnRotation", default: false)
|
||||||
static let lockLandscapeWhenEnteringFullscreen = Key<Bool>("lockLandscapeWhenEnteringFullscreen", default: false)
|
static let lockLandscapeWhenEnteringFullscreen = Key<Bool>("lockLandscapeWhenEnteringFullscreen", default: false)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,6 +127,9 @@ extension PlayerViewController: AVPlayerViewControllerDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func playerViewControllerWillBeginDismissalTransition(_: AVPlayerViewController) {
|
func playerViewControllerWillBeginDismissalTransition(_: AVPlayerViewController) {
|
||||||
|
if Defaults[.pauseOnHidingPlayer] {
|
||||||
|
playerModel.pause()
|
||||||
|
}
|
||||||
dismiss(animated: false)
|
dismiss(animated: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,9 +137,15 @@ extension PlayerViewController: AVPlayerViewControllerDelegate {
|
|||||||
|
|
||||||
func playerViewController(
|
func playerViewController(
|
||||||
_: AVPlayerViewController,
|
_: AVPlayerViewController,
|
||||||
willBeginFullScreenPresentationWithAnimationCoordinator _: UIViewControllerTransitionCoordinator
|
willBeginFullScreenPresentationWithAnimationCoordinator context: UIViewControllerTransitionCoordinator
|
||||||
) {
|
) {
|
||||||
playerModel.playingFullscreen = true
|
playerModel.playingFullscreen = true
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
if !context.isCancelled, Defaults[.lockLandscapeWhenEnteringFullscreen] {
|
||||||
|
Orientation.lockOrientation(.landscape, andRotateTo: UIDevice.current.orientation.isLandscape ? nil : .landscapeRight)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
func playerViewController(
|
func playerViewController(
|
||||||
|
|||||||
@@ -28,13 +28,11 @@ struct VideoPlayerView: View {
|
|||||||
|
|
||||||
@Default(.enterFullscreenInLandscape) private var enterFullscreenInLandscape
|
@Default(.enterFullscreenInLandscape) private var enterFullscreenInLandscape
|
||||||
@Default(.honorSystemOrientationLock) private var honorSystemOrientationLock
|
@Default(.honorSystemOrientationLock) private var honorSystemOrientationLock
|
||||||
@Default(.lockLandscapeWhenEnteringFullscreen) private var lockLandscapeWhenEnteringFullscreen
|
@Default(.lockLandscapeOnRotation) private var lockLandscapeOnRotation
|
||||||
|
|
||||||
@State private var motionManager: CMMotionManager!
|
@State private var motionManager: CMMotionManager!
|
||||||
@State private var orientation = UIInterfaceOrientation.portrait
|
@State private var orientation = UIInterfaceOrientation.portrait
|
||||||
@State private var lastOrientation: UIInterfaceOrientation?
|
@State private var lastOrientation: UIInterfaceOrientation?
|
||||||
|
|
||||||
private var orientationThrottle = Throttle(interval: 2)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@EnvironmentObject<AccountsModel> private var accounts
|
@EnvironmentObject<AccountsModel> private var accounts
|
||||||
@@ -140,7 +138,11 @@ struct VideoPlayerView: View {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
.background(colorScheme == .dark ? Color.black : Color.white)
|
.background(colorScheme == .dark ? Color.black : Color.white)
|
||||||
.modifier(VideoDetailsPaddingModifier(geometry: geometry, aspectRatio: player.controller?.aspectRatio, fullScreen: fullScreenDetails))
|
.modifier(VideoDetailsPaddingModifier(
|
||||||
|
geometry: geometry,
|
||||||
|
aspectRatio: player.controller?.aspectRatio,
|
||||||
|
fullScreen: fullScreenDetails
|
||||||
|
))
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -231,7 +233,11 @@ struct VideoPlayerView: View {
|
|||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
private func configureOrientationUpdatesBasedOnAccelerometer() {
|
private func configureOrientationUpdatesBasedOnAccelerometer() {
|
||||||
if UIDevice.current.orientation.isLandscape, enterFullscreenInLandscape, !player.playingFullscreen {
|
if UIDevice.current.orientation.isLandscape,
|
||||||
|
enterFullscreenInLandscape,
|
||||||
|
!player.playingFullscreen,
|
||||||
|
!player.playingInPictureInPicture
|
||||||
|
{
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
player.enterFullScreen()
|
player.enterFullScreen()
|
||||||
}
|
}
|
||||||
@@ -244,7 +250,7 @@ struct VideoPlayerView: View {
|
|||||||
motionManager = CMMotionManager()
|
motionManager = CMMotionManager()
|
||||||
motionManager.accelerometerUpdateInterval = 0.2
|
motionManager.accelerometerUpdateInterval = 0.2
|
||||||
motionManager.startAccelerometerUpdates(to: OperationQueue()) { data, _ in
|
motionManager.startAccelerometerUpdates(to: OperationQueue()) { data, _ in
|
||||||
guard player.presentingPlayer, !data.isNil else {
|
guard player.presentingPlayer, !player.playingInPictureInPicture, !data.isNil else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,11 +284,12 @@ struct VideoPlayerView: View {
|
|||||||
|
|
||||||
player.enterFullScreen()
|
player.enterFullScreen()
|
||||||
|
|
||||||
let orientationLockMask = orientation == .landscapeLeft ? UIInterfaceOrientationMask.landscapeLeft : .landscapeRight
|
let orientationLockMask = orientation == .landscapeLeft ?
|
||||||
|
UIInterfaceOrientationMask.landscapeLeft : .landscapeRight
|
||||||
|
|
||||||
Orientation.lockOrientation(orientationLockMask, andRotateTo: orientation)
|
Orientation.lockOrientation(orientationLockMask, andRotateTo: orientation)
|
||||||
|
|
||||||
guard lockLandscapeWhenEnteringFullscreen else {
|
guard lockLandscapeOnRotation else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,7 +314,11 @@ struct VideoPlayerView: View {
|
|||||||
|
|
||||||
private func handleOrientationDidChangeNotification() {
|
private func handleOrientationDidChangeNotification() {
|
||||||
let newOrientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
|
let newOrientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
|
||||||
if newOrientation?.isLandscape ?? false, player.presentingPlayer, lockLandscapeWhenEnteringFullscreen, !player.lockedOrientation.isNil {
|
if newOrientation?.isLandscape ?? false,
|
||||||
|
player.presentingPlayer,
|
||||||
|
lockLandscapeOnRotation,
|
||||||
|
!player.lockedOrientation.isNil
|
||||||
|
{
|
||||||
Orientation.lockOrientation(.landscape, andRotateTo: newOrientation)
|
Orientation.lockOrientation(.landscape, andRotateTo: newOrientation)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,8 +18,9 @@ struct PlayerSettings: View {
|
|||||||
@Default(.pauseOnHidingPlayer) private var pauseOnHidingPlayer
|
@Default(.pauseOnHidingPlayer) private var pauseOnHidingPlayer
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
@Default(.honorSystemOrientationLock) private var honorSystemOrientationLock
|
@Default(.honorSystemOrientationLock) private var honorSystemOrientationLock
|
||||||
@Default(.lockLandscapeWhenEnteringFullscreen) private var lockLandscapeWhenEnteringFullscreen
|
@Default(.lockLandscapeOnRotation) private var lockLandscapeOnRotation
|
||||||
@Default(.enterFullscreenInLandscape) private var enterFullscreenInLandscape
|
@Default(.enterFullscreenInLandscape) private var enterFullscreenInLandscape
|
||||||
|
@Default(.lockLandscapeWhenEnteringFullscreen) private var lockLandscapeWhenEnteringFullscreen
|
||||||
#endif
|
#endif
|
||||||
@Default(.closePiPOnNavigation) private var closePiPOnNavigation
|
@Default(.closePiPOnNavigation) private var closePiPOnNavigation
|
||||||
@Default(.closePiPOnOpeningPlayer) private var closePiPOnOpeningPlayer
|
@Default(.closePiPOnOpeningPlayer) private var closePiPOnOpeningPlayer
|
||||||
@@ -85,16 +86,6 @@ struct PlayerSettings: View {
|
|||||||
channelSubscribersToggle
|
channelSubscribersToggle
|
||||||
}
|
}
|
||||||
|
|
||||||
#if os(iOS)
|
|
||||||
Section(header: SettingsHeader(text: "Orientation")) {
|
|
||||||
if idiom == .pad {
|
|
||||||
enterFullscreenInLandscapeToggle
|
|
||||||
}
|
|
||||||
honorSystemOrientationLockToggle
|
|
||||||
lockLandscapeWhenEnteringFullscreenToggle
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Section(header: SettingsHeader(text: "Picture in Picture")) {
|
Section(header: SettingsHeader(text: "Picture in Picture")) {
|
||||||
closePiPOnNavigationToggle
|
closePiPOnNavigationToggle
|
||||||
closePiPOnOpeningPlayerToggle
|
closePiPOnOpeningPlayerToggle
|
||||||
@@ -102,6 +93,17 @@ struct PlayerSettings: View {
|
|||||||
closePiPAndOpenPlayerOnEnteringForegroundToggle
|
closePiPAndOpenPlayerOnEnteringForegroundToggle
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
Section(header: SettingsHeader(text: "Orientation"), footer: orientationFooter) {
|
||||||
|
if idiom == .pad {
|
||||||
|
enterFullscreenInLandscapeToggle
|
||||||
|
}
|
||||||
|
honorSystemOrientationLockToggle
|
||||||
|
lockLandscapeOnRotationToggle
|
||||||
|
lockLandscapeWhenEnteringFullscreenToggle
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,10 +214,18 @@ struct PlayerSettings: View {
|
|||||||
Toggle("Enter fullscreen in landscape", isOn: $enterFullscreenInLandscape)
|
Toggle("Enter fullscreen in landscape", isOn: $enterFullscreenInLandscape)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var lockLandscapeWhenEnteringFullscreenToggle: some View {
|
private var lockLandscapeOnRotationToggle: some View {
|
||||||
Toggle("Lock landscape on rotation", isOn: $lockLandscapeWhenEnteringFullscreen)
|
Toggle("Lock landscape on rotation", isOn: $lockLandscapeOnRotation)
|
||||||
.disabled(!enterFullscreenInLandscape)
|
.disabled(!enterFullscreenInLandscape)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var lockLandscapeWhenEnteringFullscreenToggle: some View {
|
||||||
|
Toggle("Rotate and lock landscape on entering fullscreen", isOn: $lockLandscapeWhenEnteringFullscreen)
|
||||||
|
}
|
||||||
|
|
||||||
|
private var orientationFooter: some View {
|
||||||
|
Text("Orientation settings are experimental and do not yet work properly with all devices and iOS versions")
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private var closePiPOnNavigationToggle: some View {
|
private var closePiPOnNavigationToggle: some View {
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ struct SettingsView: View {
|
|||||||
case .history:
|
case .history:
|
||||||
return 480
|
return 480
|
||||||
case .sponsorBlock:
|
case .sponsorBlock:
|
||||||
return 290
|
return 660
|
||||||
case .updates:
|
case .updates:
|
||||||
return 200
|
return 200
|
||||||
case .help:
|
case .help:
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ struct SponsorBlockSettings: View {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Section(header: SettingsHeader(text: "Categories to Skip")) {
|
Section(header: SettingsHeader(text: "Categories to Skip"), footer: categoriesDetails) {
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
let list = ForEach(SponsorBlockAPI.categories, id: \.self) { category in
|
let list = ForEach(SponsorBlockAPI.categories, id: \.self) { category in
|
||||||
SponsorBlockCategorySelectionRow(
|
SponsorBlockCategorySelectionRow(
|
||||||
@@ -74,6 +74,24 @@ struct SponsorBlockSettings: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var categoriesDetails: some View {
|
||||||
|
VStack(alignment: .leading) {
|
||||||
|
ForEach(SponsorBlockAPI.categories, id: \.self) { category in
|
||||||
|
Text(SponsorBlockAPI.categoryDescription(category) ?? "Category")
|
||||||
|
.fontWeight(.bold)
|
||||||
|
#if os(tvOS)
|
||||||
|
.focusable()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Text(SponsorBlockAPI.categoryDetails(category) ?? "Details")
|
||||||
|
.padding(.bottom, 3)
|
||||||
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
.padding(.top, 3)
|
||||||
|
}
|
||||||
|
|
||||||
func toggleCategory(_ category: String, value: Bool) {
|
func toggleCategory(_ category: String, value: Bool) {
|
||||||
if let index = sponsorBlockCategories.firstIndex(where: { $0 == category }), !value {
|
if let index = sponsorBlockCategories.firstIndex(where: { $0 == category }), !value {
|
||||||
sponsorBlockCategories.remove(at: index)
|
sponsorBlockCategories.remove(at: index)
|
||||||
@@ -123,7 +141,7 @@ struct SponsorBlockSettings: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ServicesSettings_Previews: PreviewProvider {
|
struct SponsorBlockSettings_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack {
|
||||||
SponsorBlockSettings()
|
SponsorBlockSettings()
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ struct TrendingView: View {
|
|||||||
resource.load()
|
resource.load()
|
||||||
}
|
}
|
||||||
.keyboardShortcut("r")
|
.keyboardShortcut("r")
|
||||||
|
.opacity(0)
|
||||||
)
|
)
|
||||||
.navigationTitle("Trending")
|
.navigationTitle("Trending")
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import Defaults
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct DetailBadge: View {
|
struct DetailBadge: View {
|
||||||
@@ -82,12 +83,17 @@ struct DetailBadge: View {
|
|||||||
var text: String
|
var text: String
|
||||||
var style: Style = .default
|
var style: Style = .default
|
||||||
|
|
||||||
|
@Default(.roundedThumbnails) private var roundedThumbnails
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Text(text)
|
Text(text)
|
||||||
.truncationMode(.middle)
|
.truncationMode(.middle)
|
||||||
.padding(10)
|
.padding(4)
|
||||||
|
#if os(tvOS)
|
||||||
|
.padding(.horizontal, 5)
|
||||||
|
#endif
|
||||||
.modifier(StyleModifier(style: style))
|
.modifier(StyleModifier(style: style))
|
||||||
.mask(RoundedRectangle(cornerRadius: 12))
|
.mask(RoundedRectangle(cornerRadius: roundedThumbnails ? 6 : 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ struct PopularView: View {
|
|||||||
resource?.load()
|
resource?.load()
|
||||||
}
|
}
|
||||||
.keyboardShortcut("r")
|
.keyboardShortcut("r")
|
||||||
|
.opacity(0)
|
||||||
)
|
)
|
||||||
#endif
|
#endif
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ struct SubscriptionsView: View {
|
|||||||
loadResources(force: true)
|
loadResources(force: true)
|
||||||
}
|
}
|
||||||
.keyboardShortcut("r")
|
.keyboardShortcut("r")
|
||||||
|
.opacity(0)
|
||||||
)
|
)
|
||||||
#endif
|
#endif
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
|
|||||||
@@ -2458,7 +2458,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
|
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 13;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -2492,7 +2492,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
|
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 13;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -2524,7 +2524,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 13;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||||
@@ -2556,7 +2556,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 13;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
INFOPLIST_FILE = "Open in Yattee/Info.plist";
|
||||||
@@ -2719,14 +2719,14 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 14;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = iOS/Info.plist;
|
INFOPLIST_FILE = iOS/Info.plist;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UIRequiresFullScreen = NO;
|
INFOPLIST_KEY_UIRequiresFullScreen = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
@@ -2751,14 +2751,14 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 14;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = iOS/Info.plist;
|
INFOPLIST_FILE = iOS/Info.plist;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UIRequiresFullScreen = NO;
|
INFOPLIST_KEY_UIRequiresFullScreen = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||||
@@ -2787,7 +2787,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 14;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_APP_SANDBOX = YES;
|
ENABLE_APP_SANDBOX = YES;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -2820,7 +2820,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 14;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_APP_SANDBOX = YES;
|
ENABLE_APP_SANDBOX = YES;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -2951,7 +2951,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 14;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -2983,7 +2983,7 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 14;
|
CURRENT_PROJECT_VERSION = 15;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ struct NowPlayingView: View {
|
|||||||
@EnvironmentObject<RecentsModel> private var recents
|
@EnvironmentObject<RecentsModel> private var recents
|
||||||
|
|
||||||
@Default(.saveHistory) private var saveHistory
|
@Default(.saveHistory) private var saveHistory
|
||||||
|
@Default(.showHistoryInPlayer) private var showHistoryInPlayer
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
if inInfoViewController {
|
if inInfoViewController {
|
||||||
@@ -102,7 +103,7 @@ struct NowPlayingView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if sections.contains(.playedPreviously), saveHistory, !visibleWatches.isEmpty {
|
if sections.contains(.playedPreviously), saveHistory, showHistoryInPlayer, !visibleWatches.isEmpty {
|
||||||
Section(header: Text("Played Previously")) {
|
Section(header: Text("Played Previously")) {
|
||||||
ForEach(visibleWatches, id: \.videoID) { watch in
|
ForEach(visibleWatches, id: \.videoID) { watch in
|
||||||
Button {
|
Button {
|
||||||
|
|||||||
Reference in New Issue
Block a user