capacitor-plugin-playlist 0.8.6 → 0.9.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.
- package/README.md +28 -0
- package/android/build.gradle +6 -18
- package/android/src/main/java/org/dwbn/plugins/playlist/PlaylistPlugin.kt +72 -32
- package/android/src/main/java/org/dwbn/plugins/playlist/RmxAudioPlayer.java +32 -0
- package/dist/docs.json +72 -0
- package/dist/esm/RmxAudioPlayer.js +14 -3
- package/dist/esm/RmxAudioPlayer.js.map +1 -1
- package/dist/esm/definitions.d.ts +19 -0
- package/dist/esm/web.d.ts +8 -0
- package/dist/esm/web.js +39 -24
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +55 -27
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +55 -27
- package/dist/plugin.js.map +1 -1
- package/ios/Plugin/AudioTrack.swift +6 -1
- package/ios/Plugin/Plugin.m +0 -1
- package/ios/Plugin/Plugin.swift +33 -16
- package/ios/Plugin/RmxAudioPlayer.swift +79 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -89,6 +89,34 @@ architect => build => options:
|
|
|
89
89
|
</application>
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
+
##### Gradle Configuration (Gradle 9+)
|
|
93
|
+
|
|
94
|
+
**Important**: If you're using Gradle 9 or later, you need to ensure the Kotlin plugin is declared in your root `android/build.gradle` file. This plugin no longer includes its own `buildscript` block to avoid conflicts with Gradle 9's plugin loading requirements.
|
|
95
|
+
|
|
96
|
+
Add the Kotlin plugin to your root `android/build.gradle`:
|
|
97
|
+
|
|
98
|
+
```gradle
|
|
99
|
+
buildscript {
|
|
100
|
+
ext.kotlin_version = '2.3.0' // Or your preferred Kotlin version
|
|
101
|
+
|
|
102
|
+
repositories {
|
|
103
|
+
google()
|
|
104
|
+
mavenCentral()
|
|
105
|
+
}
|
|
106
|
+
dependencies {
|
|
107
|
+
classpath 'com.android.tools.build:gradle:8.13.2'
|
|
108
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
109
|
+
// ... other dependencies
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
ext {
|
|
114
|
+
kotlin_version = '2.3.0' // Make it available to subprojects
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The plugin's `build.gradle` will automatically use the Kotlin plugin from the root project. If you see a warning about the Kotlin plugin being loaded multiple times, ensure you've removed any `buildscript` blocks that declare the Kotlin plugin from other subprojects (except the root project).
|
|
119
|
+
|
|
92
120
|
##### Glide image loading for notifiction center
|
|
93
121
|
|
|
94
122
|
To be able to use glide you need to create a file MyAppGlideModule.java:
|
package/android/build.gradle
CHANGED
|
@@ -6,18 +6,6 @@ ext {
|
|
|
6
6
|
androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.7.0'
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
buildscript {
|
|
10
|
-
ext.kotlin_version = project.hasProperty("kotlin_version") ? rootProject.ext.kotlin_version : '2.2.20'
|
|
11
|
-
repositories {
|
|
12
|
-
google()
|
|
13
|
-
mavenCentral()
|
|
14
|
-
}
|
|
15
|
-
dependencies {
|
|
16
|
-
classpath 'com.android.tools.build:gradle:8.13.0'
|
|
17
|
-
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
9
|
apply plugin: 'com.android.library'
|
|
22
10
|
apply plugin: 'kotlin-android'
|
|
23
11
|
|
|
@@ -64,18 +52,18 @@ dependencies {
|
|
|
64
52
|
testImplementation "junit:junit:$junitVersion"
|
|
65
53
|
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
|
|
66
54
|
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
|
|
67
|
-
implementation "androidx.core:core-ktx:1.
|
|
68
|
-
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
55
|
+
implementation "androidx.core:core-ktx:1.17.0"
|
|
56
|
+
implementation "org.jetbrains.kotlin:kotlin-stdlib:${rootProject.ext.kotlin_version}"
|
|
69
57
|
|
|
70
58
|
// Image Exomedia
|
|
71
|
-
implementation 'com.devbrackets.android:exomedia:5.
|
|
59
|
+
implementation 'com.devbrackets.android:exomedia:5.2.0'
|
|
72
60
|
|
|
73
61
|
// Image Loading
|
|
74
|
-
implementation 'com.github.bumptech.glide:glide:
|
|
75
|
-
annotationProcessor 'com.github.bumptech.glide:compiler:
|
|
62
|
+
implementation 'com.github.bumptech.glide:glide:5.0.5'
|
|
63
|
+
annotationProcessor 'com.github.bumptech.glide:compiler:5.0.5'
|
|
76
64
|
|
|
77
65
|
// Playlist support
|
|
78
66
|
implementation 'com.devbrackets.android:playlistcore:2.2.0'
|
|
79
|
-
implementation 'androidx.work:work-runtime-ktx:2.
|
|
67
|
+
implementation 'androidx.work:work-runtime-ktx:2.11.0'
|
|
80
68
|
|
|
81
69
|
}
|
|
@@ -37,7 +37,9 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
37
37
|
fun setOptions(call: PluginCall) {
|
|
38
38
|
Handler(Looper.getMainLooper()).post {
|
|
39
39
|
val options: JSObject = call.getObject("options") ?: JSObject()
|
|
40
|
-
resetStreamOnPause
|
|
40
|
+
// resetStreamOnPause is a top-level option; "options" is reserved for notification options.
|
|
41
|
+
resetStreamOnPause =
|
|
42
|
+
call.getBoolean("resetStreamOnPause", this.resetStreamOnPause) ?: this.resetStreamOnPause
|
|
41
43
|
Log.i("AudioPlayerOptions", options.toString())
|
|
42
44
|
audioPlayerImpl!!.resetStreamOnPause = resetStreamOnPause
|
|
43
45
|
audioPlayerImpl!!.setOptions(options)
|
|
@@ -150,7 +152,6 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
150
152
|
fun removeItems(call: PluginCall) {
|
|
151
153
|
Handler(Looper.getMainLooper()).post {
|
|
152
154
|
val items: JSONArray = call.getArray("items")
|
|
153
|
-
var removed = 0
|
|
154
155
|
|
|
155
156
|
val removals = ArrayList<TrackRemovalItem>()
|
|
156
157
|
for (index in 0 until items.length()) {
|
|
@@ -158,21 +159,19 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
158
159
|
val trackIndex = entry.optInt("trackIndex", -1)
|
|
159
160
|
val trackId = entry.optString("trackId", "")
|
|
160
161
|
removals.add(TrackRemovalItem(trackIndex, trackId))
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
removed = removedTracks.size
|
|
171
|
-
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
val removedTracks = audioPlayerImpl!!.playlistManager.removeAllItems(removals)
|
|
165
|
+
for (removedItem in removedTracks) {
|
|
166
|
+
onStatus(
|
|
167
|
+
RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED,
|
|
168
|
+
removedItem.trackId,
|
|
169
|
+
removedItem.toDict()
|
|
170
|
+
)
|
|
172
171
|
}
|
|
173
172
|
|
|
174
173
|
val result = JSObject()
|
|
175
|
-
result.put("removed",
|
|
174
|
+
result.put("removed", removedTracks.size)
|
|
176
175
|
call.resolve(result)
|
|
177
176
|
|
|
178
177
|
Log.i(TAG, "removeItems")
|
|
@@ -213,16 +212,20 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
213
212
|
@PluginMethod
|
|
214
213
|
fun play(call: PluginCall) {
|
|
215
214
|
Handler(Looper.getMainLooper()).post {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
//
|
|
221
|
-
|
|
222
|
-
|
|
215
|
+
val handler = audioPlayerImpl!!.playlistManager.playlistHandler
|
|
216
|
+
if (handler == null || handler.currentMediaPlayer == null) {
|
|
217
|
+
// MediaPlayer was released or MediaService was killed (e.g. after a long video session
|
|
218
|
+
// where audio focus was permanently abandoned). Fall back to beginPlayback which
|
|
219
|
+
// re-starts the service, re-prepares the MediaPlayer, and re-acquires audio focus.
|
|
220
|
+
val posMs = (audioPlayerImpl!!.getLastKnownPositionSec() * 1000f).toLong()
|
|
221
|
+
audioPlayerImpl!!.playlistManager.beginPlayback(posMs, false)
|
|
222
|
+
Log.i(TAG, "play: handler/mediaPlayer was null — re-armed via beginPlayback at ${posMs}ms")
|
|
223
|
+
} else {
|
|
224
|
+
// Handler and MediaPlayer are alive — use the lightweight resume path.
|
|
225
|
+
// Guard against stacking up repeat cycles (playlistcore bug): skip if already playing.
|
|
226
|
+
val isPlaying = handler.currentMediaPlayer?.isPlaying ?: false
|
|
223
227
|
if (!isPlaying) {
|
|
224
|
-
|
|
225
|
-
//audioPlayerImpl.getPlaylistManager().playlistHandler.seek(position)
|
|
228
|
+
handler.play()
|
|
226
229
|
}
|
|
227
230
|
}
|
|
228
231
|
|
|
@@ -237,7 +240,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
237
240
|
Handler(Looper.getMainLooper()).post {
|
|
238
241
|
val index: Int =
|
|
239
242
|
call.getInt("index", audioPlayerImpl!!.playlistManager.currentPosition)!!
|
|
240
|
-
val seekPosition = (call.
|
|
243
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
241
244
|
|
|
242
245
|
audioPlayerImpl!!.playlistManager.currentPosition = index
|
|
243
246
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
|
|
@@ -255,7 +258,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
255
258
|
if ("" != id) {
|
|
256
259
|
// alternatively we could search for the item and set the current index to that item.
|
|
257
260
|
val code = id.hashCode()
|
|
258
|
-
val seekPosition = (call.
|
|
261
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
259
262
|
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
260
263
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
|
|
261
264
|
}
|
|
@@ -274,7 +277,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
274
277
|
|
|
275
278
|
audioPlayerImpl!!.playlistManager.currentPosition = index
|
|
276
279
|
|
|
277
|
-
val seekPosition = (call.
|
|
280
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
278
281
|
|
|
279
282
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
|
|
280
283
|
|
|
@@ -294,7 +297,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
294
297
|
val code = id.hashCode()
|
|
295
298
|
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
296
299
|
|
|
297
|
-
val seekPosition = (call.
|
|
300
|
+
val seekPosition = (call.getFloat("position", 0f)!! * 1000.0f).toLong()
|
|
298
301
|
|
|
299
302
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, true)
|
|
300
303
|
}
|
|
@@ -307,7 +310,9 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
307
310
|
@PluginMethod
|
|
308
311
|
fun pause(call: PluginCall) {
|
|
309
312
|
Handler(Looper.getMainLooper()).post {
|
|
310
|
-
audioPlayerImpl!!.playlistManager.
|
|
313
|
+
if (audioPlayerImpl!!.playlistManager.isPlaying) {
|
|
314
|
+
audioPlayerImpl!!.playlistManager.playlistHandler?.pause(false)
|
|
315
|
+
}
|
|
311
316
|
|
|
312
317
|
call.resolve()
|
|
313
318
|
|
|
@@ -347,7 +352,7 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
347
352
|
}
|
|
348
353
|
|
|
349
354
|
val seekPosition =
|
|
350
|
-
(call.
|
|
355
|
+
(call.getFloat("position", position / 1000.0f)!! * 1000.0f).toLong()
|
|
351
356
|
|
|
352
357
|
val isPlaying: Boolean? =
|
|
353
358
|
audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying
|
|
@@ -387,6 +392,36 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
387
392
|
}
|
|
388
393
|
}
|
|
389
394
|
|
|
395
|
+
@PluginMethod
|
|
396
|
+
fun prepareForVideoHandoff(call: PluginCall) {
|
|
397
|
+
Handler(Looper.getMainLooper()).post {
|
|
398
|
+
audioPlayerImpl!!.prepareForVideoHandoff()
|
|
399
|
+
call.resolve()
|
|
400
|
+
Log.i(TAG, "prepareForVideoHandoff")
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
@PluginMethod
|
|
405
|
+
fun resumeAfterVideoHandoff(call: PluginCall) {
|
|
406
|
+
Handler(Looper.getMainLooper()).post {
|
|
407
|
+
val position = call.getFloat("position", 0f)!!
|
|
408
|
+
audioPlayerImpl!!.resumeAfterVideoHandoff(position)
|
|
409
|
+
call.resolve()
|
|
410
|
+
Log.i(TAG, "resumeAfterVideoHandoff")
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
@PluginMethod
|
|
415
|
+
fun getLastKnownPosition(call: PluginCall) {
|
|
416
|
+
Handler(Looper.getMainLooper()).post {
|
|
417
|
+
val position = audioPlayerImpl!!.getLastKnownPositionSec()
|
|
418
|
+
val o = JSObject()
|
|
419
|
+
o.put("position", position.toDouble())
|
|
420
|
+
call.resolve(o)
|
|
421
|
+
Log.i(TAG, "getLastKnownPosition")
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
390
425
|
override fun handleOnDestroy() {
|
|
391
426
|
Log.d(TAG, "Plugin destroy")
|
|
392
427
|
super.handleOnDestroy()
|
|
@@ -395,21 +430,26 @@ public class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
395
430
|
|
|
396
431
|
override fun onError(errorCode: RmxAudioErrorType?, trackId: String?, message: String?) {
|
|
397
432
|
if (statusCallback == null) {
|
|
398
|
-
|
|
433
|
+
statusCallback = OnStatusCallback(this)
|
|
399
434
|
}
|
|
400
435
|
val errorObj = OnStatusCallback.createErrorWithCode(errorCode, message)
|
|
401
436
|
onStatus(RmxAudioStatusMessage.RMXSTATUS_ERROR, trackId, errorObj)
|
|
402
437
|
}
|
|
403
438
|
|
|
404
439
|
override fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
|
|
440
|
+
// Defensive: recreate the callback if it was ever cleared (e.g. by an unexpected
|
|
441
|
+
// destroyResources call) so that audio events are never permanently silenced.
|
|
405
442
|
if (statusCallback == null) {
|
|
406
|
-
|
|
443
|
+
statusCallback = OnStatusCallback(this)
|
|
407
444
|
}
|
|
408
445
|
statusCallback!!.onStatus(what, trackId, param)
|
|
409
446
|
}
|
|
410
447
|
|
|
411
448
|
private fun destroyResources() {
|
|
412
|
-
statusCallback
|
|
449
|
+
// Do NOT null statusCallback here — it is bound to the Plugin instance and must remain
|
|
450
|
+
// alive for the entire app lifetime. Nulling it silences all subsequent audio events
|
|
451
|
+
// (PLAYING, PAUSE, PLAYBACK_POSITION, etc.) because onStatus() would early-return.
|
|
452
|
+
// Only clear the playback items so native memory is released.
|
|
413
453
|
audioPlayerImpl!!.playlistManager.clearItems()
|
|
414
454
|
}
|
|
415
455
|
|
|
@@ -450,4 +450,36 @@ public class RmxAudioPlayer implements PlaybackStatusListener<AudioTrack>,
|
|
|
450
450
|
private void onStatus(RmxAudioStatusMessage what, String trackId, JSONObject param) {
|
|
451
451
|
statusListener.onStatus(what, trackId, param);
|
|
452
452
|
}
|
|
453
|
+
|
|
454
|
+
private float lastKnownHandoffPositionSec = 0f;
|
|
455
|
+
|
|
456
|
+
public void prepareForVideoHandoff() {
|
|
457
|
+
MediaProgress progress = playlistManager.getCurrentProgress();
|
|
458
|
+
if (progress != null) {
|
|
459
|
+
lastKnownHandoffPositionSec = progress.getPosition() / 1000f;
|
|
460
|
+
} else {
|
|
461
|
+
lastKnownHandoffPositionSec = 0f;
|
|
462
|
+
}
|
|
463
|
+
// Pause unconditionally (not only when isPlaying) so that DefaultAudioFocusProvider
|
|
464
|
+
// always abandons audio focus before CapacitorVideoPlayer.initPlayer acquires it.
|
|
465
|
+
// Calling pause() on an already-paused handler is safe; it triggers focus release.
|
|
466
|
+
if (playlistManager.getPlaylistHandler() != null) {
|
|
467
|
+
playlistManager.getPlaylistHandler().pause(false);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
public void resumeAfterVideoHandoff(float positionSec) {
|
|
472
|
+
lastKnownHandoffPositionSec = positionSec;
|
|
473
|
+
// Re-arm the audio session/service so the handler is primed before JS calls play().
|
|
474
|
+
// On Android, prepareForVideoHandoff() abandoned audio focus which may have caused
|
|
475
|
+
// the MediaService to stop itself (foreground service removal). beginPlayback with
|
|
476
|
+
// startPaused=true restarts the service, re-acquires audio focus, and prepares the
|
|
477
|
+
// MediaPlayer at the stored position — without auto-starting playback (JS owns FR111).
|
|
478
|
+
long positionMs = (long) (positionSec * 1000f);
|
|
479
|
+
playlistManager.beginPlayback(positionMs, true);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
public float getLastKnownPositionSec() {
|
|
483
|
+
return lastKnownHandoffPositionSec;
|
|
484
|
+
}
|
|
453
485
|
}
|
package/dist/docs.json
CHANGED
|
@@ -362,6 +362,46 @@
|
|
|
362
362
|
"SetPlaybackRateOptions"
|
|
363
363
|
],
|
|
364
364
|
"slug": "setplaybackrate"
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"name": "prepareForVideoHandoff",
|
|
368
|
+
"signature": "() => Promise<void>",
|
|
369
|
+
"parameters": [],
|
|
370
|
+
"returns": "Promise<void>",
|
|
371
|
+
"tags": [],
|
|
372
|
+
"docs": "Epic 45 — release native audio session / focus so the video player can own playback.\nCall immediately before CapacitorVideoPlayer.initPlayer (Critical Rule 2).",
|
|
373
|
+
"complexTypes": [],
|
|
374
|
+
"slug": "prepareforvideohandoff"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"name": "resumeAfterVideoHandoff",
|
|
378
|
+
"signature": "(options: ResumeAfterVideoHandoffOptions) => Promise<void>",
|
|
379
|
+
"parameters": [
|
|
380
|
+
{
|
|
381
|
+
"name": "options",
|
|
382
|
+
"docs": "",
|
|
383
|
+
"type": "ResumeAfterVideoHandoffOptions"
|
|
384
|
+
}
|
|
385
|
+
],
|
|
386
|
+
"returns": "Promise<void>",
|
|
387
|
+
"tags": [],
|
|
388
|
+
"docs": "Epic 45 — optional resume hook after video exits (full behaviour in Stories 45.3/45.4).",
|
|
389
|
+
"complexTypes": [
|
|
390
|
+
"ResumeAfterVideoHandoffOptions"
|
|
391
|
+
],
|
|
392
|
+
"slug": "resumeaftervideohandoff"
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"name": "getLastKnownPosition",
|
|
396
|
+
"signature": "() => Promise<GetLastKnownPositionResult>",
|
|
397
|
+
"parameters": [],
|
|
398
|
+
"returns": "Promise<GetLastKnownPositionResult>",
|
|
399
|
+
"tags": [],
|
|
400
|
+
"docs": "Epic 45 — last audio head captured during prepare (seconds).",
|
|
401
|
+
"complexTypes": [
|
|
402
|
+
"GetLastKnownPositionResult"
|
|
403
|
+
],
|
|
404
|
+
"slug": "getlastknownposition"
|
|
365
405
|
}
|
|
366
406
|
],
|
|
367
407
|
"properties": []
|
|
@@ -1862,6 +1902,38 @@
|
|
|
1862
1902
|
"type": "number"
|
|
1863
1903
|
}
|
|
1864
1904
|
]
|
|
1905
|
+
},
|
|
1906
|
+
{
|
|
1907
|
+
"name": "ResumeAfterVideoHandoffOptions",
|
|
1908
|
+
"slug": "resumeaftervideohandoffoptions",
|
|
1909
|
+
"docs": "",
|
|
1910
|
+
"tags": [],
|
|
1911
|
+
"methods": [],
|
|
1912
|
+
"properties": [
|
|
1913
|
+
{
|
|
1914
|
+
"name": "position",
|
|
1915
|
+
"tags": [],
|
|
1916
|
+
"docs": "",
|
|
1917
|
+
"complexTypes": [],
|
|
1918
|
+
"type": "number"
|
|
1919
|
+
}
|
|
1920
|
+
]
|
|
1921
|
+
},
|
|
1922
|
+
{
|
|
1923
|
+
"name": "GetLastKnownPositionResult",
|
|
1924
|
+
"slug": "getlastknownpositionresult",
|
|
1925
|
+
"docs": "",
|
|
1926
|
+
"tags": [],
|
|
1927
|
+
"methods": [],
|
|
1928
|
+
"properties": [
|
|
1929
|
+
{
|
|
1930
|
+
"name": "position",
|
|
1931
|
+
"tags": [],
|
|
1932
|
+
"docs": "",
|
|
1933
|
+
"complexTypes": [],
|
|
1934
|
+
"type": "number"
|
|
1935
|
+
}
|
|
1936
|
+
]
|
|
1865
1937
|
}
|
|
1866
1938
|
],
|
|
1867
1939
|
"enums": [
|
|
@@ -151,16 +151,27 @@ export class RmxAudioPlayer {
|
|
|
151
151
|
throw new Error('Track removal spec is empty');
|
|
152
152
|
}
|
|
153
153
|
if (!removeItem.trackId && !removeItem.trackIndex) {
|
|
154
|
-
new Error('Track removal spec is invalid');
|
|
154
|
+
throw new Error('Track removal spec is invalid');
|
|
155
155
|
}
|
|
156
|
-
|
|
156
|
+
const opts = {};
|
|
157
|
+
if (removeItem.trackIndex !== undefined && removeItem.trackIndex !== null) {
|
|
158
|
+
opts.index = removeItem.trackIndex;
|
|
159
|
+
}
|
|
160
|
+
if (removeItem.trackId) {
|
|
161
|
+
opts.id = removeItem.trackId;
|
|
162
|
+
}
|
|
163
|
+
return Playlist.removeItem(opts);
|
|
157
164
|
};
|
|
158
165
|
/**
|
|
159
166
|
* Removes all given tracks from the playlist; these can be specified either by trackId or trackIndex. If the removed items
|
|
160
167
|
* include the currently playing item, the next available item will automatically begin playing.
|
|
161
168
|
*/
|
|
162
169
|
this.removeItems = (items) => {
|
|
163
|
-
|
|
170
|
+
const mapped = (items || []).map((item) => ({
|
|
171
|
+
id: item === null || item === void 0 ? void 0 : item.trackId,
|
|
172
|
+
index: item === null || item === void 0 ? void 0 : item.trackIndex
|
|
173
|
+
}));
|
|
174
|
+
return Playlist.removeItems({ items: mapped });
|
|
164
175
|
};
|
|
165
176
|
/**
|
|
166
177
|
* Clear the entire playlist. This will result in the STOPPED event being raised.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RmxAudioPlayer.js","sourceRoot":"","sources":["../../src/RmxAudioPlayer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"RmxAudioPlayer.js","sourceRoot":"","sources":["../../src/RmxAudioPlayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,25 @@ export interface PlaylistPlugin {
|
|
|
27
27
|
setPlaybackVolume(options: SetPlaybackVolumeOptions): Promise<void>;
|
|
28
28
|
setLoop(options: SetLoopOptions): Promise<void>;
|
|
29
29
|
setPlaybackRate(options: SetPlaybackRateOptions): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Epic 45 — release native audio session / focus so the video player can own playback.
|
|
32
|
+
* Call immediately before CapacitorVideoPlayer.initPlayer (Critical Rule 2).
|
|
33
|
+
*/
|
|
34
|
+
prepareForVideoHandoff(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Epic 45 — optional resume hook after video exits (full behaviour in Stories 45.3/45.4).
|
|
37
|
+
*/
|
|
38
|
+
resumeAfterVideoHandoff(options: ResumeAfterVideoHandoffOptions): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Epic 45 — last audio head captured during prepare (seconds).
|
|
41
|
+
*/
|
|
42
|
+
getLastKnownPosition(): Promise<GetLastKnownPositionResult>;
|
|
43
|
+
}
|
|
44
|
+
export interface ResumeAfterVideoHandoffOptions {
|
|
45
|
+
position: number;
|
|
46
|
+
}
|
|
47
|
+
export interface GetLastKnownPositionResult {
|
|
48
|
+
position: number;
|
|
30
49
|
}
|
|
31
50
|
export interface PlaylistOptions {
|
|
32
51
|
items: Array<AudioTrack>;
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -34,6 +34,14 @@ export declare class PlaylistWeb extends WebPlugin implements PlaylistPlugin {
|
|
|
34
34
|
skipForward(): Promise<void>;
|
|
35
35
|
skipBack(): Promise<void>;
|
|
36
36
|
setPlaybackRate(options: SetPlaybackRateOptions): Promise<void>;
|
|
37
|
+
protected lastKnownHandoffPosition: number;
|
|
38
|
+
prepareForVideoHandoff(): Promise<void>;
|
|
39
|
+
resumeAfterVideoHandoff(options: {
|
|
40
|
+
position: number;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
getLastKnownPosition(): Promise<{
|
|
43
|
+
position: number;
|
|
44
|
+
}>;
|
|
37
45
|
setMediaSessionRemoteControlMetadata(): Promise<void>;
|
|
38
46
|
mediaSessionControlsHandler(actionDetails: MediaSessionActionDetails): Promise<void>;
|
|
39
47
|
registerHtmlListeners(position?: number): void;
|
package/dist/esm/web.js
CHANGED
|
@@ -9,6 +9,7 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
9
9
|
this.options = {};
|
|
10
10
|
this.currentTrack = null;
|
|
11
11
|
this.lastState = 'stopped';
|
|
12
|
+
this.lastKnownHandoffPosition = 0;
|
|
12
13
|
this.hlsLoaded = false;
|
|
13
14
|
}
|
|
14
15
|
addAllItems(options) {
|
|
@@ -86,16 +87,18 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
86
87
|
return Promise.resolve();
|
|
87
88
|
}
|
|
88
89
|
removeItem(options) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
90
|
+
// options.index can be 0; don't use a truthy check.
|
|
91
|
+
let removeIndex = -1;
|
|
92
|
+
if (options.index !== undefined && options.index !== null) {
|
|
93
|
+
removeIndex = options.index;
|
|
94
|
+
}
|
|
95
|
+
else if (options.id) {
|
|
96
|
+
removeIndex = this.playlistItems.findIndex((t) => t.trackId === options.id);
|
|
97
|
+
}
|
|
98
|
+
if (removeIndex >= 0 && removeIndex < this.playlistItems.length) {
|
|
99
|
+
const removedTrack = this.playlistItems.splice(removeIndex, 1)[0];
|
|
100
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_REMOVED, removedTrack, removedTrack === null || removedTrack === void 0 ? void 0 : removedTrack.trackId);
|
|
101
|
+
}
|
|
99
102
|
return Promise.resolve();
|
|
100
103
|
}
|
|
101
104
|
removeItems(options) {
|
|
@@ -162,7 +165,7 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
162
165
|
async skipForward() {
|
|
163
166
|
let found = null;
|
|
164
167
|
this.playlistItems.forEach((item, index) => {
|
|
165
|
-
if (
|
|
168
|
+
if (found === null && this.getCurrentTrackId() === item.trackId) {
|
|
166
169
|
found = index;
|
|
167
170
|
}
|
|
168
171
|
});
|
|
@@ -170,30 +173,29 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
170
173
|
found = -1;
|
|
171
174
|
}
|
|
172
175
|
if (found !== null) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
const targetIndex = found + 1;
|
|
177
|
+
this.updateStatus(RmxAudioStatusMessage.RMX_STATUS_SKIP_FORWARD, {
|
|
178
|
+
currentIndex: targetIndex,
|
|
179
|
+
currentItem: this.playlistItems[targetIndex]
|
|
180
|
+
}, this.playlistItems[targetIndex].trackId);
|
|
181
|
+
return this.setCurrent(this.playlistItems[targetIndex]);
|
|
178
182
|
}
|
|
179
183
|
return Promise.reject();
|
|
180
184
|
}
|
|
181
185
|
async skipBack() {
|
|
182
186
|
let found = null;
|
|
183
187
|
this.playlistItems.forEach((item, index) => {
|
|
184
|
-
if (
|
|
188
|
+
if (found === null && this.getCurrentTrackId() === item.trackId) {
|
|
185
189
|
found = index;
|
|
186
190
|
}
|
|
187
191
|
});
|
|
188
|
-
if (found === 0) {
|
|
189
|
-
found = this.playlistItems.length - 1;
|
|
190
|
-
}
|
|
191
192
|
if (found !== null) {
|
|
193
|
+
const targetIndex = found === 0 ? this.playlistItems.length - 1 : found - 1;
|
|
192
194
|
this.updateStatus(RmxAudioStatusMessage.RMX_STATUS_SKIP_BACK, {
|
|
193
|
-
currentIndex:
|
|
194
|
-
currentItem: this.playlistItems[
|
|
195
|
-
}, this.playlistItems[
|
|
196
|
-
return this.setCurrent(this.playlistItems[
|
|
195
|
+
currentIndex: targetIndex,
|
|
196
|
+
currentItem: this.playlistItems[targetIndex]
|
|
197
|
+
}, this.playlistItems[targetIndex].trackId);
|
|
198
|
+
return this.setCurrent(this.playlistItems[targetIndex]);
|
|
197
199
|
}
|
|
198
200
|
return Promise.reject();
|
|
199
201
|
}
|
|
@@ -204,6 +206,19 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
204
206
|
}
|
|
205
207
|
return Promise.reject();
|
|
206
208
|
}
|
|
209
|
+
async prepareForVideoHandoff() {
|
|
210
|
+
var _a, _b;
|
|
211
|
+
this.lastKnownHandoffPosition = (_b = (_a = this.audio) === null || _a === void 0 ? void 0 : _a.currentTime) !== null && _b !== void 0 ? _b : 0;
|
|
212
|
+
await this.pause();
|
|
213
|
+
return Promise.resolve();
|
|
214
|
+
}
|
|
215
|
+
async resumeAfterVideoHandoff(options) {
|
|
216
|
+
this.lastKnownHandoffPosition = options.position;
|
|
217
|
+
return Promise.resolve();
|
|
218
|
+
}
|
|
219
|
+
async getLastKnownPosition() {
|
|
220
|
+
return Promise.resolve({ position: this.lastKnownHandoffPosition });
|
|
221
|
+
}
|
|
207
222
|
async setMediaSessionRemoteControlMetadata() {
|
|
208
223
|
const audioTrack = this.currentTrack;
|
|
209
224
|
if (!navigator.mediaSession) {
|