diff --git a/JellyfinPlayer.xcodeproj/xcshareddata/IDETemplateMacros.plist b/JellyfinPlayer.xcodeproj/xcshareddata/IDETemplateMacros.plist index 051abdf3..bfa5b38b 100644 --- a/JellyfinPlayer.xcodeproj/xcshareddata/IDETemplateMacros.plist +++ b/JellyfinPlayer.xcodeproj/xcshareddata/IDETemplateMacros.plist @@ -3,11 +3,13 @@ FILEHEADER - /* SwiftFin is subject to the terms of the Mozilla Public - * License, v2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * Copyright 2021 Aiden Vigue & Jellyfin Contributors - */ + + /* + * SwiftFin is subject to the terms of the Mozilla Public + * License, v2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright 2021 Aiden Vigue & Jellyfin Contributors + */ diff --git a/JellyfinPlayer/ConnectToServerView.swift b/JellyfinPlayer/ConnectToServerView.swift index b6fc26d0..b3ce2658 100644 --- a/JellyfinPlayer/ConnectToServerView.swift +++ b/JellyfinPlayer/ConnectToServerView.swift @@ -34,7 +34,7 @@ struct ConnectToServerView: View { @State private var serverSkipped: Bool = false; @State private var serverSkippedAlert: Bool = false; @State private var skip_server_bool: Bool = false; - @State private var skip_server_obj: Server = Server(); + @State private var skip_server_obj: Server!; @Binding var rootIsActive: Bool @@ -297,9 +297,6 @@ struct ConnectToServerView: View { .frame(width: 60, height: 60) .cornerRadius(30.0) .shadow(radius: 6) - .onAppear(perform: { - print("\(uri)/Users/\(publicUser.id!)/Images/Primary?width=200&quality=80&tag=\(publicUser.primaryImageTag!)") - }) } else { Image(systemName: "person.fill") .foregroundColor(Color(red: 1, green: 1, blue: 1).opacity(0.8)) diff --git a/JellyfinPlayer/ContinueWatchingView.swift b/JellyfinPlayer/ContinueWatchingView.swift index faceadb2..8d47086c 100644 --- a/JellyfinPlayer/ContinueWatchingView.swift +++ b/JellyfinPlayer/ContinueWatchingView.swift @@ -37,7 +37,7 @@ struct ContinueWatchingView: View { @State private var items: [BaseItemDto] = [] func onAppear() { - ItemsAPI.getResumeItems(userId: globalData.user.user_id ?? "", limit: 12, fields: [.primaryImageAspectRatio], mediaTypes: ["Video"], imageTypeLimit: 1, enableImageTypes: [.primary,.backdrop,.thumb]) + ItemsAPI.getResumeItems(userId: globalData.user.user_id ?? "", limit: 12, fields: [.primaryImageAspectRatio,.seriesPrimaryImage,.seasonUserData,.overview,.genres,.people], mediaTypes: ["Video"], imageTypeLimit: 1, enableImageTypes: [.primary,.backdrop,.thumb]) .sink(receiveCompletion: { completion in HandleAPIRequestCompletion(globalData: globalData, completion: completion) }, receiveValue: { response in diff --git a/JellyfinPlayer/EpisodeItemView.swift b/JellyfinPlayer/EpisodeItemView.swift index 2a596345..464d10dc 100644 --- a/JellyfinPlayer/EpisodeItemView.swift +++ b/JellyfinPlayer/EpisodeItemView.swift @@ -16,22 +16,25 @@ struct EpisodeItemView: View { var item: BaseItemDto + @State private var settingState: Bool = true @State private var watched: Bool = false { didSet { - if watched == true { - PlaystateAPI.markPlayedItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) - } else { - PlaystateAPI.markUnplayedItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) + if !settingState { + if watched == true { + PlaystateAPI.markPlayedItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } else { + PlaystateAPI.markUnplayedItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } } } } @@ -39,20 +42,22 @@ struct EpisodeItemView: View { @State private var favorite: Bool = false { didSet { - if favorite == true { - UserLibraryAPI.markFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) - } else { - UserLibraryAPI.unmarkFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) + if !settingState { + if favorite == true { + UserLibraryAPI.markFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } else { + UserLibraryAPI.unmarkFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } } } } @@ -99,7 +104,7 @@ struct EpisodeItemView: View { .fontWeight(.medium) .foregroundColor(.secondary) .lineLimit(1) - if item.officialRating != "" { + if item.officialRating != nil { Text(item.officialRating!).font(.subheadline) .fontWeight(.semibold) .foregroundColor(.secondary) @@ -454,8 +459,9 @@ struct EpisodeItemView: View { } } .onAppear(perform: { - favorite = item.userData?.isFavorite ?? false - watched = item.userData?.played ?? false + favorite = item.userData!.isFavorite! + watched = item.userData!.played! + settingState = false }) .navigationBarTitleDisplayMode(.inline) .navigationTitle("\(item.seriesName ?? "") - S\(String(item.parentIndexNumber ?? 0)):E\(String(item.indexNumber ?? 0))") diff --git a/JellyfinPlayer/Info.plist b/JellyfinPlayer/Info.plist index 1e20e2c6..4bfa545a 100644 --- a/JellyfinPlayer/Info.plist +++ b/JellyfinPlayer/Info.plist @@ -2,6 +2,14 @@ + NSBonjourServices + + _googlecast._tcp + _F007D354._googlecast._tcp + + NSLocalNetworkUsageDescription + ${PRODUCT_NAME} uses the local network to connect to your Jellyfin server & discover Cast-enabled devices on your WiFi +network. CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName diff --git a/JellyfinPlayer/ItemView.swift b/JellyfinPlayer/ItemView.swift index bf2cb5a4..7389f942 100644 --- a/JellyfinPlayer/ItemView.swift +++ b/JellyfinPlayer/ItemView.swift @@ -9,8 +9,6 @@ import SwiftUI import Introspect import JellyfinAPI -//good lord the environmental modifiers ;P - class VideoPlayerItem: ObservableObject { @Published var shouldShowPlayer: Bool = false; @Published var itemToPlay: BaseItemDto = BaseItemDto(); @@ -18,8 +16,6 @@ class VideoPlayerItem: ObservableObject { struct ItemView: View { @EnvironmentObject private var globalData: GlobalData - - @State private var fullItem: BaseItemDto = BaseItemDto(); private var item: BaseItemDto; @StateObject private var videoPlayerItem: VideoPlayerItem = VideoPlayerItem() @@ -31,23 +27,6 @@ struct ItemView: View { self.item = item } - func onAppear() { - if(viewDidLoad) { - return - } - - isLoading = true; - UserLibraryAPI.getItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { response in - isLoading = false - viewDidLoad = true - fullItem = response - }) - .store(in: &globalData.pendingAPIRequests) - } - var body: some View { VStack { if(videoPlayerItem.shouldShowPlayer) { @@ -62,37 +41,32 @@ struct ItemView: View { .overrideViewPreference(.unspecified) .supportedOrientations(.landscape) } else { - if(isLoading) { - ProgressView() - } else { - VStack { - if(fullItem.type == "Movie") { - MovieItemView(item: fullItem) - } else if(fullItem.type == "Season") { - SeasonItemView(item: fullItem) - } else if(fullItem.type == "Series") { - SeriesItemView(item: fullItem) - } else if(fullItem.type == "Episode") { - EpisodeItemView(item: fullItem) - } else { - Text("Type: \(fullItem.type ?? "") not implemented yet :(") - } + VStack { + if(item.type == "Movie") { + MovieItemView(item: item) + } else if(item.type == "Season") { + SeasonItemView(item: item) + } else if(item.type == "Series") { + SeriesItemView(item: item) + } else if(item.type == "Episode") { + EpisodeItemView(item: item) + } else { + Text("Type: \(item.type ?? "") not implemented yet :(") } - .introspectTabBarController { (UITabBarController) in - UITabBarController.tabBar.isHidden = false - } - .navigationBarHidden(false) - .navigationBarBackButtonHidden(false) - .statusBar(hidden: false) - .prefersHomeIndicatorAutoHidden(false) - .preferredColorScheme(.none) - .edgesIgnoringSafeArea([]) - .overrideViewPreference(.unspecified) - .supportedOrientations(.allButUpsideDown) - .environmentObject(videoPlayerItem) } + .introspectTabBarController { (UITabBarController) in + UITabBarController.tabBar.isHidden = false + } + .navigationBarHidden(false) + .navigationBarBackButtonHidden(false) + .statusBar(hidden: false) + .prefersHomeIndicatorAutoHidden(false) + .preferredColorScheme(.none) + .edgesIgnoringSafeArea([]) + .overrideViewPreference(.unspecified) + .supportedOrientations(.allButUpsideDown) + .environmentObject(videoPlayerItem) } } - .onAppear(perform: onAppear) } } diff --git a/JellyfinPlayer/LatestMediaView.swift b/JellyfinPlayer/LatestMediaView.swift index 24416b7b..7d8c7af6 100644 --- a/JellyfinPlayer/LatestMediaView.swift +++ b/JellyfinPlayer/LatestMediaView.swift @@ -26,7 +26,7 @@ struct LatestMediaView: View { } viewDidLoad = true; - UserLibraryAPI.getLatestMedia(userId: globalData.user.user_id!, parentId: library_id, fields: [.primaryImageAspectRatio,.seriesPrimaryImage], enableUserData: true, limit: 12) + UserLibraryAPI.getLatestMedia(userId: globalData.user.user_id!, parentId: library_id, fields: [.primaryImageAspectRatio,.seriesPrimaryImage,.seasonUserData,.overview,.genres,.people], enableUserData: true, limit: 12) .sink(receiveCompletion: { completion in HandleAPIRequestCompletion(globalData: globalData, completion: completion) }, receiveValue: { response in diff --git a/JellyfinPlayer/LibrarySearchView.swift b/JellyfinPlayer/LibrarySearchView.swift index deb3c2c2..45e1d391 100644 --- a/JellyfinPlayer/LibrarySearchView.swift +++ b/JellyfinPlayer/LibrarySearchView.swift @@ -31,7 +31,7 @@ struct LibrarySearchView: View { func requestSearch(query: String) { isLoading = true print(usingParentID) - ItemsAPI.getItemsByUserId(userId: globalData.user.user_id!, limit: 60, recursive: true, searchTerm: query, sortOrder: [.ascending], parentId: (usingParentID != "" ? usingParentID : nil), fields: [.parentId,.primaryImageAspectRatio,.basicSyncInfo], includeItemTypes: ["Movie","Series"], sortBy: ["SortName"], enableUserData: true, enableImages: true) + ItemsAPI.getItemsByUserId(userId: globalData.user.user_id!, limit: 60, recursive: true, searchTerm: query, sortOrder: [.ascending], parentId: (usingParentID != "" ? usingParentID : nil), fields: [.primaryImageAspectRatio,.seriesPrimaryImage,.seasonUserData,.overview,.genres,.people], includeItemTypes: ["Movie","Series"], sortBy: ["SortName"], enableUserData: true, enableImages: true) .sink(receiveCompletion: { completion in HandleAPIRequestCompletion(globalData: globalData, completion: completion) }, receiveValue: { response in @@ -110,3 +110,5 @@ struct LibrarySearchView: View { } } } + +//stream NM5 by nicki! diff --git a/JellyfinPlayer/LibraryView.swift b/JellyfinPlayer/LibraryView.swift index 84ed2f15..3da7828e 100644 --- a/JellyfinPlayer/LibraryView.swift +++ b/JellyfinPlayer/LibraryView.swift @@ -61,7 +61,7 @@ struct LibraryView: View { isLoading = true items = [] - ItemsAPI.getItemsByUserId(userId: globalData.user.user_id!, startIndex: currentPage * 100, limit: 100, recursive: true, searchTerm: nil, sortOrder: filters.sortOrder, parentId: (usingParentID != "" ? usingParentID : nil), fields: [.parentId,.primaryImageAspectRatio,.basicSyncInfo], includeItemTypes: ["Movie","Series"], filters: filters.filters, sortBy: filters.sortBy, enableUserData: true, personIds: (personId == "" ? nil : [personId]), studioIds: (studio == "" ? nil : [studio]), genreIds: (genre == "" ? nil : [genre]), enableImages: true) + ItemsAPI.getItemsByUserId(userId: globalData.user.user_id!, startIndex: currentPage * 100, limit: 100, recursive: true, searchTerm: nil, sortOrder: filters.sortOrder, parentId: (usingParentID != "" ? usingParentID : nil), fields: [.primaryImageAspectRatio,.seriesPrimaryImage,.seasonUserData,.overview,.genres,.people], includeItemTypes: ["Movie","Series"], filters: filters.filters, sortBy: filters.sortBy, enableUserData: true, personIds: (personId == "" ? nil : [personId]), studioIds: (studio == "" ? nil : [studio]), genreIds: (genre == "" ? nil : [genre]), enableImages: true) .sink(receiveCompletion: { completion in HandleAPIRequestCompletion(globalData: globalData, completion: completion) isLoading = false @@ -184,3 +184,5 @@ struct LibraryView: View { } } } + +//stream BM^S by nicki! diff --git a/JellyfinPlayer/MovieItemView.swift b/JellyfinPlayer/MovieItemView.swift index 282c7517..f2483379 100644 --- a/JellyfinPlayer/MovieItemView.swift +++ b/JellyfinPlayer/MovieItemView.swift @@ -15,23 +15,26 @@ struct MovieItemView: View { @EnvironmentObject private var playbackInfo: VideoPlayerItem var item: BaseItemDto - + + @State private var settingState: Bool = true @State private var watched: Bool = false { didSet { - if watched == true { - PlaystateAPI.markPlayedItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) - } else { - PlaystateAPI.markUnplayedItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) + if !settingState { + if watched == true { + PlaystateAPI.markPlayedItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } else { + PlaystateAPI.markUnplayedItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } } } } @@ -39,20 +42,22 @@ struct MovieItemView: View { @State private var favorite: Bool = false { didSet { - if favorite == true { - UserLibraryAPI.markFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) - } else { - UserLibraryAPI.unmarkFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) - .sink(receiveCompletion: { completion in - HandleAPIRequestCompletion(globalData: globalData, completion: completion) - }, receiveValue: { _ in - }) - .store(in: &globalData.pendingAPIRequests) + if !settingState { + if favorite == true { + UserLibraryAPI.markFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } else { + UserLibraryAPI.unmarkFavoriteItem(userId: globalData.user.user_id!, itemId: item.id!) + .sink(receiveCompletion: { completion in + HandleAPIRequestCompletion(globalData: globalData, completion: completion) + }, receiveValue: { _ in + }) + .store(in: &globalData.pendingAPIRequests) + } } } } @@ -454,8 +459,9 @@ struct MovieItemView: View { } } .onAppear(perform: { - favorite = item.userData?.isFavorite ?? false - watched = item.userData?.played ?? false + favorite = item.userData!.isFavorite! + watched = item.userData!.played! + settingState = false }) .navigationBarTitleDisplayMode(.inline) .navigationTitle(item.name!) diff --git a/JellyfinPlayer/NextUpView.swift b/JellyfinPlayer/NextUpView.swift index cd04c946..0265be14 100644 --- a/JellyfinPlayer/NextUpView.swift +++ b/JellyfinPlayer/NextUpView.swift @@ -21,7 +21,7 @@ struct NextUpView: View { } viewDidLoad = true; - TvShowsAPI.getNextUp(userId: globalData.user.user_id!, limit: 12) + TvShowsAPI.getNextUp(userId: globalData.user.user_id!, limit: 12, fields: [.primaryImageAspectRatio,.seriesPrimaryImage,.seasonUserData,.overview,.genres,.people]) .sink(receiveCompletion: { completion in HandleAPIRequestCompletion(globalData: globalData, completion: completion) }, receiveValue: { response in diff --git a/JellyfinPlayer/SeasonItemView.swift b/JellyfinPlayer/SeasonItemView.swift index 34e053a4..6b0f8231 100644 --- a/JellyfinPlayer/SeasonItemView.swift +++ b/JellyfinPlayer/SeasonItemView.swift @@ -14,8 +14,8 @@ struct SeasonItemView: View { @EnvironmentObject var orientationInfo: OrientationInfo var item: BaseItemDto = BaseItemDto() - @State private var episodes: [BaseItemDto] = [] + @State private var isLoading: Bool = true @State private var viewDidLoad: Bool = false @@ -27,10 +27,8 @@ struct SeasonItemView: View { if(viewDidLoad) { return } - - dump(item) - - TvShowsAPI.getEpisodes(seriesId: item.seriesId!, userId: globalData.user.user_id!, fields: [.primaryImageAspectRatio, .seasonUserData, .itemCounts, .overview], seasonId: item.id!) + + TvShowsAPI.getEpisodes(seriesId: item.seriesId!, userId: globalData.user.user_id!, fields: [.primaryImageAspectRatio,.seriesPrimaryImage,.seasonUserData,.overview,.genres,.people], seasonId: item.id!) .sink(receiveCompletion: { completion in HandleAPIRequestCompletion(globalData: globalData, completion: completion) isLoading = false diff --git a/JellyfinPlayer/SeriesItemView.swift b/JellyfinPlayer/SeriesItemView.swift index 39014df4..8f547d8f 100644 --- a/JellyfinPlayer/SeriesItemView.swift +++ b/JellyfinPlayer/SeriesItemView.swift @@ -24,9 +24,9 @@ struct SeriesItemView: View { if(viewDidLoad) { return; } - isLoading = true - TvShowsAPI.getSeasons(seriesId: item.id ?? "") + isLoading = true + TvShowsAPI.getSeasons(seriesId: item.id ?? "", fields: [.primaryImageAspectRatio,.seriesPrimaryImage,.seasonUserData,.overview,.genres,.people]) .sink(receiveCompletion: { completion in HandleAPIRequestCompletion(globalData: globalData, completion: completion) }, receiveValue: { response in diff --git a/JellyfinPlayer/VideoPlayer.swift b/JellyfinPlayer/VideoPlayer.swift index a506e0ad..22b3e44f 100644 --- a/JellyfinPlayer/VideoPlayer.swift +++ b/JellyfinPlayer/VideoPlayer.swift @@ -8,6 +8,7 @@ import SwiftUI import MobileVLCKit import JellyfinAPI +import MediaPlayer struct Subtitle { var name: String; @@ -185,9 +186,78 @@ class PlayerViewController: UIViewController, VLCMediaDelegate, VLCMediaPlayerDe return true } + func setupNowPlayingCC() { + let commandCenter = MPRemoteCommandCenter.shared() + commandCenter.playCommand.isEnabled = true; + commandCenter.pauseCommand.isEnabled = true; + commandCenter.seekForwardCommand.isEnabled = true; + commandCenter.seekBackwardCommand.isEnabled = true; + commandCenter.changePlaybackPositionCommand.isEnabled = true + + // Add handler for Pause Command + commandCenter.pauseCommand.addTarget{ event in + self.mediaPlayer.pause() + self.sendProgressReport(eventName: "pause") + return .success + } + + //Add handler for Play command + commandCenter.playCommand.addTarget{ event in + self.mediaPlayer.play() + self.sendProgressReport(eventName: "unpause") + return .success + } + + //Add handler for FF command + commandCenter.seekForwardCommand.addTarget{ event in + self.mediaPlayer.jumpForward(30) + self.sendProgressReport(eventName: "timeupdate") + return .success + } + + //Add handler for RW command + commandCenter.seekBackwardCommand.addTarget{ event in + self.mediaPlayer.jumpBackward(15) + self.sendProgressReport(eventName: "timeupdate") + return .success + } + + //Scrubber + commandCenter.changePlaybackPositionCommand.addTarget { [weak self](remoteEvent) -> MPRemoteCommandHandlerStatus in + guard let self = self else {return .commandFailed} + + if let event = remoteEvent as? MPChangePlaybackPositionCommandEvent { + let targetSeconds = event.positionTime + + let videoPosition = Double(self.mediaPlayer.time.intValue) + let offset = targetSeconds - videoPosition; + if(offset > 0) { + self.mediaPlayer.jumpForward(Int32(offset)/1000); + } else { + self.mediaPlayer.jumpBackward(Int32(abs(offset))/1000); + } + self.sendProgressReport(eventName: "unpause") + + return .success + } else { + return .commandFailed + } + } + + var nowPlayingInfo = [String : Any]() + nowPlayingInfo[MPMediaItemPropertyTitle] = manifest.name ?? "" + + MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo + + UIApplication.shared.beginReceivingRemoteControlEvents() + } + + override func remoteControlReceived(with event: UIEvent?) { + dump(event) + } + override func viewDidLoad() { super.viewDidLoad() - //View has loaded. //Rotate to landscape only if necessary @@ -200,7 +270,11 @@ class PlayerViewController: UIViewController, VLCMediaDelegate, VLCMediaPlayerDe mediaPlayer.delegate = self mediaPlayer.drawable = videoContentView - titleLabel.text = manifest.name + if(manifest.type == "Movie") { + titleLabel.text = manifest.name + } else { + titleLabel.text = "S\(String(manifest.parentIndexNumber!)):E\(String(manifest.indexNumber!)) “\(manifest.name!)”" + } //Fetch max bitrate from UserDefaults depending on current connection mode let defaults = UserDefaults.standard @@ -292,9 +366,12 @@ class PlayerViewController: UIViewController, VLCMediaDelegate, VLCMediaPlayerDe playbackItem = item; } + self.setupNowPlayingCC() + DispatchQueue.global(qos: .background).async { mediaPlayer.media = VLCMedia(url: playbackItem.videoUrl) mediaPlayer.play() + print(manifest.userData?.playbackPositionTicks ?? 0) mediaPlayer.jumpForward(Int32(manifest.userData?.playbackPositionTicks ?? 0/10000000)) mediaPlayer.pause() subtitleTrackArray.forEach() { sub in diff --git a/Shared/Typings/Typings.swift b/Shared/Typings/Typings.swift index 72326914..47e939dc 100644 --- a/Shared/Typings/Typings.swift +++ b/Shared/Typings/Typings.swift @@ -27,9 +27,9 @@ class justSignedIn: ObservableObject { } class GlobalData: ObservableObject { - @Published var user: SignedInUser = SignedInUser() + @Published var user: SignedInUser! @Published var authToken: String = "" - @Published var server: Server = Server() + @Published var server: Server! @Published var authHeader: String = "" @Published var isInNetwork: Bool = true; @Published var networkError: Bool = false;