@capgo/capacitor-video-player 7.1.4 → 7.2.1
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.
- package/README.md +2 -27
- package/android/src/main/java/com/capgo/videoplayer/VideoPlayer.java +0 -4
- package/android/src/main/java/com/capgo/videoplayer/VideoPlayerPlugin.java +1 -10
- package/dist/docs.json +0 -35
- package/dist/esm/definitions.d.ts +0 -5
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/web.d.ts +1 -2
- package/dist/esm/web.js +0 -3
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +0 -3
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +0 -3
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/VideoPlayerPlugin/FullscreenVideoPlayer.swift +239 -0
- package/ios/Sources/VideoPlayerPlugin/VideoPlayerPlugin.swift +465 -9
- package/package.json +1 -1
- package/ios/Sources/VideoPlayerPlugin/VideoPlayer.swift +0 -8
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import Capacitor
|
|
3
|
+
import AVKit
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Please read the Capacitor iOS Plugin Development Guide
|
|
@@ -7,24 +8,479 @@ import Capacitor
|
|
|
7
8
|
*/
|
|
8
9
|
@objc(VideoPlayerPlugin)
|
|
9
10
|
public class VideoPlayerPlugin: CAPPlugin, CAPBridgedPlugin {
|
|
10
|
-
private let PLUGIN_VERSION: String = "7.1
|
|
11
|
+
private let PLUGIN_VERSION: String = "7.2.1"
|
|
11
12
|
public let identifier = "VideoPlayerPlugin"
|
|
12
13
|
public let jsName = "VideoPlayer"
|
|
13
14
|
public let pluginMethods: [CAPPluginMethod] = [
|
|
14
|
-
CAPPluginMethod(name: "
|
|
15
|
-
CAPPluginMethod(name: "
|
|
15
|
+
CAPPluginMethod(name: "getPluginVersion", returnType: CAPPluginReturnPromise),
|
|
16
|
+
CAPPluginMethod(name: "initPlayer", returnType: CAPPluginReturnPromise),
|
|
17
|
+
CAPPluginMethod(name: "isPlaying", returnType: CAPPluginReturnPromise),
|
|
18
|
+
CAPPluginMethod(name: "play", returnType: CAPPluginReturnPromise),
|
|
19
|
+
CAPPluginMethod(name: "pause", returnType: CAPPluginReturnPromise),
|
|
20
|
+
CAPPluginMethod(name: "getDuration", returnType: CAPPluginReturnPromise),
|
|
21
|
+
CAPPluginMethod(name: "getCurrentTime", returnType: CAPPluginReturnPromise),
|
|
22
|
+
CAPPluginMethod(name: "setCurrentTime", returnType: CAPPluginReturnPromise),
|
|
23
|
+
CAPPluginMethod(name: "getVolume", returnType: CAPPluginReturnPromise),
|
|
24
|
+
CAPPluginMethod(name: "setVolume", returnType: CAPPluginReturnPromise),
|
|
25
|
+
CAPPluginMethod(name: "getMuted", returnType: CAPPluginReturnPromise),
|
|
26
|
+
CAPPluginMethod(name: "setMuted", returnType: CAPPluginReturnPromise),
|
|
27
|
+
CAPPluginMethod(name: "setRate", returnType: CAPPluginReturnPromise),
|
|
28
|
+
CAPPluginMethod(name: "getRate", returnType: CAPPluginReturnPromise),
|
|
29
|
+
CAPPluginMethod(name: "stopAllPlayers", returnType: CAPPluginReturnPromise),
|
|
30
|
+
CAPPluginMethod(name: "showController", returnType: CAPPluginReturnPromise),
|
|
31
|
+
CAPPluginMethod(name: "isControllerIsFullyVisible", returnType: CAPPluginReturnPromise),
|
|
32
|
+
CAPPluginMethod(name: "exitPlayer", returnType: CAPPluginReturnPromise)
|
|
16
33
|
]
|
|
17
|
-
private let implementation = VideoPlayer()
|
|
18
34
|
|
|
19
|
-
|
|
20
|
-
|
|
35
|
+
private var videoPlayers: [String: FullscreenVideoPlayer] = [:]
|
|
36
|
+
private var currentPlayerId: String?
|
|
37
|
+
|
|
38
|
+
@objc func getPluginVersion(_ call: CAPPluginCall) {
|
|
39
|
+
call.resolve(["version": self.PLUGIN_VERSION])
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@objc func initPlayer(_ call: CAPPluginCall) {
|
|
43
|
+
guard let playerId = call.getString("playerId") else {
|
|
44
|
+
call.resolve([
|
|
45
|
+
"result": false,
|
|
46
|
+
"method": "initPlayer",
|
|
47
|
+
"message": "Must provide a PlayerId"
|
|
48
|
+
])
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
guard let url = call.getString("url") else {
|
|
53
|
+
call.resolve([
|
|
54
|
+
"result": false,
|
|
55
|
+
"method": "initPlayer",
|
|
56
|
+
"message": "Must provide an url"
|
|
57
|
+
])
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let mode = call.getString("mode") ?? "fullscreen"
|
|
62
|
+
guard mode == "fullscreen" else {
|
|
63
|
+
call.resolve([
|
|
64
|
+
"result": false,
|
|
65
|
+
"method": "initPlayer",
|
|
66
|
+
"message": "Only fullscreen mode is supported on iOS"
|
|
67
|
+
])
|
|
68
|
+
return
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let rate = call.getFloat("rate") ?? 1.0
|
|
72
|
+
let exitOnEnd = call.getBool("exitOnEnd") ?? true
|
|
73
|
+
let loopOnEnd = call.getBool("loopOnEnd") ?? false
|
|
74
|
+
let pipEnabled = call.getBool("pipEnabled") ?? true
|
|
75
|
+
let showControls = call.getBool("showControls") ?? true
|
|
76
|
+
|
|
77
|
+
// Create video player
|
|
78
|
+
let player = FullscreenVideoPlayer(
|
|
79
|
+
playerId: playerId,
|
|
80
|
+
url: url,
|
|
81
|
+
rate: rate,
|
|
82
|
+
exitOnEnd: exitOnEnd,
|
|
83
|
+
loopOnEnd: loopOnEnd,
|
|
84
|
+
pipEnabled: pipEnabled,
|
|
85
|
+
showControls: showControls
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
player.setupPlayer()
|
|
89
|
+
|
|
90
|
+
// Setup callbacks
|
|
91
|
+
player.setOnPlay { [weak self] in
|
|
92
|
+
self?.notifyListeners("jeepCapVideoPlayerPlay", data: [
|
|
93
|
+
"fromPlayerId": playerId,
|
|
94
|
+
"currentTime": player.getCurrentTime()
|
|
95
|
+
])
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
player.setOnPause { [weak self] in
|
|
99
|
+
self?.notifyListeners("jeepCapVideoPlayerPause", data: [
|
|
100
|
+
"fromPlayerId": playerId,
|
|
101
|
+
"currentTime": player.getCurrentTime()
|
|
102
|
+
])
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
player.setOnReady { [weak self] in
|
|
106
|
+
self?.notifyListeners("jeepCapVideoPlayerReady", data: [
|
|
107
|
+
"fromPlayerId": playerId,
|
|
108
|
+
"currentTime": 0
|
|
109
|
+
])
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
player.setOnEnd { [weak self] in
|
|
113
|
+
self?.notifyListeners("jeepCapVideoPlayerEnded", data: [
|
|
114
|
+
"fromPlayerId": playerId,
|
|
115
|
+
"currentTime": player.getCurrentTime()
|
|
116
|
+
])
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
player.setOnExit { [weak self] currentTime in
|
|
120
|
+
self?.videoPlayers.removeValue(forKey: playerId)
|
|
121
|
+
if self?.currentPlayerId == playerId {
|
|
122
|
+
self?.currentPlayerId = nil
|
|
123
|
+
}
|
|
124
|
+
self?.notifyListeners("jeepCapVideoPlayerExit", data: [
|
|
125
|
+
"dismiss": true,
|
|
126
|
+
"currentTime": currentTime
|
|
127
|
+
])
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Store player
|
|
131
|
+
videoPlayers[playerId] = player
|
|
132
|
+
currentPlayerId = playerId
|
|
133
|
+
|
|
134
|
+
// Present player
|
|
135
|
+
DispatchQueue.main.async {
|
|
136
|
+
guard let viewController = self.bridge?.viewController else {
|
|
137
|
+
call.resolve([
|
|
138
|
+
"result": false,
|
|
139
|
+
"method": "initPlayer",
|
|
140
|
+
"message": "Unable to get view controller"
|
|
141
|
+
])
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
player.present(on: viewController) {
|
|
146
|
+
call.resolve([
|
|
147
|
+
"result": true,
|
|
148
|
+
"method": "initPlayer",
|
|
149
|
+
"value": playerId
|
|
150
|
+
])
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@objc func isPlaying(_ call: CAPPluginCall) {
|
|
156
|
+
guard let playerId = call.getString("playerId"),
|
|
157
|
+
let player = videoPlayers[playerId] else {
|
|
158
|
+
call.resolve([
|
|
159
|
+
"result": false,
|
|
160
|
+
"method": "isPlaying",
|
|
161
|
+
"message": "Player not found"
|
|
162
|
+
])
|
|
163
|
+
return
|
|
164
|
+
}
|
|
165
|
+
|
|
21
166
|
call.resolve([
|
|
22
|
-
"
|
|
167
|
+
"result": true,
|
|
168
|
+
"method": "isPlaying",
|
|
169
|
+
"value": player.isPlaying()
|
|
23
170
|
])
|
|
24
171
|
}
|
|
25
172
|
|
|
26
|
-
@objc func
|
|
27
|
-
call.
|
|
173
|
+
@objc func play(_ call: CAPPluginCall) {
|
|
174
|
+
guard let playerId = call.getString("playerId"),
|
|
175
|
+
let player = videoPlayers[playerId] else {
|
|
176
|
+
call.resolve([
|
|
177
|
+
"result": false,
|
|
178
|
+
"method": "play",
|
|
179
|
+
"message": "Player not found"
|
|
180
|
+
])
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
player.play()
|
|
185
|
+
call.resolve([
|
|
186
|
+
"result": true,
|
|
187
|
+
"method": "play",
|
|
188
|
+
"value": true
|
|
189
|
+
])
|
|
28
190
|
}
|
|
29
191
|
|
|
192
|
+
@objc func pause(_ call: CAPPluginCall) {
|
|
193
|
+
guard let playerId = call.getString("playerId"),
|
|
194
|
+
let player = videoPlayers[playerId] else {
|
|
195
|
+
call.resolve([
|
|
196
|
+
"result": false,
|
|
197
|
+
"method": "pause",
|
|
198
|
+
"message": "Player not found"
|
|
199
|
+
])
|
|
200
|
+
return
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
player.pause()
|
|
204
|
+
call.resolve([
|
|
205
|
+
"result": true,
|
|
206
|
+
"method": "pause",
|
|
207
|
+
"value": true
|
|
208
|
+
])
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
@objc func getDuration(_ call: CAPPluginCall) {
|
|
212
|
+
guard let playerId = call.getString("playerId"),
|
|
213
|
+
let player = videoPlayers[playerId] else {
|
|
214
|
+
call.resolve([
|
|
215
|
+
"result": false,
|
|
216
|
+
"method": "getDuration",
|
|
217
|
+
"message": "Player not found"
|
|
218
|
+
])
|
|
219
|
+
return
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
let duration = player.getDuration()
|
|
223
|
+
call.resolve([
|
|
224
|
+
"result": true,
|
|
225
|
+
"method": "getDuration",
|
|
226
|
+
"value": duration
|
|
227
|
+
])
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
@objc func getCurrentTime(_ call: CAPPluginCall) {
|
|
231
|
+
guard let playerId = call.getString("playerId"),
|
|
232
|
+
let player = videoPlayers[playerId] else {
|
|
233
|
+
call.resolve([
|
|
234
|
+
"result": false,
|
|
235
|
+
"method": "getCurrentTime",
|
|
236
|
+
"message": "Player not found"
|
|
237
|
+
])
|
|
238
|
+
return
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
let currentTime = player.getCurrentTime()
|
|
242
|
+
call.resolve([
|
|
243
|
+
"result": true,
|
|
244
|
+
"method": "getCurrentTime",
|
|
245
|
+
"value": currentTime
|
|
246
|
+
])
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
@objc func setCurrentTime(_ call: CAPPluginCall) {
|
|
250
|
+
guard let playerId = call.getString("playerId"),
|
|
251
|
+
let player = videoPlayers[playerId] else {
|
|
252
|
+
call.resolve([
|
|
253
|
+
"result": false,
|
|
254
|
+
"method": "setCurrentTime",
|
|
255
|
+
"message": "Player not found"
|
|
256
|
+
])
|
|
257
|
+
return
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
guard let seektime = call.getDouble("seektime") else {
|
|
261
|
+
call.resolve([
|
|
262
|
+
"result": false,
|
|
263
|
+
"method": "setCurrentTime",
|
|
264
|
+
"message": "Must provide a time in seconds"
|
|
265
|
+
])
|
|
266
|
+
return
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
player.setCurrentTime(seektime)
|
|
270
|
+
call.resolve([
|
|
271
|
+
"result": true,
|
|
272
|
+
"method": "setCurrentTime",
|
|
273
|
+
"value": seektime
|
|
274
|
+
])
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
@objc func getVolume(_ call: CAPPluginCall) {
|
|
278
|
+
guard let playerId = call.getString("playerId"),
|
|
279
|
+
let player = videoPlayers[playerId] else {
|
|
280
|
+
call.resolve([
|
|
281
|
+
"result": false,
|
|
282
|
+
"method": "getVolume",
|
|
283
|
+
"message": "Player not found"
|
|
284
|
+
])
|
|
285
|
+
return
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
let volume = player.getVolume()
|
|
289
|
+
call.resolve([
|
|
290
|
+
"result": true,
|
|
291
|
+
"method": "getVolume",
|
|
292
|
+
"value": volume
|
|
293
|
+
])
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
@objc func setVolume(_ call: CAPPluginCall) {
|
|
297
|
+
guard let playerId = call.getString("playerId"),
|
|
298
|
+
let player = videoPlayers[playerId] else {
|
|
299
|
+
call.resolve([
|
|
300
|
+
"result": false,
|
|
301
|
+
"method": "setVolume",
|
|
302
|
+
"message": "Player not found"
|
|
303
|
+
])
|
|
304
|
+
return
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
guard let volume = call.getFloat("volume") else {
|
|
308
|
+
call.resolve([
|
|
309
|
+
"result": false,
|
|
310
|
+
"method": "setVolume",
|
|
311
|
+
"message": "Must provide a volume value"
|
|
312
|
+
])
|
|
313
|
+
return
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
player.setVolume(volume)
|
|
317
|
+
call.resolve([
|
|
318
|
+
"result": true,
|
|
319
|
+
"method": "setVolume",
|
|
320
|
+
"value": volume
|
|
321
|
+
])
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
@objc func getMuted(_ call: CAPPluginCall) {
|
|
325
|
+
guard let playerId = call.getString("playerId"),
|
|
326
|
+
let player = videoPlayers[playerId] else {
|
|
327
|
+
call.resolve([
|
|
328
|
+
"result": false,
|
|
329
|
+
"method": "getMuted",
|
|
330
|
+
"message": "Player not found"
|
|
331
|
+
])
|
|
332
|
+
return
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
let muted = player.getMuted()
|
|
336
|
+
call.resolve([
|
|
337
|
+
"result": true,
|
|
338
|
+
"method": "getMuted",
|
|
339
|
+
"value": muted
|
|
340
|
+
])
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
@objc func setMuted(_ call: CAPPluginCall) {
|
|
344
|
+
guard let playerId = call.getString("playerId"),
|
|
345
|
+
let player = videoPlayers[playerId] else {
|
|
346
|
+
call.resolve([
|
|
347
|
+
"result": false,
|
|
348
|
+
"method": "setMuted",
|
|
349
|
+
"message": "Player not found"
|
|
350
|
+
])
|
|
351
|
+
return
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
guard let muted = call.getBool("muted") else {
|
|
355
|
+
call.resolve([
|
|
356
|
+
"result": false,
|
|
357
|
+
"method": "setMuted",
|
|
358
|
+
"message": "Must provide a boolean value"
|
|
359
|
+
])
|
|
360
|
+
return
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
player.setMuted(muted)
|
|
364
|
+
call.resolve([
|
|
365
|
+
"result": true,
|
|
366
|
+
"method": "setMuted",
|
|
367
|
+
"value": muted
|
|
368
|
+
])
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
@objc func getRate(_ call: CAPPluginCall) {
|
|
372
|
+
guard let playerId = call.getString("playerId"),
|
|
373
|
+
let player = videoPlayers[playerId] else {
|
|
374
|
+
call.resolve([
|
|
375
|
+
"result": false,
|
|
376
|
+
"method": "getRate",
|
|
377
|
+
"message": "Player not found"
|
|
378
|
+
])
|
|
379
|
+
return
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
let rate = player.getRate()
|
|
383
|
+
call.resolve([
|
|
384
|
+
"result": true,
|
|
385
|
+
"method": "getRate",
|
|
386
|
+
"value": rate
|
|
387
|
+
])
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
@objc func setRate(_ call: CAPPluginCall) {
|
|
391
|
+
guard let playerId = call.getString("playerId"),
|
|
392
|
+
let player = videoPlayers[playerId] else {
|
|
393
|
+
call.resolve([
|
|
394
|
+
"result": false,
|
|
395
|
+
"method": "setRate",
|
|
396
|
+
"message": "Player not found"
|
|
397
|
+
])
|
|
398
|
+
return
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
guard let rate = call.getFloat("rate") else {
|
|
402
|
+
call.resolve([
|
|
403
|
+
"result": false,
|
|
404
|
+
"method": "setRate",
|
|
405
|
+
"message": "Must provide a rate value"
|
|
406
|
+
])
|
|
407
|
+
return
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
player.setRate(rate)
|
|
411
|
+
call.resolve([
|
|
412
|
+
"result": true,
|
|
413
|
+
"method": "setRate",
|
|
414
|
+
"value": rate
|
|
415
|
+
])
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
@objc func stopAllPlayers(_ call: CAPPluginCall) {
|
|
419
|
+
for (_, player) in videoPlayers {
|
|
420
|
+
player.pause()
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
call.resolve([
|
|
424
|
+
"result": true,
|
|
425
|
+
"method": "stopAllPlayers",
|
|
426
|
+
"value": true
|
|
427
|
+
])
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
@objc func showController(_ call: CAPPluginCall) {
|
|
431
|
+
guard let playerId = currentPlayerId,
|
|
432
|
+
let player = videoPlayers[playerId] else {
|
|
433
|
+
call.resolve([
|
|
434
|
+
"result": false,
|
|
435
|
+
"method": "showController",
|
|
436
|
+
"message": "No active player"
|
|
437
|
+
])
|
|
438
|
+
return
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
player.showController()
|
|
442
|
+
call.resolve([
|
|
443
|
+
"result": true,
|
|
444
|
+
"method": "showController",
|
|
445
|
+
"value": true
|
|
446
|
+
])
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
@objc func isControllerIsFullyVisible(_ call: CAPPluginCall) {
|
|
450
|
+
guard let playerId = currentPlayerId,
|
|
451
|
+
let player = videoPlayers[playerId] else {
|
|
452
|
+
call.resolve([
|
|
453
|
+
"result": false,
|
|
454
|
+
"method": "isControllerIsFullyVisible",
|
|
455
|
+
"message": "No active player"
|
|
456
|
+
])
|
|
457
|
+
return
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
let visible = player.isControllerVisible()
|
|
461
|
+
call.resolve([
|
|
462
|
+
"result": true,
|
|
463
|
+
"method": "isControllerIsFullyVisible",
|
|
464
|
+
"value": visible
|
|
465
|
+
])
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
@objc func exitPlayer(_ call: CAPPluginCall) {
|
|
469
|
+
guard let playerId = currentPlayerId,
|
|
470
|
+
let player = videoPlayers[playerId] else {
|
|
471
|
+
call.resolve([
|
|
472
|
+
"result": false,
|
|
473
|
+
"method": "exitPlayer",
|
|
474
|
+
"message": "No active player"
|
|
475
|
+
])
|
|
476
|
+
return
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
player.dismiss()
|
|
480
|
+
call.resolve([
|
|
481
|
+
"result": true,
|
|
482
|
+
"method": "exitPlayer",
|
|
483
|
+
"value": true
|
|
484
|
+
])
|
|
485
|
+
}
|
|
30
486
|
}
|
package/package.json
CHANGED