@capgo/capacitor-video-player 7.1.3 → 7.2.0

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.
@@ -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.3"
11
+ private let PLUGIN_VERSION: String = "7.2.0"
11
12
  public let identifier = "VideoPlayerPlugin"
12
13
  public let jsName = "VideoPlayer"
13
14
  public let pluginMethods: [CAPPluginMethod] = [
14
- CAPPluginMethod(name: "echo", returnType: CAPPluginReturnPromise),
15
- CAPPluginMethod(name: "getPluginVersion", returnType: CAPPluginReturnPromise)
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
- @objc func echo(_ call: CAPPluginCall) {
20
- let value = call.getString("value") ?? ""
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
- "value": implementation.echo(value)
167
+ "result": true,
168
+ "method": "isPlaying",
169
+ "value": player.isPlaying()
23
170
  ])
24
171
  }
25
172
 
26
- @objc func getPluginVersion(_ call: CAPPluginCall) {
27
- call.resolve(["version": self.PLUGIN_VERSION])
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capgo/capacitor-video-player",
3
- "version": "7.1.3",
3
+ "version": "7.2.0",
4
4
  "description": "Capacitor plugin to play video in native player",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "module": "dist/esm/index.js",
@@ -1,8 +0,0 @@
1
- import Foundation
2
-
3
- @objc public class VideoPlayer: NSObject {
4
- @objc public func echo(_ value: String) -> String {
5
- print(value)
6
- return value
7
- }
8
- }