Refactored some force unwraps
This commit is contained in:
parent
77e6777b91
commit
099e138eb5
|
@ -33,16 +33,6 @@ class AudioViewController: UIViewController {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// MARK: - Navigation
|
|
||||||
|
|
||||||
// In a storyboard-based application, you will often want to do a little preparation before navigation
|
|
||||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
|
||||||
// Get the new view controller using segue.destination.
|
|
||||||
// Pass the selected object to the new view controller.
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AudioView: View {
|
struct AudioView: View {
|
||||||
|
|
|
@ -72,15 +72,10 @@ class InfoTabBarViewController: UITabBarController, UIGestureRecognizerDelegate
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
print(item.title!)
|
|
||||||
|
|
||||||
switch item.title {
|
switch item.title {
|
||||||
case "Audio":
|
case "Audio":
|
||||||
if var height = audioViewController?.height {
|
if var height = audioViewController?.height {
|
||||||
print(height)
|
|
||||||
|
|
||||||
height += tabBarHeight
|
height += tabBarHeight
|
||||||
|
|
||||||
UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in
|
UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in
|
||||||
videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height)
|
videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height)
|
||||||
|
|
||||||
|
@ -91,8 +86,6 @@ class InfoTabBarViewController: UITabBarController, UIGestureRecognizerDelegate
|
||||||
break
|
break
|
||||||
case "Info":
|
case "Info":
|
||||||
if var height = mediaInfoController?.height {
|
if var height = mediaInfoController?.height {
|
||||||
print(height)
|
|
||||||
|
|
||||||
height += tabBarHeight
|
height += tabBarHeight
|
||||||
UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in
|
UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in
|
||||||
videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height)
|
videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height)
|
||||||
|
@ -103,8 +96,6 @@ class InfoTabBarViewController: UITabBarController, UIGestureRecognizerDelegate
|
||||||
break
|
break
|
||||||
case "Subtitles":
|
case "Subtitles":
|
||||||
if var height = subtitleViewController?.height{
|
if var height = subtitleViewController?.height{
|
||||||
print(height)
|
|
||||||
|
|
||||||
height += tabBarHeight
|
height += tabBarHeight
|
||||||
UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in
|
UIView.animate(withDuration: 0.6, delay: 0, options: .curveEaseOut) { [self] in
|
||||||
videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height)
|
videoPlayer?.infoViewContainer.frame = CGRect(x: pos.minX, y: pos.minY, width: pos.width, height: height)
|
||||||
|
|
|
@ -45,7 +45,8 @@ struct MediaInfoView: View {
|
||||||
HStack(spacing: 30) {
|
HStack(spacing: 30) {
|
||||||
|
|
||||||
VStack {
|
VStack {
|
||||||
ImageView(src: item.type == "Episode" ? item.getSeriesPrimaryImage(maxWidth: 200) : item.getPrimaryImage(maxWidth: 200), bh: item.type == "Episode" ? item.getSeriesPrimaryImageBlurHash() : item.getPrimaryImageBlurHash()) .frame(width: 200, height: 300)
|
ImageView(src: item.type == "Episode" ? item.getSeriesPrimaryImage(maxWidth: 200) : item.getPrimaryImage(maxWidth: 200), bh: item.type == "Episode" ? item.getSeriesPrimaryImageBlurHash() : item.getPrimaryImageBlurHash())
|
||||||
|
.frame(width: 200, height: 300)
|
||||||
.cornerRadius(10)
|
.cornerRadius(10)
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
|
@ -68,7 +69,7 @@ struct MediaInfoView: View {
|
||||||
if item.type == "Episode" {
|
if item.type == "Episode" {
|
||||||
Text("S\(item.parentIndexNumber ?? 0) • E\(item.indexNumber ?? 0)")
|
Text("S\(item.parentIndexNumber ?? 0) • E\(item.indexNumber ?? 0)")
|
||||||
|
|
||||||
if let date = item.premiereDate! {
|
if let date = item.premiereDate {
|
||||||
Text("•")
|
Text("•")
|
||||||
Text(formatDate(date: date))
|
Text(formatDate(date: date))
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,6 @@ class SubtitlesViewController: UIViewController {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func prepareSubtitleView(subtitleTracks: [Subtitle], selectedTrack: Int32, delegate: VideoPlayerSettingsDelegate)
|
func prepareSubtitleView(subtitleTracks: [Subtitle], selectedTrack: Int32, delegate: VideoPlayerSettingsDelegate)
|
||||||
{
|
{
|
||||||
let contentView = UIHostingController(rootView: SubtitleView(selectedTrack: selectedTrack, subtitleTrackArray: subtitleTracks, delegate: delegate))
|
let contentView = UIHostingController(rootView: SubtitleView(selectedTrack: selectedTrack, subtitleTrackArray: subtitleTracks, delegate: delegate))
|
||||||
|
@ -33,86 +32,6 @@ class SubtitlesViewController: UIViewController {
|
||||||
contentView.view.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
|
contentView.view.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
||||||
// return subtitleTrackArray.count
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
||||||
// let cell = UITableViewCell()
|
|
||||||
// let subtitle = subtitleTrackArray[indexPath.row]
|
|
||||||
// cell.textLabel?.text = subtitle.name
|
|
||||||
//
|
|
||||||
// let image = UIImage(systemName: "checkmark", withConfiguration: UIImage.SymbolConfiguration(pointSize: (27), weight: .bold))?.withRenderingMode(.alwaysOriginal).withTintColor(.white)
|
|
||||||
// cell.imageView?.image = image
|
|
||||||
//
|
|
||||||
// if selectedTrack != subtitle.id {
|
|
||||||
// cell.imageView?.isHidden = true
|
|
||||||
// }
|
|
||||||
// else {
|
|
||||||
// selectedTrackCellRow = indexPath.row
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return cell
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func tableView(_ tableView: UITableView, didUpdateFocusIn context: UITableViewFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
|
|
||||||
//
|
|
||||||
// if let path = context.nextFocusedIndexPath {
|
|
||||||
// if path.row == selectedTrackCellRow {
|
|
||||||
// let cell : UITableViewCell = tableView.cellForRow(at: path)!
|
|
||||||
// cell.imageView?.image = cell.imageView?.image?.withTintColor(.black)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if let path = context.previouslyFocusedIndexPath {
|
|
||||||
// if path.row == selectedTrackCellRow {
|
|
||||||
// let cell : UITableViewCell = tableView.cellForRow(at: path)!
|
|
||||||
// cell.imageView?.image = cell.imageView?.image?.withTintColor(.white)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
|
||||||
// let oldPath = IndexPath(row: selectedTrackCellRow, section: 0)
|
|
||||||
// if let oldCell : UITableViewCell = tableView.cellForRow(at: oldPath) {
|
|
||||||
// oldCell.imageView?.isHidden = true
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// let cell : UITableViewCell = tableView.cellForRow(at: indexPath)!
|
|
||||||
// cell.imageView?.isHidden = false
|
|
||||||
// cell.imageView?.image = cell.imageView?.image?.withTintColor(.black)
|
|
||||||
//
|
|
||||||
// selectedTrack = Int32(subtitleTrackArray[indexPath.row].id)
|
|
||||||
// selectedTrackCellRow = indexPath.row
|
|
||||||
//// infoTabBar?.videoPlayer?.subtitleTrackChanged(newTrackID: selectedTrack)
|
|
||||||
// print("setting new subtitle")
|
|
||||||
// tableView.deselectRow(at: indexPath, animated: false)
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// func numberOfSections(in tableView: UITableView) -> Int {
|
|
||||||
// return 1
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
// MARK: - Navigation
|
|
||||||
|
|
||||||
// In a storyboard-based application, you will often want to do a little preparation before navigation
|
|
||||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
|
||||||
// Get the new view controller using segue.destination.
|
|
||||||
// Pass the selected object to the new view controller.
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SubtitleView: View {
|
struct SubtitleView: View {
|
||||||
|
|
|
@ -140,6 +140,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
|
|
||||||
setupNowPlayingCC()
|
setupNowPlayingCC()
|
||||||
|
|
||||||
|
// Adjust subtitle size
|
||||||
mediaPlayer.perform(Selector(("setTextRendererFontSize:")), with: 16)
|
mediaPlayer.perform(Selector(("setTextRendererFontSize:")), with: 16)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -154,10 +155,14 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
builder.setMaxBitrate(bitrate: maxBitrate)
|
builder.setMaxBitrate(bitrate: maxBitrate)
|
||||||
let profile = builder.buildProfile()
|
let profile = builder.buildProfile()
|
||||||
|
|
||||||
let playbackInfo = PlaybackInfoDto(userId: SessionManager.current.user.user_id!, maxStreamingBitrate: Int(maxBitrate), startTimeTicks: manifest.userData?.playbackPositionTicks ?? 0, deviceProfile: profile, autoOpenLiveStream: true)
|
guard let currentUser = SessionManager.current.user else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let playbackInfo = PlaybackInfoDto(userId: currentUser.user_id ?? "", maxStreamingBitrate: Int(maxBitrate), startTimeTicks: manifest.userData?.playbackPositionTicks ?? 0, deviceProfile: profile, autoOpenLiveStream: true)
|
||||||
|
|
||||||
DispatchQueue.global(qos: .userInitiated).async { [self] in
|
DispatchQueue.global(qos: .userInitiated).async { [self] in
|
||||||
MediaInfoAPI.getPostedPlaybackInfo(itemId: manifest.id!, userId: SessionManager.current.user.user_id!, maxStreamingBitrate: Int(maxBitrate), startTimeTicks: manifest.userData?.playbackPositionTicks ?? 0, autoOpenLiveStream: true, playbackInfoDto: playbackInfo)
|
MediaInfoAPI.getPostedPlaybackInfo(itemId: manifest.id!, userId: currentUser.user_id ?? "", maxStreamingBitrate: Int(maxBitrate), startTimeTicks: manifest.userData?.playbackPositionTicks ?? 0, autoOpenLiveStream: true, playbackInfoDto: playbackInfo)
|
||||||
.sink(receiveCompletion: { result in
|
.sink(receiveCompletion: { result in
|
||||||
print(result)
|
print(result)
|
||||||
}, receiveValue: { [self] response in
|
}, receiveValue: { [self] response in
|
||||||
|
@ -167,16 +172,17 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
|
|
||||||
playSessionId = response.playSessionId ?? ""
|
playSessionId = response.playSessionId ?? ""
|
||||||
|
|
||||||
let mediaSource = response.mediaSources!.first.self!
|
guard let mediaSource = response.mediaSources?.first.self else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
let item = PlaybackItem()
|
let item = PlaybackItem()
|
||||||
let streamURL : URL?
|
let streamURL : URL
|
||||||
|
|
||||||
// Item is being transcoded by request of server
|
// Item is being transcoded by request of server
|
||||||
if mediaSource.transcodingUrl != nil
|
if let transcodiungUrl = mediaSource.transcodingUrl {
|
||||||
{
|
|
||||||
item.videoType = .transcode
|
item.videoType = .transcode
|
||||||
streamURL = URL(string: "\(ServerEnvironment.current.server.baseURI!)\(mediaSource.transcodingUrl!)")
|
streamURL = URL(string: "\(ServerEnvironment.current.server.baseURI!)\(transcodiungUrl)")!
|
||||||
}
|
}
|
||||||
// Item will be directly played by the client
|
// Item will be directly played by the client
|
||||||
else
|
else
|
||||||
|
@ -185,7 +191,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
streamURL = 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!)")!
|
streamURL = 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!)")!
|
||||||
}
|
}
|
||||||
|
|
||||||
item.videoUrl = streamURL!
|
item.videoUrl = streamURL
|
||||||
|
|
||||||
let disableSubtitleTrack = Subtitle(name: "None", id: -1, url: nil, delivery: .embed, codec: "")
|
let disableSubtitleTrack = Subtitle(name: "None", id: -1, url: nil, delivery: .embed, codec: "")
|
||||||
subtitleTrackArray.append(disableSubtitleTrack)
|
subtitleTrackArray.append(disableSubtitleTrack)
|
||||||
|
@ -223,7 +229,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
}
|
}
|
||||||
|
|
||||||
// If no default audio tracks select the first one
|
// If no default audio tracks select the first one
|
||||||
if selectedAudioTrack == -1 && !audioTrackArray.isEmpty{
|
if selectedAudioTrack == -1 && !audioTrackArray.isEmpty {
|
||||||
selectedAudioTrack = audioTrackArray.first!.id
|
selectedAudioTrack = audioTrackArray.first!.id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,7 +356,7 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
|
|
||||||
var nowPlayingInfo = [String: Any]()
|
var nowPlayingInfo = [String: Any]()
|
||||||
|
|
||||||
nowPlayingInfo[MPMediaItemPropertyTitle] = manifest.name!
|
nowPlayingInfo[MPMediaItemPropertyTitle] = manifest.name ?? "Jellyfin Video"
|
||||||
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 0.0
|
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 0.0
|
||||||
nowPlayingInfo[MPNowPlayingInfoPropertyMediaType] = AVMediaType.video
|
nowPlayingInfo[MPNowPlayingInfoPropertyMediaType] = AVMediaType.video
|
||||||
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = runTicks
|
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = runTicks
|
||||||
|
@ -362,7 +368,6 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
return artworkImage
|
return artworkImage
|
||||||
})
|
})
|
||||||
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
|
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
|
||||||
print("set artwork")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,14 +576,14 @@ class VideoPlayerViewController: UIViewController, VideoPlayerSettingsDelegate,
|
||||||
switch swipe.direction {
|
switch swipe.direction {
|
||||||
case .left:
|
case .left:
|
||||||
print("swiped left")
|
print("swiped left")
|
||||||
mediaPlayer.pause()
|
// mediaPlayer.pause()
|
||||||
// player.seek(to: CMTime(value: Int64(self.currentSeconds) + 10, timescale: 1))
|
// player.seek(to: CMTime(value: Int64(self.currentSeconds) + 10, timescale: 1))
|
||||||
mediaPlayer.play()
|
// mediaPlayer.play()
|
||||||
case .right:
|
case .right:
|
||||||
print("swiped right")
|
print("swiped right")
|
||||||
mediaPlayer.pause()
|
// mediaPlayer.pause()
|
||||||
// player.seek(to: CMTime(value: Int64(self.currentSeconds) + 10, timescale: 1))
|
// player.seek(to: CMTime(value: Int64(self.currentSeconds) + 10, timescale: 1))
|
||||||
mediaPlayer.play()
|
// mediaPlayer.play()
|
||||||
case .up:
|
case .up:
|
||||||
break
|
break
|
||||||
case .down:
|
case .down:
|
||||||
|
|
Loading…
Reference in New Issue