51 prep
This commit is contained in:
parent
a12429ba46
commit
e1d2edfca4
|
@ -1002,7 +1002,7 @@
|
|||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_ENTITLEMENTS = "JellyfinPlayer tvOS/JellyfinPlayer tvOS.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 49;
|
||||
CURRENT_PROJECT_VERSION = 50;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer tvOS/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
|
@ -1030,7 +1030,7 @@
|
|||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CODE_SIGN_ENTITLEMENTS = "JellyfinPlayer tvOS/JellyfinPlayer tvOS.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 49;
|
||||
CURRENT_PROJECT_VERSION = 50;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer tvOS/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
|
@ -1179,7 +1179,7 @@
|
|||
CODE_SIGN_ENTITLEMENTS = JellyfinPlayer/JellyfinPlayer.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 49;
|
||||
CURRENT_PROJECT_VERSION = 50;
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||
ENABLE_BITCODE = NO;
|
||||
|
@ -1213,7 +1213,7 @@
|
|||
CODE_SIGN_ENTITLEMENTS = JellyfinPlayer/JellyfinPlayer.entitlements;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 49;
|
||||
CURRENT_PROJECT_VERSION = 50;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
DEVELOPMENT_ASSET_PATHS = "";
|
||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||
|
@ -1245,7 +1245,7 @@
|
|||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 49;
|
||||
CURRENT_PROJECT_VERSION = 50;
|
||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||
INFOPLIST_FILE = WidgetExtension/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
|
||||
|
@ -1270,7 +1270,7 @@
|
|||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 49;
|
||||
CURRENT_PROJECT_VERSION = 50;
|
||||
DEVELOPMENT_TEAM = 9R8RREG67J;
|
||||
INFOPLIST_FILE = WidgetExtension/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
|
||||
|
|
|
@ -202,7 +202,7 @@ struct EpisodeItemView: View {
|
|||
self.playbackInfo.shouldShowPlayer = true
|
||||
} label: {
|
||||
HStack {
|
||||
Text(viewModel.item.getItemProgressString() == "" ? "Play" : "\(viewModel.item.getItemProgressString()) left")
|
||||
Text(viewModel.item.getItemProgressString() == "" ? "Play" : viewModel.item.getItemProgressString())
|
||||
.foregroundColor(Color.white).font(.callout).fontWeight(.semibold)
|
||||
Image(systemName: "play.fill").foregroundColor(Color.white).font(.system(size: 20))
|
||||
}
|
||||
|
|
|
@ -65,26 +65,7 @@ struct SettingsView: View {
|
|||
Text("Signed in as \(username)").foregroundColor(.primary)
|
||||
Spacer()
|
||||
Button {
|
||||
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Server")
|
||||
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
|
||||
|
||||
do {
|
||||
try viewContext.execute(deleteRequest)
|
||||
} catch _ as NSError {
|
||||
// TODO: handle the error
|
||||
}
|
||||
|
||||
let fetchRequest2: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "SignedInUser")
|
||||
let deleteRequest2 = NSBatchDeleteRequest(fetchRequest: fetchRequest2)
|
||||
|
||||
do {
|
||||
try viewContext.execute(deleteRequest2)
|
||||
} catch _ as NSError {
|
||||
// TODO: handle the error
|
||||
}
|
||||
|
||||
SessionManager.current.logout()
|
||||
ServerEnvironment.current.reset()
|
||||
} label: {
|
||||
Text("Log out").font(.callout)
|
||||
}
|
||||
|
|
|
@ -129,11 +129,6 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
let secondsScrubbedTo = round(Double(seekSlider.value) * videoDuration)
|
||||
let offset = secondsScrubbedTo - videoPosition
|
||||
|
||||
print(videoPosition)
|
||||
print(videoDuration)
|
||||
print(secondsScrubbedTo)
|
||||
print(offset)
|
||||
|
||||
if(playerDestination == .local) {
|
||||
if offset > 0 {
|
||||
mediaPlayer.jumpForward(Int32(offset))
|
||||
|
@ -178,7 +173,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
if(playerDestination == .local) {
|
||||
mediaPlayer.jumpBackward(15)
|
||||
} else {
|
||||
|
||||
self.sendJellyfinCommand(command: "Seek", options: ["position": (remotePositionTicks/10_000_000)-15])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -188,6 +183,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
if(playerDestination == .local) {
|
||||
mediaPlayer.jumpForward(30)
|
||||
} else {
|
||||
self.sendJellyfinCommand(command: "Seek", options: ["position": (remotePositionTicks/10_000_000)+30])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -285,10 +281,6 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
return .landscape
|
||||
}
|
||||
|
||||
override var shouldAutorotate: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func setupNowPlayingCC() {
|
||||
let commandCenter = MPRemoteCommandCenter.shared()
|
||||
commandCenter.playCommand.isEnabled = true
|
||||
|
@ -327,7 +319,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
self.mediaPlayer.jumpForward(30)
|
||||
self.sendProgressReport(eventName: "timeupdate")
|
||||
} else {
|
||||
|
||||
self.sendJellyfinCommand(command: "Seek", options: ["position": (self.remotePositionTicks/10_000_000)+30])
|
||||
}
|
||||
return .success
|
||||
}
|
||||
|
@ -337,6 +329,8 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
if(self.playerDestination == .local) {
|
||||
self.mediaPlayer.jumpBackward(15)
|
||||
self.sendProgressReport(eventName: "timeupdate")
|
||||
} else {
|
||||
self.sendJellyfinCommand(command: "Seek", options: ["position": (self.remotePositionTicks/10_000_000)-15])
|
||||
}
|
||||
return .success
|
||||
}
|
||||
|
@ -389,10 +383,6 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
}
|
||||
|
||||
super.viewDidLoad()
|
||||
if !UIDevice.current.orientation.isLandscape {
|
||||
let value = UIInterfaceOrientation.landscapeLeft.rawValue
|
||||
UIDevice.current.setValue(value, forKey: "orientation")
|
||||
}
|
||||
}
|
||||
|
||||
func mediaHasStartedPlaying() {
|
||||
|
@ -431,7 +421,13 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
super.viewDidAppear(animated)
|
||||
overrideUserInterfaceStyle = .dark
|
||||
self.tabBarController?.tabBar.isHidden = true
|
||||
// View has loaded.
|
||||
self.navigationController?.isNavigationBarHidden = true
|
||||
self.setNeedsUpdateOfHomeIndicatorAutoHidden()
|
||||
|
||||
if !UIDevice.current.orientation.isLandscape || UIDevice.current.orientation.isFlat {
|
||||
let value = UIInterfaceOrientation.landscapeLeft.rawValue
|
||||
UIDevice.current.setValue(value, forKey: "orientation")
|
||||
}
|
||||
|
||||
mediaPlayer.perform(Selector(("setTextRendererFontSize:")), with: 14)
|
||||
// mediaPlayer.wrappedValue.perform(Selector(("setTextRendererFont:")), with: "Copperplate")
|
||||
|
@ -456,8 +452,6 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
.sink(receiveCompletion: { result in
|
||||
print(result)
|
||||
}, receiveValue: { [self] response in
|
||||
videoContentView.setNeedsLayout()
|
||||
videoContentView.setNeedsDisplay()
|
||||
playSessionId = response.playSessionId ?? ""
|
||||
let mediaSource = response.mediaSources!.first.self!
|
||||
if mediaSource.transcodingUrl != nil {
|
||||
|
@ -471,11 +465,11 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
subtitleTrackArray.append(disableSubtitleTrack)
|
||||
|
||||
// Loop through media streams and add to array
|
||||
for stream in mediaSource.mediaStreams! {
|
||||
for stream in mediaSource.mediaStreams ?? [] {
|
||||
if stream.type == .subtitle {
|
||||
var deliveryUrl: URL?
|
||||
if stream.deliveryMethod == .external {
|
||||
deliveryUrl = URL(string: "\(ServerEnvironment.current.server.baseURI!)\(stream.deliveryUrl!)")!
|
||||
deliveryUrl = URL(string: "\(ServerEnvironment.current.server.baseURI!)\(stream.deliveryUrl ?? "")")!
|
||||
} else {
|
||||
deliveryUrl = nil
|
||||
}
|
||||
|
@ -505,7 +499,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
playbackItem = item
|
||||
} else {
|
||||
// Item will be directly played by the client.
|
||||
let streamURL: URL = URL(string: "\(ServerEnvironment.current.server.baseURI!)/Videos/\(manifest.id!)/stream?Static=true&mediaSourceId=\(manifest.id!)&deviceId=\(SessionManager.current.deviceID)&api_key=\(SessionManager.current.accessToken)&Tag=\(mediaSource.eTag!)")!
|
||||
let streamURL: URL = URL(string: "\(ServerEnvironment.current.server.baseURI!)/Videos/\(manifest.id!)/stream?Static=true&mediaSourceId=\(manifest.id!)&deviceId=\(SessionManager.current.deviceID)&api_key=\(SessionManager.current.accessToken)&Tag=\(mediaSource.eTag ?? "")")!
|
||||
|
||||
let item = PlaybackItem()
|
||||
item.videoUrl = streamURL
|
||||
|
@ -515,7 +509,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
subtitleTrackArray.append(disableSubtitleTrack)
|
||||
|
||||
// Loop through media streams and add to array
|
||||
for stream in mediaSource.mediaStreams! {
|
||||
for stream in mediaSource.mediaStreams ?? [] {
|
||||
if stream.type == .subtitle {
|
||||
var deliveryUrl: URL?
|
||||
if stream.deliveryMethod == .external {
|
||||
|
@ -548,7 +542,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
self.sendPlayReport()
|
||||
playbackItem = item
|
||||
}
|
||||
dump(playbackItem)
|
||||
|
||||
startLocalPlaybackEngine(true)
|
||||
})
|
||||
.store(in: &cancellables)
|
||||
|
@ -597,6 +591,13 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
|
|||
self.mediaHasStartedPlaying()
|
||||
delegate?.hideLoadingView(self)
|
||||
|
||||
videoContentView.setNeedsLayout()
|
||||
videoContentView.setNeedsDisplay()
|
||||
self.view.setNeedsLayout()
|
||||
self.view.setNeedsDisplay()
|
||||
self.videoControlsView.setNeedsLayout()
|
||||
self.videoControlsView.setNeedsDisplay()
|
||||
|
||||
mediaPlayer.pause()
|
||||
mediaPlayer.play()
|
||||
|
||||
|
@ -793,11 +794,6 @@ extension PlayerViewController: VLCMediaPlayerDelegate {
|
|||
case .buffering :
|
||||
print("Video is buffering)")
|
||||
delegate?.showLoadingView(self)
|
||||
mediaPlayer.pause()
|
||||
usleep(10000)
|
||||
mediaPlayer.play()
|
||||
delegate?.hideLoadingView(self)
|
||||
paused = false
|
||||
case .error :
|
||||
print("Video has error)")
|
||||
sendStopReport()
|
||||
|
@ -925,7 +921,7 @@ extension PlayerViewController {
|
|||
}
|
||||
|
||||
func sendPlayReport() {
|
||||
startTime = Int(Date().timeIntervalSince1970) * 10000000
|
||||
startTime = Int(Date().timeIntervalSince1970) * 10_000_000
|
||||
|
||||
print("sending play report!")
|
||||
|
||||
|
@ -940,3 +936,9 @@ extension PlayerViewController {
|
|||
.store(in: &cancellables)
|
||||
}
|
||||
}
|
||||
|
||||
extension UINavigationController {
|
||||
open override var childForHomeIndicatorAutoHidden: UIViewController? {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ struct ImageView: View {
|
|||
}
|
||||
.failure {
|
||||
Rectangle()
|
||||
.background(Color.gray)
|
||||
.fill(Color.gray)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -147,6 +147,9 @@ final class SessionManager {
|
|||
}
|
||||
|
||||
func logout() {
|
||||
let nc = NotificationCenter.default
|
||||
nc.post(name: Notification.Name("didSignOut"), object: nil)
|
||||
|
||||
let keychain = KeychainSwift()
|
||||
keychain.accessGroup = "9R8RREG67J.me.vigue.jellyfin.sharedKeychain"
|
||||
keychain.delete("AccessToken_\(user?.user_id ?? "")")
|
||||
|
@ -155,8 +158,5 @@ final class SessionManager {
|
|||
let deleteRequest = NSBatchDeleteRequest(objectIDs: [user.objectID])
|
||||
user = nil
|
||||
_ = try? PersistenceController.shared.container.viewContext.execute(deleteRequest)
|
||||
|
||||
let nc = NotificationCenter.default
|
||||
nc.post(name: Notification.Name("didSignOut"), object: nil)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,12 +25,13 @@ struct NextUpWidgetProvider: TimelineProvider {
|
|||
|
||||
func getSnapshot(in context: Context, completion: @escaping (NextUpEntry) -> Void) {
|
||||
let currentDate = Date()
|
||||
let server = ServerEnvironment.current.server!
|
||||
let savedUser = SessionManager.current.user!
|
||||
let server = ServerEnvironment.current.server
|
||||
let savedUser = SessionManager.current.user
|
||||
var tempCancellables = Set<AnyCancellable>()
|
||||
|
||||
JellyfinAPI.basePath = server.baseURI ?? ""
|
||||
TvShowsAPI.getNextUp(userId: savedUser.user_id, limit: 3,
|
||||
if(server != nil && savedUser != nil) {
|
||||
JellyfinAPI.basePath = server!.baseURI ?? ""
|
||||
TvShowsAPI.getNextUp(userId: savedUser!.user_id, limit: 3,
|
||||
fields: [.primaryImageAspectRatio, .seriesPrimaryImage, .seasonUserData, .overview, .genres, .people],
|
||||
imageTypeLimit: 1, enableImageTypes: [.primary, .backdrop, .thumb])
|
||||
.subscribe(on: DispatchQueue.global(qos: .background))
|
||||
|
@ -63,16 +64,19 @@ struct NextUpWidgetProvider: TimelineProvider {
|
|||
})
|
||||
.store(in: &tempCancellables)
|
||||
}
|
||||
}
|
||||
|
||||
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
|
||||
let currentDate = Date()
|
||||
let entryDate = Calendar.current.date(byAdding: .hour, value: 1, to: currentDate)!
|
||||
let server = ServerEnvironment.current.server!
|
||||
let savedUser = SessionManager.current.user!
|
||||
let server = ServerEnvironment.current.server
|
||||
let savedUser = SessionManager.current.user
|
||||
|
||||
var tempCancellables = Set<AnyCancellable>()
|
||||
JellyfinAPI.basePath = server.baseURI ?? ""
|
||||
TvShowsAPI.getNextUp(userId: savedUser.user_id, limit: 3,
|
||||
|
||||
if(server != nil && savedUser != nil) {
|
||||
JellyfinAPI.basePath = server!.baseURI ?? ""
|
||||
TvShowsAPI.getNextUp(userId: savedUser!.user_id, limit: 3,
|
||||
fields: [.primaryImageAspectRatio, .seriesPrimaryImage, .seasonUserData, .overview, .genres, .people],
|
||||
imageTypeLimit: 1, enableImageTypes: [.primary, .backdrop, .thumb])
|
||||
.subscribe(on: DispatchQueue.global(qos: .background))
|
||||
|
@ -106,6 +110,7 @@ struct NextUpWidgetProvider: TimelineProvider {
|
|||
})
|
||||
.store(in: &tempCancellables)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct NextUpEntry: TimelineEntry {
|
||||
|
|
Loading…
Reference in New Issue