@capgo/capacitor-jw-player 0.0.22 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -16,7 +16,7 @@ protocol CallbackHandler {
|
|
|
16
16
|
|
|
17
17
|
@objc(JwPlayerPlugin)
|
|
18
18
|
public class JwPlayerPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
19
|
-
// public class JwPlayerPlugin: CAPPlugin, CAPBridgedPlugin, GCKLoggerDelegate {
|
|
19
|
+
// public class JwPlayerPlugin: CAPPlugin, CAPBridgedPlugin, GCKLoggerDelegate {
|
|
20
20
|
public let identifier = "JwPlayerPlugin"
|
|
21
21
|
public let jsName = "JwPlayer"
|
|
22
22
|
public let pluginMethods: [CAPPluginMethod] = [
|
|
@@ -138,25 +138,25 @@ public class JwPlayerPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
|
138
138
|
var config: JWPlayerConfiguration?
|
|
139
139
|
do {
|
|
140
140
|
switch mediaType {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
141
|
+
case "video":
|
|
142
|
+
print("[JWPlayer] Creating video configuration")
|
|
143
|
+
let item = try JWPlayerItemBuilder()
|
|
144
|
+
.file(mediaUrl)
|
|
145
|
+
.build()
|
|
146
|
+
config = try JWPlayerConfigurationBuilder()
|
|
147
|
+
.playlist(items: [item])
|
|
148
|
+
.autostart(autostart)
|
|
149
|
+
.build()
|
|
150
|
+
case "playlist":
|
|
151
|
+
print("[JWPlayer] Creating playlist configuration")
|
|
152
|
+
config = try JWPlayerConfigurationBuilder()
|
|
153
|
+
.playlist(url: mediaUrl)
|
|
154
|
+
.autostart(autostart)
|
|
155
|
+
.build()
|
|
156
|
+
default:
|
|
157
|
+
print("[JWPlayer] Error: Invalid mediaType: \(mediaType)")
|
|
158
|
+
call.reject("Invalid mediaType. Must be either video or playlist")
|
|
159
|
+
return
|
|
160
160
|
}
|
|
161
161
|
} catch {
|
|
162
162
|
print("[JWPlayer] Error creating configuration: \(error.localizedDescription)")
|
|
@@ -529,9 +529,9 @@ extension JwPlayerPlugin: CallbackHandler {
|
|
|
529
529
|
self.viewController = nil
|
|
530
530
|
self.notifyListeners("playerDismissed", data: nil)
|
|
531
531
|
} else {
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
532
|
+
print("[JWPlayer] PiP dismissal detected, keeping VC reference for potential restore.")
|
|
533
|
+
// Optionally notify JS that PiP started if needed
|
|
534
|
+
self.notifyListeners("pipStarted", data: nil)
|
|
535
535
|
}
|
|
536
536
|
}
|
|
537
537
|
|
|
@@ -548,9 +548,9 @@ extension JwPlayerPlugin: CallbackHandler {
|
|
|
548
548
|
|
|
549
549
|
// Ensure it's not already being presented or presenting something else
|
|
550
550
|
if vc.isBeingPresented || vc.presentingViewController != nil || bridgeVC.presentedViewController != nil {
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
551
|
+
print("[JWPlayer] Warning: Cannot re-present, presentation context busy.")
|
|
552
|
+
return
|
|
553
|
+
}
|
|
554
554
|
|
|
555
555
|
DispatchQueue.main.async {
|
|
556
556
|
print("[JWPlayer] Re-presenting player view controller")
|
|
@@ -643,7 +643,7 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
643
643
|
print("[JWPlayer] Configuring player from init config")
|
|
644
644
|
player.configurePlayer(with: config)
|
|
645
645
|
print("[JWPlayer] Player configured successfully from init config")
|
|
646
|
-
|
|
646
|
+
|
|
647
647
|
// JWPlayerViewController already has self as delegates
|
|
648
648
|
// We are just implementing the delegate methods
|
|
649
649
|
} else {
|
|
@@ -653,34 +653,34 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
653
653
|
|
|
654
654
|
// Add the custom close button
|
|
655
655
|
setupCloseButton()
|
|
656
|
-
|
|
656
|
+
|
|
657
657
|
// Start time update timer after player is ready
|
|
658
658
|
startTimeUpdateTimer()
|
|
659
659
|
}
|
|
660
|
-
|
|
660
|
+
|
|
661
661
|
// Start a timer to emit time updates periodically
|
|
662
662
|
private func startTimeUpdateTimer() {
|
|
663
663
|
// Cancel any existing timer
|
|
664
664
|
timeUpdateTimer?.invalidate()
|
|
665
|
-
|
|
665
|
+
|
|
666
666
|
// Create a new timer that fires every second
|
|
667
667
|
timeUpdateTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
|
|
668
668
|
guard let self = self else { return }
|
|
669
|
-
|
|
669
|
+
|
|
670
670
|
if self.player.getState() == .playing {
|
|
671
671
|
let position = self.player.time.position
|
|
672
672
|
let duration = self.player.time.duration
|
|
673
|
-
|
|
673
|
+
|
|
674
674
|
let timeData: [String: Any] = [
|
|
675
675
|
"position": position,
|
|
676
676
|
"duration": duration
|
|
677
677
|
]
|
|
678
|
-
|
|
678
|
+
|
|
679
679
|
self.callbackHandler?.notifyEventListener("time", data: timeData)
|
|
680
680
|
}
|
|
681
681
|
}
|
|
682
682
|
}
|
|
683
|
-
|
|
683
|
+
|
|
684
684
|
// Stop the time update timer
|
|
685
685
|
private func stopTimeUpdateTimer() {
|
|
686
686
|
timeUpdateTimer?.invalidate()
|
|
@@ -695,7 +695,7 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
695
695
|
|
|
696
696
|
override func viewWillDisappear(_ animated: Bool) {
|
|
697
697
|
super.viewWillDisappear(animated)
|
|
698
|
-
|
|
698
|
+
|
|
699
699
|
// Stop the time update timer when view disappears
|
|
700
700
|
stopTimeUpdateTimer()
|
|
701
701
|
|
|
@@ -742,19 +742,19 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
742
742
|
@objc private func closeButtonTapped() {
|
|
743
743
|
print("[JWPlayer] Custom close button tapped - dismissing player manually")
|
|
744
744
|
self.dismiss(animated: true) { [weak self] in
|
|
745
|
-
|
|
746
|
-
|
|
745
|
+
// Use the new callback signature
|
|
746
|
+
self?.callbackHandler?.onPlayerDismissed(isPiPDismissal: false)
|
|
747
747
|
}
|
|
748
748
|
}
|
|
749
749
|
|
|
750
750
|
// MARK: - JWPlayerDelegate Methods
|
|
751
|
-
|
|
751
|
+
|
|
752
752
|
override func jwplayerIsReady(_ player: JWPlayer) {
|
|
753
753
|
super.jwplayerIsReady(player)
|
|
754
754
|
print("[JWPlayer] Player is ready")
|
|
755
755
|
callbackHandler?.notifyEventListener("ready", data: nil)
|
|
756
756
|
}
|
|
757
|
-
|
|
757
|
+
|
|
758
758
|
override func jwplayer(_ player: JWPlayer, failedWithError code: UInt, message: String) {
|
|
759
759
|
super.jwplayer(player, failedWithError: code, message: message)
|
|
760
760
|
print("[JWPlayer] Error: \(message), code: \(code)")
|
|
@@ -764,7 +764,7 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
764
764
|
]
|
|
765
765
|
callbackHandler?.notifyEventListener("error", data: errorData)
|
|
766
766
|
}
|
|
767
|
-
|
|
767
|
+
|
|
768
768
|
override func jwplayer(_ player: JWPlayer, failedWithSetupError code: UInt, message: String) {
|
|
769
769
|
super.jwplayer(player, failedWithSetupError: code, message: message)
|
|
770
770
|
print("[JWPlayer] Setup error: \(message), code: \(code)")
|
|
@@ -774,27 +774,27 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
774
774
|
]
|
|
775
775
|
callbackHandler?.notifyEventListener("error", data: errorData)
|
|
776
776
|
}
|
|
777
|
-
|
|
777
|
+
|
|
778
778
|
// MARK: - JWPlayerStateDelegate Methods
|
|
779
|
-
|
|
779
|
+
|
|
780
780
|
override func jwplayer(_ player: JWPlayer, isPlayingWithReason reason: JWPlayReason) {
|
|
781
781
|
super.jwplayer(player, isPlayingWithReason: reason)
|
|
782
782
|
print("[JWPlayer] Playing with reason: \(reason)")
|
|
783
783
|
callbackHandler?.notifyEventListener("play", data: ["reason": reason.rawValue])
|
|
784
784
|
}
|
|
785
|
-
|
|
785
|
+
|
|
786
786
|
override func jwplayer(_ player: JWPlayer, didPauseWithReason reason: JWPauseReason) {
|
|
787
787
|
super.jwplayer(player, didPauseWithReason: reason)
|
|
788
788
|
print("[JWPlayer] Paused with reason: \(reason)")
|
|
789
789
|
callbackHandler?.notifyEventListener("pause", data: ["reason": reason.rawValue])
|
|
790
790
|
}
|
|
791
|
-
|
|
791
|
+
|
|
792
792
|
override func jwplayerContentDidComplete(_ player: JWPlayer) {
|
|
793
793
|
super.jwplayerContentDidComplete(player)
|
|
794
794
|
print("[JWPlayer] Content completed")
|
|
795
795
|
callbackHandler?.notifyEventListener("complete", data: nil)
|
|
796
796
|
}
|
|
797
|
-
|
|
797
|
+
|
|
798
798
|
override func jwplayer(_ player: JWPlayer, seekedFrom position: TimeInterval, to offset: TimeInterval) {
|
|
799
799
|
super.jwplayer(player, seekedFrom: position, to: offset)
|
|
800
800
|
print("[JWPlayer] Seeked from \(position) to \(offset)")
|
|
@@ -804,26 +804,26 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
804
804
|
]
|
|
805
805
|
callbackHandler?.notifyEventListener("seek", data: seekData)
|
|
806
806
|
}
|
|
807
|
-
|
|
807
|
+
|
|
808
808
|
override func jwplayerHasSeeked(_ player: JWPlayer) {
|
|
809
809
|
super.jwplayerHasSeeked(player)
|
|
810
810
|
print("[JWPlayer] Seeked")
|
|
811
811
|
callbackHandler?.notifyEventListener("seeked", data: nil)
|
|
812
812
|
}
|
|
813
|
-
|
|
813
|
+
|
|
814
814
|
override func jwplayer(_ player: JWPlayer, didLoadPlaylistItem item: JWPlayerItem, at index: UInt) {
|
|
815
815
|
super.jwplayer(player, didLoadPlaylistItem: item, at: index)
|
|
816
816
|
print("[JWPlayer] Playlist item loaded at index: \(index)")
|
|
817
817
|
var itemData: [String: Any] = ["index": index]
|
|
818
|
-
|
|
818
|
+
|
|
819
819
|
// Add title if available
|
|
820
820
|
if let title = item.title, !title.isEmpty {
|
|
821
821
|
itemData["title"] = title
|
|
822
822
|
}
|
|
823
|
-
|
|
823
|
+
|
|
824
824
|
callbackHandler?.notifyEventListener("playlistItem", data: itemData)
|
|
825
825
|
}
|
|
826
|
-
|
|
826
|
+
|
|
827
827
|
override func jwplayerPlaylistHasCompleted(_ player: JWPlayer) {
|
|
828
828
|
super.jwplayerPlaylistHasCompleted(player)
|
|
829
829
|
print("[JWPlayer] Playlist completed")
|
|
@@ -840,7 +840,7 @@ class CustomPlayerViewController: JWPlayerViewController, JWPlayerViewController
|
|
|
840
840
|
// Ensure closeButton is not nil before accessing
|
|
841
841
|
guard let button = self.closeButton else { return }
|
|
842
842
|
button.alpha = targetAlpha
|
|
843
|
-
|
|
843
|
+
|
|
844
844
|
// Emit controlsChanged event to match other platforms
|
|
845
845
|
callbackHandler?.notifyEventListener("controlsChanged", data: ["visible": isVisible])
|
|
846
846
|
}
|