// // VideoPlayerView.swift // JellyfinPlayer // // Created by Aiden Vigue on 5/10/21. // import SwiftUI import MobileVLCKit extension NSNotification { static let PlayerUpdate = NSNotification.Name.init("PlayerUpdate") } enum VideoType { case hls; case direct; } struct PlaybackItem { var videoType: VideoType; var videoUrl: URL; var subtitles: [Subtitle]; } struct VLCPlayer: UIViewRepresentable{ var url: Binding; var player: Binding; var startTime: Int; func updateUIView(_ uiView: PlayerUIView, context: UIViewRepresentableContext) { uiView.url = self.url if(self.url.wrappedValue.videoUrl.absoluteString != "https://example.com") { uiView.videoSetup() } } func makeUIView(context: Context) -> PlayerUIView { return PlayerUIView(frame: .zero, url: url, player: self.player, startTime: self.startTime); } } class PlayerUIView: UIView, VLCMediaPlayerDelegate { private var mediaPlayer: Binding; var url:Binding var lastUrl: PlaybackItem? var startTime: Int init(frame: CGRect, url: Binding, player: Binding, startTime: Int) { self.mediaPlayer = player; self.url = url; self.startTime = startTime; super.init(frame: frame) mediaPlayer.wrappedValue.delegate = self mediaPlayer.wrappedValue.drawable = self } func videoSetup() { if(lastUrl == nil || lastUrl?.videoUrl != url.wrappedValue.videoUrl) { lastUrl = url.wrappedValue print("update called") print(self.url.wrappedValue.videoUrl) mediaPlayer.wrappedValue.stop() mediaPlayer.wrappedValue.media = VLCMedia(url: self.url.wrappedValue.videoUrl) self.url.wrappedValue.subtitles.forEach() { sub in if(sub.id != -1 && sub.delivery == "External") { mediaPlayer.wrappedValue.addPlaybackSlave(sub.url, type: .subtitle, enforce: false) } } mediaPlayer.wrappedValue.perform(Selector(("setTextRendererFontSize:")), with: 14) mediaPlayer.wrappedValue.perform(Selector(("setTextRendererFont:")), with: "Copperplate") mediaPlayer.wrappedValue.play() mediaPlayer.wrappedValue.jumpForward(Int32(startTime/10000000)) } } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func layoutSubviews() { super.layoutSubviews() } }