Cleanup and UDPBroadcastConnection Package (#765)
This commit is contained in:
parent
bfccb04deb
commit
2a51598004
1
Cartfile
1
Cartfile
|
@ -1,4 +1,3 @@
|
||||||
binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/MobileVLCKit.json" ~> 3.4.0
|
binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/MobileVLCKit.json" ~> 3.4.0
|
||||||
binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/TVVLCKit.json" ~> 3.3.0
|
binary "https://code.videolan.org/videolan/VLCKit/raw/master/Packaging/TVVLCKit.json" ~> 3.3.0
|
||||||
github "gunterhager/UDPBroadcastConnection"
|
|
||||||
binary "ChromeCastFramework.json"
|
binary "ChromeCastFramework.json"
|
|
@ -8,25 +8,77 @@
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
// TODO: Allow optional binding
|
struct EnumPicker<EnumType: CaseIterable & Displayable & Hashable>: View {
|
||||||
|
|
||||||
struct EnumPicker<EnumType: CaseIterable & Displayable & Hashable & RawRepresentable>: View {
|
enum NoneStyle: Displayable {
|
||||||
|
|
||||||
|
case text
|
||||||
|
case dash(Int)
|
||||||
|
case custom(String)
|
||||||
|
|
||||||
|
var displayTitle: String {
|
||||||
|
switch self {
|
||||||
|
case .text:
|
||||||
|
return L10n.none
|
||||||
|
case let .dash(length):
|
||||||
|
precondition(length >= 1, "Dash must have length of at least 1.")
|
||||||
|
return String(repeating: "-", count: length)
|
||||||
|
case let .custom(text):
|
||||||
|
precondition(!text.isEmpty, "Custom text must have length of at least 1.")
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Binding
|
@Binding
|
||||||
var selection: EnumType
|
private var selection: EnumType?
|
||||||
|
|
||||||
let title: String
|
private let title: String
|
||||||
|
private let hasNil: Bool
|
||||||
init(title: String, selection: Binding<EnumType>) {
|
private var noneStyle: NoneStyle
|
||||||
self.title = title
|
|
||||||
self._selection = selection
|
|
||||||
}
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Picker(title, selection: $selection) {
|
Picker(title, selection: $selection) {
|
||||||
|
|
||||||
|
if hasNil {
|
||||||
|
Text(noneStyle.displayTitle)
|
||||||
|
.tag(nil as EnumType?)
|
||||||
|
}
|
||||||
|
|
||||||
ForEach(EnumType.allCases.asArray, id: \.hashValue) {
|
ForEach(EnumType.allCases.asArray, id: \.hashValue) {
|
||||||
Text($0.displayTitle).tag($0)
|
Text($0.displayTitle)
|
||||||
|
.tag($0 as EnumType?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension EnumPicker {
|
||||||
|
|
||||||
|
init(title: String, selection: Binding<EnumType?>) {
|
||||||
|
self.title = title
|
||||||
|
self._selection = selection
|
||||||
|
self.hasNil = true
|
||||||
|
self.noneStyle = .text
|
||||||
|
}
|
||||||
|
|
||||||
|
init(title: String, selection: Binding<EnumType>) {
|
||||||
|
self.title = title
|
||||||
|
|
||||||
|
let binding = Binding<EnumType?> {
|
||||||
|
selection.wrappedValue
|
||||||
|
} set: { newValue, _ in
|
||||||
|
assert(newValue != nil, "Should not have nil new value with non-optional binding")
|
||||||
|
selection.wrappedValue = newValue!
|
||||||
|
}
|
||||||
|
|
||||||
|
self._selection = binding
|
||||||
|
|
||||||
|
self.hasNil = false
|
||||||
|
self.noneStyle = .text
|
||||||
|
}
|
||||||
|
|
||||||
|
func noneStyle(_ newStyle: NoneStyle) -> Self {
|
||||||
|
copy(modifying: \.noneStyle, with: newStyle)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
import Defaults
|
import Defaults
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
// TODO: look at optional values for defaults to remove .none
|
// Optional values aren't yet supported in Defaults
|
||||||
|
// https://github.com/sindresorhus/Defaults/issues/54
|
||||||
|
|
||||||
protocol GestureAction: CaseIterable, Codable, Defaults.Serializable, Displayable {}
|
protocol GestureAction: CaseIterable, Codable, Defaults.Serializable, Displayable {}
|
||||||
|
|
||||||
|
|
|
@ -9,19 +9,6 @@
|
||||||
import Foundation
|
import Foundation
|
||||||
import JellyfinAPI
|
import JellyfinAPI
|
||||||
|
|
||||||
// enum SpecialFeatureType: String, CaseIterable, Displayable {
|
|
||||||
//
|
|
||||||
// case unknown = "Unknown"
|
|
||||||
// case clip = "Clip"
|
|
||||||
// case trailer = "Trailer"
|
|
||||||
// case behindTheScenes = "BehindTheScenes"
|
|
||||||
// case deletedScene = "DeletedScene"
|
|
||||||
// case interview = "Interview"
|
|
||||||
// case scene = "Scene"
|
|
||||||
// case sample = "Sample"
|
|
||||||
// case themeSong = "ThemeSong"
|
|
||||||
// case themeVideo = "ThemeVideo"
|
|
||||||
|
|
||||||
extension SpecialFeatureType: Displayable {
|
extension SpecialFeatureType: Displayable {
|
||||||
|
|
||||||
// TODO: localize
|
// TODO: localize
|
||||||
|
|
|
@ -39,7 +39,7 @@ struct SelectorView<Item: Displayable & Identifiable>: View {
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
if selection.contains { $0.id == item.id } {
|
if selection.contains(where: { $0.id == item.id }) {
|
||||||
Image(systemName: "checkmark.circle.fill")
|
Image(systemName: "checkmark.circle.fill")
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|
|
@ -2,10 +2,6 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>UIUserInterfaceStyle</key>
|
|
||||||
<string>Dark</string>
|
|
||||||
<key>CFBundledisplayTitle</key>
|
|
||||||
<string>Jellyfin</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
|
@ -20,6 +16,8 @@
|
||||||
<string>$(MARKETING_VERSION)</string>
|
<string>$(MARKETING_VERSION)</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||||
|
<key>CFBundledisplayTitle</key>
|
||||||
|
<string>Jellyfin</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
|
@ -36,5 +34,7 @@
|
||||||
<array>
|
<array>
|
||||||
<string>arm64</string>
|
<string>arm64</string>
|
||||||
</array>
|
</array>
|
||||||
|
<key>UIUserInterfaceStyle</key>
|
||||||
|
<string>Dark</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
@ -51,12 +51,3 @@ extension ItemView.AboutView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ContentView_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
ItemView.AboutView.InformationCard(
|
|
||||||
title: "Subtitles",
|
|
||||||
content: "Fre - Default - PGSSUB"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -51,32 +51,3 @@ extension VideoPlayer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// struct VideoPlayerOverlay_Preview: PreviewProvider {
|
|
||||||
//
|
|
||||||
// static var previews: some View {
|
|
||||||
// ZStack {
|
|
||||||
//
|
|
||||||
// Color.red
|
|
||||||
//
|
|
||||||
// VideoPlayer.MainOverlay()
|
|
||||||
// .environmentObject(VideoPlayerManager())
|
|
||||||
// .environmentObject(VideoPlayerViewModel(
|
|
||||||
// playbackURL: URL(string: "http://apple.com")!,
|
|
||||||
// item: .init(indexNumber: 1, name: "Interstellar", parentIndexNumber: 1, seriesName: "New Girl", type: .episode),
|
|
||||||
// mediaSource: .init(),
|
|
||||||
// playSessionID: "",
|
|
||||||
// videoStreams: [],
|
|
||||||
// audioStreams: [],
|
|
||||||
// subtitleStreams: [],
|
|
||||||
// selectedAudioStreamIndex: 1,
|
|
||||||
// selectedSubtitleStreamIndex: 1,
|
|
||||||
// chapters: [],
|
|
||||||
// streamType: .direct)
|
|
||||||
// )
|
|
||||||
// .environmentObject(VideoPlayerManager.CurrentProgressHandler())
|
|
||||||
// .environmentObject(TimerProxy())
|
|
||||||
// }
|
|
||||||
// .ignoresSafeArea()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
|
@ -82,8 +82,6 @@
|
||||||
6220D0C026D61C5000B8E046 /* ItemCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0BF26D61C5000B8E046 /* ItemCoordinator.swift */; };
|
6220D0C026D61C5000B8E046 /* ItemCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0BF26D61C5000B8E046 /* ItemCoordinator.swift */; };
|
||||||
6220D0C926D63F3700B8E046 /* Stinsen in Frameworks */ = {isa = PBXBuildFile; productRef = 6220D0C826D63F3700B8E046 /* Stinsen */; };
|
6220D0C926D63F3700B8E046 /* Stinsen in Frameworks */ = {isa = PBXBuildFile; productRef = 6220D0C826D63F3700B8E046 /* Stinsen */; };
|
||||||
6220D0CC26D640C400B8E046 /* AppURLHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0CB26D640C400B8E046 /* AppURLHandler.swift */; };
|
6220D0CC26D640C400B8E046 /* AppURLHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6220D0CB26D640C400B8E046 /* AppURLHandler.swift */; };
|
||||||
62400C4B287ED19600F6AD3D /* UDPBroadcast.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; };
|
|
||||||
62400C4C287ED19600F6AD3D /* UDPBroadcast.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
|
||||||
625CB5732678C32A00530A6E /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5722678C32A00530A6E /* HomeViewModel.swift */; };
|
625CB5732678C32A00530A6E /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5722678C32A00530A6E /* HomeViewModel.swift */; };
|
||||||
625CB5752678C33500530A6E /* MediaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5742678C33500530A6E /* MediaViewModel.swift */; };
|
625CB5752678C33500530A6E /* MediaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5742678C33500530A6E /* MediaViewModel.swift */; };
|
||||||
625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5762678C34300530A6E /* ConnectToServerViewModel.swift */; };
|
625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625CB5762678C34300530A6E /* ConnectToServerViewModel.swift */; };
|
||||||
|
@ -447,6 +445,7 @@
|
||||||
E17FB55928C125E900311DFE /* StudiosHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E17FB55828C125E900311DFE /* StudiosHStack.swift */; };
|
E17FB55928C125E900311DFE /* StudiosHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E17FB55828C125E900311DFE /* StudiosHStack.swift */; };
|
||||||
E17FB55B28C1266400311DFE /* GenresHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E17FB55A28C1266400311DFE /* GenresHStack.swift */; };
|
E17FB55B28C1266400311DFE /* GenresHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E17FB55A28C1266400311DFE /* GenresHStack.swift */; };
|
||||||
E18295E429CAC6F100F91ED0 /* BasicNavigationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E154967D296CCB6C00C4EF88 /* BasicNavigationCoordinator.swift */; };
|
E18295E429CAC6F100F91ED0 /* BasicNavigationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E154967D296CCB6C00C4EF88 /* BasicNavigationCoordinator.swift */; };
|
||||||
|
E18443CB2A037773002DDDC8 /* UDPBroadcast in Frameworks */ = {isa = PBXBuildFile; productRef = E18443CA2A037773002DDDC8 /* UDPBroadcast */; };
|
||||||
E185920628CDAA6400326F80 /* CastAndCrewHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920528CDAA6400326F80 /* CastAndCrewHStack.swift */; };
|
E185920628CDAA6400326F80 /* CastAndCrewHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920528CDAA6400326F80 /* CastAndCrewHStack.swift */; };
|
||||||
E185920828CDAAA200326F80 /* SimilarItemsHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920728CDAAA200326F80 /* SimilarItemsHStack.swift */; };
|
E185920828CDAAA200326F80 /* SimilarItemsHStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920728CDAAA200326F80 /* SimilarItemsHStack.swift */; };
|
||||||
E185920A28CEF23A00326F80 /* FocusGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920928CEF23A00326F80 /* FocusGuide.swift */; };
|
E185920A28CEF23A00326F80 /* FocusGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = E185920928CEF23A00326F80 /* FocusGuide.swift */; };
|
||||||
|
@ -700,13 +699,12 @@
|
||||||
E1EBCB44278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB43278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift */; };
|
E1EBCB44278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB43278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift */; };
|
||||||
E1EBCB46278BD595009FE6E9 /* ItemOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB45278BD595009FE6E9 /* ItemOverviewView.swift */; };
|
E1EBCB46278BD595009FE6E9 /* ItemOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB45278BD595009FE6E9 /* ItemOverviewView.swift */; };
|
||||||
E1EBCB4A278BE443009FE6E9 /* ItemOverviewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB43278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift */; };
|
E1EBCB4A278BE443009FE6E9 /* ItemOverviewCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB43278BD1CE009FE6E9 /* ItemOverviewCoordinator.swift */; };
|
||||||
E1ECD8F528C1BA10008B9DC6 /* UDPBroadcast.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; };
|
|
||||||
E1ECD8F628C1BA10008B9DC6 /* UDPBroadcast.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 637FCAF3287B5B2600C0A353 /* UDPBroadcast.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
|
||||||
E1EF473A289A0F610034046B /* TruncatedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB41278BD174009FE6E9 /* TruncatedTextView.swift */; };
|
E1EF473A289A0F610034046B /* TruncatedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EBCB41278BD174009FE6E9 /* TruncatedTextView.swift */; };
|
||||||
E1EF4C412911B783008CC695 /* StreamType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EF4C402911B783008CC695 /* StreamType.swift */; };
|
E1EF4C412911B783008CC695 /* StreamType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1EF4C402911B783008CC695 /* StreamType.swift */; };
|
||||||
E1F0204E26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
|
E1F0204E26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
|
||||||
E1FA891B289A302300176FEB /* iPadOSCollectionItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA891A289A302300176FEB /* iPadOSCollectionItemView.swift */; };
|
E1FA891B289A302300176FEB /* iPadOSCollectionItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA891A289A302300176FEB /* iPadOSCollectionItemView.swift */; };
|
||||||
E1FA891E289A305D00176FEB /* iPadOSCollectionItemContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA891D289A305D00176FEB /* iPadOSCollectionItemContentView.swift */; };
|
E1FA891E289A305D00176FEB /* iPadOSCollectionItemContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FA891D289A305D00176FEB /* iPadOSCollectionItemContentView.swift */; };
|
||||||
|
E1FAD1C62A0375BA007F5521 /* UDPBroadcast in Frameworks */ = {isa = PBXBuildFile; productRef = E1FAD1C52A0375BA007F5521 /* UDPBroadcast */; };
|
||||||
E1FBDB6629D0F336003DD5E2 /* KeyCommandAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FBDB6529D0F336003DD5E2 /* KeyCommandAction.swift */; };
|
E1FBDB6629D0F336003DD5E2 /* KeyCommandAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FBDB6529D0F336003DD5E2 /* KeyCommandAction.swift */; };
|
||||||
E1FCD08826C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
|
E1FCD08826C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
|
||||||
E1FCD08926C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
|
E1FCD08926C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
|
||||||
|
@ -733,7 +731,6 @@
|
||||||
dstPath = "";
|
dstPath = "";
|
||||||
dstSubfolderSpec = 10;
|
dstSubfolderSpec = 10;
|
||||||
files = (
|
files = (
|
||||||
62400C4C287ED19600F6AD3D /* UDPBroadcast.xcframework in Embed Frameworks */,
|
|
||||||
62666DF827E5012C00EC0ECD /* MobileVLCKit.xcframework in Embed Frameworks */,
|
62666DF827E5012C00EC0ECD /* MobileVLCKit.xcframework in Embed Frameworks */,
|
||||||
);
|
);
|
||||||
name = "Embed Frameworks";
|
name = "Embed Frameworks";
|
||||||
|
@ -746,7 +743,6 @@
|
||||||
dstSubfolderSpec = 10;
|
dstSubfolderSpec = 10;
|
||||||
files = (
|
files = (
|
||||||
62666DFB27E5013700EC0ECD /* TVVLCKit.xcframework in Embed Frameworks */,
|
62666DFB27E5013700EC0ECD /* TVVLCKit.xcframework in Embed Frameworks */,
|
||||||
E1ECD8F628C1BA10008B9DC6 /* UDPBroadcast.xcframework in Embed Frameworks */,
|
|
||||||
);
|
);
|
||||||
name = "Embed Frameworks";
|
name = "Embed Frameworks";
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -1287,9 +1283,9 @@
|
||||||
E1388A46293F0ABA009721B1 /* SwizzleSwift in Frameworks */,
|
E1388A46293F0ABA009721B1 /* SwizzleSwift in Frameworks */,
|
||||||
62666E2C27E5021000EC0ECD /* QuartzCore.framework in Frameworks */,
|
62666E2C27E5021000EC0ECD /* QuartzCore.framework in Frameworks */,
|
||||||
62666E1927E501D000EC0ECD /* CoreFoundation.framework in Frameworks */,
|
62666E1927E501D000EC0ECD /* CoreFoundation.framework in Frameworks */,
|
||||||
|
E18443CB2A037773002DDDC8 /* UDPBroadcast in Frameworks */,
|
||||||
62666E2E27E5021400EC0ECD /* Security.framework in Frameworks */,
|
62666E2E27E5021400EC0ECD /* Security.framework in Frameworks */,
|
||||||
E1B5F7AD29577BDD004B26CF /* OrderedCollections in Frameworks */,
|
E1B5F7AD29577BDD004B26CF /* OrderedCollections in Frameworks */,
|
||||||
E1ECD8F528C1BA10008B9DC6 /* UDPBroadcast.xcframework in Frameworks */,
|
|
||||||
53ABFDDC267972BF00886593 /* TVServices.framework in Frameworks */,
|
53ABFDDC267972BF00886593 /* TVServices.framework in Frameworks */,
|
||||||
62666E1F27E501DF00EC0ECD /* CoreText.framework in Frameworks */,
|
62666E1F27E501DF00EC0ECD /* CoreText.framework in Frameworks */,
|
||||||
E13DD3CD27164CA7009D4DAF /* CoreStore in Frameworks */,
|
E13DD3CD27164CA7009D4DAF /* CoreStore in Frameworks */,
|
||||||
|
@ -1327,8 +1323,8 @@
|
||||||
62666E1027E501B400EC0ECD /* VideoToolbox.framework in Frameworks */,
|
62666E1027E501B400EC0ECD /* VideoToolbox.framework in Frameworks */,
|
||||||
62666E0C27E501A500EC0ECD /* OpenGLES.framework in Frameworks */,
|
62666E0C27E501A500EC0ECD /* OpenGLES.framework in Frameworks */,
|
||||||
E19E6E0A28A0BEFF005C10C8 /* BlurHashKit in Frameworks */,
|
E19E6E0A28A0BEFF005C10C8 /* BlurHashKit in Frameworks */,
|
||||||
|
E1FAD1C62A0375BA007F5521 /* UDPBroadcast in Frameworks */,
|
||||||
62666E0127E5016900EC0ECD /* CoreFoundation.framework in Frameworks */,
|
62666E0127E5016900EC0ECD /* CoreFoundation.framework in Frameworks */,
|
||||||
62400C4B287ED19600F6AD3D /* UDPBroadcast.xcframework in Frameworks */,
|
|
||||||
62666E2427E501F300EC0ECD /* Foundation.framework in Frameworks */,
|
62666E2427E501F300EC0ECD /* Foundation.framework in Frameworks */,
|
||||||
E18A8E7A28D5FEDF00333B9A /* VLCUI in Frameworks */,
|
E18A8E7A28D5FEDF00333B9A /* VLCUI in Frameworks */,
|
||||||
53352571265EA0A0006CCA86 /* Introspect in Frameworks */,
|
53352571265EA0A0006CCA86 /* Introspect in Frameworks */,
|
||||||
|
@ -2734,6 +2730,7 @@
|
||||||
E1B5F7AA29577BCE004B26CF /* PulseUI */,
|
E1B5F7AA29577BCE004B26CF /* PulseUI */,
|
||||||
E1B5F7AC29577BDD004B26CF /* OrderedCollections */,
|
E1B5F7AC29577BDD004B26CF /* OrderedCollections */,
|
||||||
E1DC981D296DD91900982F06 /* CollectionView */,
|
E1DC981D296DD91900982F06 /* CollectionView */,
|
||||||
|
E18443CA2A037773002DDDC8 /* UDPBroadcast */,
|
||||||
);
|
);
|
||||||
productName = "JellyfinPlayer tvOS";
|
productName = "JellyfinPlayer tvOS";
|
||||||
productReference = 535870602669D21600D05A09 /* Swiftfin tvOS.app */;
|
productReference = 535870602669D21600D05A09 /* Swiftfin tvOS.app */;
|
||||||
|
@ -2776,6 +2773,7 @@
|
||||||
E19DDEC62948EF9900954E10 /* OrderedCollections */,
|
E19DDEC62948EF9900954E10 /* OrderedCollections */,
|
||||||
E1DC9813296DC06200982F06 /* PulseLogHandler */,
|
E1DC9813296DC06200982F06 /* PulseLogHandler */,
|
||||||
E1DC9820296DDBE600982F06 /* CollectionView */,
|
E1DC9820296DDBE600982F06 /* CollectionView */,
|
||||||
|
E1FAD1C52A0375BA007F5521 /* UDPBroadcast */,
|
||||||
);
|
);
|
||||||
productName = JellyfinPlayer;
|
productName = JellyfinPlayer;
|
||||||
productReference = 5377CBF1263B596A003A4E83 /* Swiftfin iOS.app */;
|
productReference = 5377CBF1263B596A003A4E83 /* Swiftfin iOS.app */;
|
||||||
|
@ -2787,11 +2785,12 @@
|
||||||
5377CBE9263B596A003A4E83 /* Project object */ = {
|
5377CBE9263B596A003A4E83 /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
|
BuildIndependentTargetsInParallel = YES;
|
||||||
KnownAssetTags = (
|
KnownAssetTags = (
|
||||||
New,
|
New,
|
||||||
);
|
);
|
||||||
LastSwiftUpdateCheck = 1250;
|
LastSwiftUpdateCheck = 1250;
|
||||||
LastUpgradeCheck = 1400;
|
LastUpgradeCheck = 1430;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
5358705F2669D21600D05A09 = {
|
5358705F2669D21600D05A09 = {
|
||||||
CreatedOnToolsVersion = 12.5;
|
CreatedOnToolsVersion = 12.5;
|
||||||
|
@ -2842,6 +2841,7 @@
|
||||||
E19DDEC52948EF9900954E10 /* XCRemoteSwiftPackageReference "swift-collections" */,
|
E19DDEC52948EF9900954E10 /* XCRemoteSwiftPackageReference "swift-collections" */,
|
||||||
E1DC9812296DC06200982F06 /* XCRemoteSwiftPackageReference "PulseLogHandler" */,
|
E1DC9812296DC06200982F06 /* XCRemoteSwiftPackageReference "PulseLogHandler" */,
|
||||||
E1DC981F296DDBE600982F06 /* XCRemoteSwiftPackageReference "CollectionView" */,
|
E1DC981F296DDBE600982F06 /* XCRemoteSwiftPackageReference "CollectionView" */,
|
||||||
|
E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */,
|
||||||
);
|
);
|
||||||
productRefGroup = 5377CBF2263B596A003A4E83 /* Products */;
|
productRefGroup = 5377CBF2263B596A003A4E83 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
|
@ -3691,7 +3691,7 @@
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
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 = "";
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 70;
|
CURRENT_PROJECT_VERSION = 70;
|
||||||
|
@ -3720,7 +3720,7 @@
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
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 = "";
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 70;
|
CURRENT_PROJECT_VERSION = 70;
|
||||||
|
@ -3868,16 +3868,15 @@
|
||||||
5377CC1C263B596B003A4E83 /* Debug */ = {
|
5377CC1C263B596B003A4E83 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-primary-primary";
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-primary-primary";
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "";
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Swiftfin/Swiftfin.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Swiftfin/Swiftfin.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 78;
|
CURRENT_PROJECT_VERSION = 78;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = TY84JMYEFE;
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
EXCLUDED_ARCHS = "";
|
EXCLUDED_ARCHS = "";
|
||||||
|
@ -3891,7 +3890,7 @@
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.0;
|
MARKETING_VERSION = 1.0.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = pip.jellyfin.swiftfin;
|
PRODUCT_BUNDLE_IDENTIFIER = org.jellyfin.swiftfin;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SUPPORTS_MACCATALYST = NO;
|
SUPPORTS_MACCATALYST = NO;
|
||||||
|
@ -3906,9 +3905,8 @@
|
||||||
5377CC1D263B596B003A4E83 /* Release */ = {
|
5377CC1D263B596B003A4E83 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-primary-primary";
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-primary-primary";
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "";
|
||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Swiftfin/Swiftfin.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Swiftfin/Swiftfin.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
@ -3916,7 +3914,7 @@
|
||||||
CURRENT_PROJECT_VERSION = 78;
|
CURRENT_PROJECT_VERSION = 78;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = TY84JMYEFE;
|
DEVELOPMENT_TEAM = "";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
EXCLUDED_ARCHS = "";
|
EXCLUDED_ARCHS = "";
|
||||||
|
@ -3930,7 +3928,7 @@
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0.0;
|
MARKETING_VERSION = 1.0.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = pip.jellyfin.swiftfin;
|
PRODUCT_BUNDLE_IDENTIFIER = org.jellyfin.swiftfin;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SUPPORTS_MACCATALYST = NO;
|
SUPPORTS_MACCATALYST = NO;
|
||||||
|
@ -4110,6 +4108,14 @@
|
||||||
kind = branch;
|
kind = branch;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/gunterhager/UDPBroadcastConnection";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 5.0.0;
|
||||||
|
};
|
||||||
|
};
|
||||||
/* End XCRemoteSwiftPackageReference section */
|
/* End XCRemoteSwiftPackageReference section */
|
||||||
|
|
||||||
/* Begin XCSwiftPackageProductDependency section */
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
|
@ -4243,6 +4249,11 @@
|
||||||
package = E1575E3A293C6B15001665B1 /* XCRemoteSwiftPackageReference "Files" */;
|
package = E1575E3A293C6B15001665B1 /* XCRemoteSwiftPackageReference "Files" */;
|
||||||
productName = Files;
|
productName = Files;
|
||||||
};
|
};
|
||||||
|
E18443CA2A037773002DDDC8 /* UDPBroadcast */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */;
|
||||||
|
productName = UDPBroadcast;
|
||||||
|
};
|
||||||
E18A8E7928D5FEDF00333B9A /* VLCUI */ = {
|
E18A8E7928D5FEDF00333B9A /* VLCUI */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = E18A8E7828D5FEDF00333B9A /* XCRemoteSwiftPackageReference "VLCUI" */;
|
package = E18A8E7828D5FEDF00333B9A /* XCRemoteSwiftPackageReference "VLCUI" */;
|
||||||
|
@ -4317,6 +4328,11 @@
|
||||||
package = E1DC981F296DDBE600982F06 /* XCRemoteSwiftPackageReference "CollectionView" */;
|
package = E1DC981F296DDBE600982F06 /* XCRemoteSwiftPackageReference "CollectionView" */;
|
||||||
productName = CollectionView;
|
productName = CollectionView;
|
||||||
};
|
};
|
||||||
|
E1FAD1C52A0375BA007F5521 /* UDPBroadcast */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = E1FAD1C42A0375BA007F5521 /* XCRemoteSwiftPackageReference "UDPBroadcastConnection" */;
|
||||||
|
productName = UDPBroadcast;
|
||||||
|
};
|
||||||
/* End XCSwiftPackageProductDependency section */
|
/* End XCSwiftPackageProductDependency section */
|
||||||
};
|
};
|
||||||
rootObject = 5377CBE9263B596A003A4E83 /* Project object */;
|
rootObject = 5377CBE9263B596A003A4E83 /* Project object */;
|
||||||
|
|
|
@ -162,6 +162,15 @@
|
||||||
"version" : "1.0.0"
|
"version" : "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identity" : "udpbroadcastconnection",
|
||||||
|
"kind" : "remoteSourceControl",
|
||||||
|
"location" : "https://github.com/gunterhager/UDPBroadcastConnection",
|
||||||
|
"state" : {
|
||||||
|
"revision" : "3680f532c00d18a168bb8da7b9f8f82fcd89180d",
|
||||||
|
"version" : "5.0.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identity" : "urlqueryencoder",
|
"identity" : "urlqueryencoder",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1400"
|
LastUpgradeVersion = "1430"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1400"
|
LastUpgradeVersion = "1430"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct SwiftfinApp: App {
|
||||||
CoreStoreDefaults.dataStack = SwiftfinStore.dataStack
|
CoreStoreDefaults.dataStack = SwiftfinStore.dataStack
|
||||||
CoreStoreDefaults.logger = SwiftfinCorestoreLogger()
|
CoreStoreDefaults.logger = SwiftfinCorestoreLogger()
|
||||||
|
|
||||||
// Don't let the tab bar disappear when a new view is pushed
|
// Sometimes the tab bar won't appear properly on push, always have material background
|
||||||
UITabBar.appearance().scrollEdgeAppearance = UITabBarAppearance(idiom: .unspecified)
|
UITabBar.appearance().scrollEdgeAppearance = UITabBarAppearance(idiom: .unspecified)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,11 @@
|
||||||
import Defaults
|
import Defaults
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
// TODO: organize into a better structure
|
||||||
|
// TODO: add footer descriptions to each explaining the
|
||||||
|
// the gesture + why horizontal pan/swipe caveat
|
||||||
|
// TODO: add page describing each action?
|
||||||
|
|
||||||
struct GestureSettingsView: View {
|
struct GestureSettingsView: View {
|
||||||
|
|
||||||
@Default(.VideoPlayer.Gesture.horizontalPanGesture)
|
@Default(.VideoPlayer.Gesture.horizontalPanGesture)
|
||||||
|
|
Loading…
Reference in New Issue