capacitor-plugin-playlist 0.1.24 → 0.1.28
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 +40 -7
- package/android/.gitignore +1 -0
- package/android/.npmignore +1 -0
- package/android/src/main/java/org/dwbn/plugins/playlist/OnStatusCallback.kt +34 -0
- package/android/src/main/java/org/dwbn/plugins/playlist/PlaylistPlugin.kt +16 -16
- package/android/src/main/java/org/dwbn/plugins/playlist/RmxAudioPlayer.java +2 -2
- package/android/src/main/java/org/dwbn/plugins/playlist/manager/PlaylistManager.kt +1 -1
- package/android/src/main/java/org/dwbn/plugins/playlist/playlist/AudioPlaylistHandler.java +6 -1
- package/dist/esm/RmxAudioPlayer.d.ts +1 -6
- package/dist/esm/RmxAudioPlayer.js +3 -12
- package/dist/esm/RmxAudioPlayer.js.map +1 -1
- package/dist/esm/web.d.ts +2 -1
- package/dist/esm/web.js +49 -77
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +52 -89
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +52 -89
- package/dist/plugin.js.map +1 -1
- package/package.json +1 -1
- package/android/src/main/java/org/dwbn/plugins/playlist/OnStatusCallback.java +0 -45
package/README.md
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
# capacitor-plugin-playlist
|
|
2
2
|
Will probably be published as @dwbn/capacitor-playlist
|
|
3
3
|
|
|
4
|
-
A capacitor plugin for Android, iOS and Web with native support for audio playlists, background support, and lock screen controls
|
|
5
|
-
|
|
6
|
-
Capacitor 3 Version: > 0.1.0
|
|
7
|
-
Capacitor 2 Version: < v0.1.0
|
|
4
|
+
A capacitor 3. 0 plugin for Android, iOS and Web with native support for audio playlists, background support, and lock screen controls
|
|
8
5
|
|
|
9
6
|
## 0. Index
|
|
10
7
|
|
|
@@ -48,7 +45,8 @@ ext {
|
|
|
48
45
|
exoPlayerVersion = "2.9.6"
|
|
49
46
|
supportLibVersion = "28.0.0"
|
|
50
47
|
}
|
|
51
|
-
|
|
48
|
+
```
|
|
49
|
+
##### AndroidManifest.xml:
|
|
52
50
|
```
|
|
53
51
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
54
52
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
@@ -59,8 +57,20 @@ ext {
|
|
|
59
57
|
android:name="org.dwbn.plugins.playlist.service.MediaService">
|
|
60
58
|
</service>
|
|
61
59
|
</application>
|
|
60
|
+
```
|
|
62
61
|
|
|
62
|
+
##### Glide image loading for notifiction center
|
|
63
|
+
To be able to use glide you need to create a file MyAppGlideModule.java:
|
|
63
64
|
```
|
|
65
|
+
package org.your.package.namespace;
|
|
66
|
+
|
|
67
|
+
import com.bumptech.glide.annotation.GlideModule;
|
|
68
|
+
import com.bumptech.glide.module.AppGlideModule;
|
|
69
|
+
|
|
70
|
+
@GlideModule
|
|
71
|
+
public final class MyAppGlideModule extends AppGlideModule {}
|
|
72
|
+
```
|
|
73
|
+
also see https://guides.codepath.com/android/Displaying-Images-with-the-Glide-Library
|
|
64
74
|
|
|
65
75
|
### iOS
|
|
66
76
|
##### inside Info.plist:
|
|
@@ -95,9 +105,32 @@ Be sure to check out the examples folder, where you can find an Angular10/Ionic5
|
|
|
95
105
|
Just drop into your project and go.
|
|
96
106
|
Should be quite obvious howto adapt this for other frameworks, or just vanillaJS
|
|
97
107
|
|
|
108
|
+
### API
|
|
109
|
+
Example:
|
|
110
|
+
@see definition.ts
|
|
111
|
+
```
|
|
112
|
+
import {Playlist, AudioTrack} from 'capacitor-plugin-playlist'
|
|
113
|
+
|
|
114
|
+
const item: AudioTrack = {
|
|
115
|
+
trackId: 1,
|
|
116
|
+
assetUrl: 'http://your_audio',
|
|
117
|
+
albumArt: 'http://some_image'
|
|
118
|
+
}
|
|
119
|
+
await Playlist.addItem({item})
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
- TODO!
|
|
123
|
+
|
|
124
|
+
### Migrating from cordova-plugin-playlist
|
|
125
|
+
|
|
126
|
+
See the use the shipped RmxAudioPlayer.ts
|
|
127
|
+
|
|
128
|
+
Its a meant as a drop in replacement
|
|
129
|
+
|
|
130
|
+
in the best case you only change your import. :D
|
|
131
|
+
|
|
132
|
+
|
|
98
133
|
## 5. Todo
|
|
99
|
-
* [iOS] Write this plugin in Swift instead of Objective-C. I didn't have time to learn Swift when I needed this.
|
|
100
|
-
* [iOS] Safely implement cover art for cover images displayed on the command/lock screen controls
|
|
101
134
|
* [iOS] Utilize [AudioPlayer](https://github.com/delannoyk/AudioPlayer) instead of directly implementing AVQueuePlayer. `AudioPlayer` includes some smart network recovery features
|
|
102
135
|
* [iOS, Android] Add a full example
|
|
103
136
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/build
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/build
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
package org.dwbn.plugins.playlist
|
|
2
|
+
|
|
3
|
+
import android.util.Log
|
|
4
|
+
import com.getcapacitor.JSObject
|
|
5
|
+
import org.json.JSONException
|
|
6
|
+
import org.json.JSONObject
|
|
7
|
+
|
|
8
|
+
class OnStatusCallback internal constructor(private val plugin: PlaylistPlugin) {
|
|
9
|
+
fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
|
|
10
|
+
val data = JSObject()
|
|
11
|
+
val detail = JSObject()
|
|
12
|
+
detail.put("msgType", what.value)
|
|
13
|
+
detail.put("trackId", trackId)
|
|
14
|
+
detail.put("value", param)
|
|
15
|
+
data.put("action", "status")
|
|
16
|
+
data.put("status", detail)
|
|
17
|
+
Log.v(TAG, "statusChanged:$data")
|
|
18
|
+
plugin.emit("status", data)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
companion object {
|
|
22
|
+
private const val TAG = "PlaylistStatusCallback"
|
|
23
|
+
fun createErrorWithCode(code: RmxAudioErrorType?, message: String?): JSONObject {
|
|
24
|
+
val error = JSONObject()
|
|
25
|
+
try {
|
|
26
|
+
error.put("code", code)
|
|
27
|
+
error.put("message", message ?: "")
|
|
28
|
+
} catch (e: JSONException) {
|
|
29
|
+
Log.e(TAG, "Exception while raising onStatus: ", e)
|
|
30
|
+
}
|
|
31
|
+
return error
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -11,7 +11,7 @@ import java.util.*
|
|
|
11
11
|
|
|
12
12
|
@CapacitorPlugin(name = "Playlist")
|
|
13
13
|
class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
14
|
-
var TAG = "
|
|
14
|
+
var TAG = "PlaylistPlugin"
|
|
15
15
|
private var statusCallback: OnStatusCallback? = null
|
|
16
16
|
private var audioPlayerImpl: RmxAudioPlayer? = null
|
|
17
17
|
private var resetStreamOnPause = true
|
|
@@ -24,9 +24,9 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
24
24
|
fun initialize(call: PluginCall) {
|
|
25
25
|
statusCallback = OnStatusCallback(this)
|
|
26
26
|
onStatus(RmxAudioStatusMessage.RMXSTATUS_REGISTER, "INIT", null)
|
|
27
|
-
|
|
28
|
-
Log.i(TAG, "Initialized")
|
|
27
|
+
Log.i(TAG, "Initialized...")
|
|
29
28
|
audioPlayerImpl!!.resume()
|
|
29
|
+
call.resolve()
|
|
30
30
|
}
|
|
31
31
|
@PluginMethod
|
|
32
32
|
fun setOptions(call: PluginCall) {
|
|
@@ -107,9 +107,9 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
107
107
|
|
|
108
108
|
@PluginMethod
|
|
109
109
|
fun removeItem(call: PluginCall) {
|
|
110
|
-
val trackIndex: Int = call.getInt("
|
|
111
|
-
val trackId: String = call.getString("
|
|
112
|
-
Log.i(TAG,"removeItem")
|
|
110
|
+
val trackIndex: Int = call.getInt("index", -1)!!
|
|
111
|
+
val trackId: String = call.getString("id", "")!!
|
|
112
|
+
Log.i(TAG,"removeItem trackIn" )
|
|
113
113
|
val item = audioPlayerImpl!!.playlistManager.removeItem(trackIndex, trackId)
|
|
114
114
|
|
|
115
115
|
if (item != null) {
|
|
@@ -192,10 +192,10 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
192
192
|
|
|
193
193
|
@PluginMethod
|
|
194
194
|
fun playTrackById(call: PluginCall) {
|
|
195
|
-
val
|
|
196
|
-
if ("" !=
|
|
195
|
+
val id: String = call.getString("id")!!
|
|
196
|
+
if ("" != id) {
|
|
197
197
|
// alternatively we could search for the item and set the current index to that item.
|
|
198
|
-
val code =
|
|
198
|
+
val code = id.hashCode()
|
|
199
199
|
val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
|
|
200
200
|
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
201
201
|
audioPlayerImpl!!.playlistManager.beginPlayback(seekPosition, false)
|
|
@@ -224,10 +224,10 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
224
224
|
|
|
225
225
|
@PluginMethod
|
|
226
226
|
fun selectTrackById(call: PluginCall) {
|
|
227
|
-
val
|
|
228
|
-
if ("" !=
|
|
227
|
+
val id: String = call.getString("id")!!
|
|
228
|
+
if ("" != id) {
|
|
229
229
|
// alternatively we could search for the item and set the current index to that item.
|
|
230
|
-
val code =
|
|
230
|
+
val code = id.hashCode()
|
|
231
231
|
audioPlayerImpl!!.playlistManager.setCurrentItem(code.toLong())
|
|
232
232
|
|
|
233
233
|
val seekPosition = (call.getInt("position", 0)!! * 1000.0).toLong()
|
|
@@ -278,7 +278,7 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
278
278
|
|
|
279
279
|
val isPlaying: Boolean? = audioPlayerImpl!!.playlistManager.playlistHandler?.currentMediaPlayer?.isPlaying
|
|
280
280
|
audioPlayerImpl!!.playlistManager.playlistHandler?.seek(seekPosition)
|
|
281
|
-
if (!isPlaying
|
|
281
|
+
if (isPlaying === null || !isPlaying) {
|
|
282
282
|
audioPlayerImpl!!.playlistManager.playlistHandler?.pause(false)
|
|
283
283
|
}
|
|
284
284
|
|
|
@@ -294,7 +294,7 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
294
294
|
|
|
295
295
|
call.resolve()
|
|
296
296
|
|
|
297
|
-
Log.i(TAG,"
|
|
297
|
+
Log.i(TAG,"setPlaybackRate")
|
|
298
298
|
}
|
|
299
299
|
|
|
300
300
|
@PluginMethod
|
|
@@ -321,7 +321,7 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
321
321
|
onStatus(RmxAudioStatusMessage.RMXSTATUS_ERROR, trackId, errorObj)
|
|
322
322
|
}
|
|
323
323
|
|
|
324
|
-
override fun onStatus(what: RmxAudioStatusMessage
|
|
324
|
+
override fun onStatus(what: RmxAudioStatusMessage, trackId: String?, param: JSONObject?) {
|
|
325
325
|
if (statusCallback == null) {
|
|
326
326
|
return
|
|
327
327
|
}
|
|
@@ -355,6 +355,6 @@ class PlaylistPlugin : Plugin(), OnStatusReportListener {
|
|
|
355
355
|
}
|
|
356
356
|
|
|
357
357
|
fun emit(name: String, data: JSObject) {
|
|
358
|
-
this.notifyListeners(name, data)
|
|
358
|
+
this.notifyListeners(name, data, true)
|
|
359
359
|
}
|
|
360
360
|
}
|
|
@@ -29,7 +29,7 @@ import org.json.JSONObject;
|
|
|
29
29
|
public class RmxAudioPlayer implements PlaybackStatusListener<AudioTrack>,
|
|
30
30
|
PlaylistListener<AudioTrack>, ProgressListener, OnErrorListener, MediaControlsListener {
|
|
31
31
|
|
|
32
|
-
public static String TAG = "
|
|
32
|
+
public static String TAG = "PlaylistRmxAudioPlayer";
|
|
33
33
|
|
|
34
34
|
// PlaylistCore requires this but we don't use it
|
|
35
35
|
// It would be used to switch between playlists. I guess we could
|
|
@@ -68,7 +68,7 @@ public class RmxAudioPlayer implements PlaybackStatusListener<AudioTrack>,
|
|
|
68
68
|
|
|
69
69
|
public boolean getResetStreamOnPause() {
|
|
70
70
|
return resetStreamOnPause;
|
|
71
|
-
}
|
|
71
|
+
}
|
|
72
72
|
|
|
73
73
|
public void setResetStreamOnPause(boolean val) {
|
|
74
74
|
resetStreamOnPause = val;
|
|
@@ -257,7 +257,7 @@ class PlaylistManager(application: Application) :
|
|
|
257
257
|
fun setPlaybackSpeed(@FloatRange(from = 0.0, to = 1.0) speed: Float) {
|
|
258
258
|
playbackSpeed = speed
|
|
259
259
|
if (currentMediaPlayer != null && currentMediaPlayer!!.get() != null && currentMediaPlayer!!.get() is AudioApi) {
|
|
260
|
-
Log.i(
|
|
260
|
+
Log.i(TAG, "setPlaybackSpeed completing with speed = $speed")
|
|
261
261
|
(currentMediaPlayer!!.get() as AudioApi?)!!.setPlaybackSpeed(playbackSpeed)
|
|
262
262
|
}
|
|
263
263
|
}
|
|
@@ -26,7 +26,7 @@ import org.jetbrains.annotations.NotNull;
|
|
|
26
26
|
public class AudioPlaylistHandler<I extends PlaylistItem, M extends BasePlaylistManager<I>>
|
|
27
27
|
extends DefaultPlaylistHandler<I, M> {
|
|
28
28
|
|
|
29
|
-
private static final String TAG = "
|
|
29
|
+
private static final String TAG = "PlaylistAudioPlaylistHandler";
|
|
30
30
|
|
|
31
31
|
AudioPlaylistHandler(
|
|
32
32
|
Context context,
|
|
@@ -47,6 +47,11 @@ public class AudioPlaylistHandler<I extends PlaylistItem, M extends BasePlaylist
|
|
|
47
47
|
getMediaProgressPoll().setProgressPollDelay(1000);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
public void next() {
|
|
51
|
+
getPlaylistManager().next();
|
|
52
|
+
startItemPlayback(0, !this.isPlaying());
|
|
53
|
+
}
|
|
54
|
+
|
|
50
55
|
@Override
|
|
51
56
|
public void onPrepared(@NotNull MediaPlayerApi<I> mediaPlayer) {
|
|
52
57
|
super.onPrepared(mediaPlayer);
|
|
@@ -3,8 +3,7 @@ import { AudioPlayerEventHandler, AudioPlayerEventHandlers, AudioPlayerOptions,
|
|
|
3
3
|
export declare class RmxAudioPlayer {
|
|
4
4
|
handlers: AudioPlayerEventHandlers;
|
|
5
5
|
options: AudioPlayerOptions;
|
|
6
|
-
private
|
|
7
|
-
private _initPromise;
|
|
6
|
+
private readonly _initPromise;
|
|
8
7
|
private _readyResolve;
|
|
9
8
|
private _readyReject;
|
|
10
9
|
private _currentState;
|
|
@@ -17,10 +16,6 @@ export declare class RmxAudioPlayer {
|
|
|
17
16
|
* or interrogate it.
|
|
18
17
|
*/
|
|
19
18
|
get currentState(): "stopped" | "error" | "paused" | "loading" | "playing" | "unknown" | "ready";
|
|
20
|
-
/**
|
|
21
|
-
* True if the plugin has been initialized. You'll likely never see this state; it is handled internally.
|
|
22
|
-
*/
|
|
23
|
-
get isInitialized(): boolean;
|
|
24
19
|
get currentTrack(): AudioTrack | null;
|
|
25
20
|
/**
|
|
26
21
|
* If the playlist is currently playling a track.
|
|
@@ -22,7 +22,6 @@ export class RmxAudioPlayer {
|
|
|
22
22
|
constructor() {
|
|
23
23
|
this.handlers = {};
|
|
24
24
|
this.options = { verbose: false, resetStreamOnPause: true };
|
|
25
|
-
this._inititialized = false;
|
|
26
25
|
this._readyResolve = () => {
|
|
27
26
|
};
|
|
28
27
|
this._readyReject = () => {
|
|
@@ -51,7 +50,6 @@ export class RmxAudioPlayer {
|
|
|
51
50
|
});
|
|
52
51
|
try {
|
|
53
52
|
await Playlist.initialize();
|
|
54
|
-
this._inititialized = true;
|
|
55
53
|
this._readyResolve();
|
|
56
54
|
}
|
|
57
55
|
catch (args) {
|
|
@@ -59,7 +57,6 @@ export class RmxAudioPlayer {
|
|
|
59
57
|
console.warn(message, args);
|
|
60
58
|
this._readyReject();
|
|
61
59
|
}
|
|
62
|
-
return this._initPromise;
|
|
63
60
|
};
|
|
64
61
|
/**
|
|
65
62
|
* Sets the player options. This can be called at any time and is not required before playback can be initiated.
|
|
@@ -202,13 +199,13 @@ export class RmxAudioPlayer {
|
|
|
202
199
|
return Playlist.setLoop({ loop: loop });
|
|
203
200
|
};
|
|
204
201
|
this.handlers = {};
|
|
202
|
+
new Promise((resolve) => {
|
|
203
|
+
window.addEventListener('beforeunload', () => resolve(), { once: true });
|
|
204
|
+
}).then(() => Playlist.release());
|
|
205
205
|
this._initPromise = new Promise((resolve, reject) => {
|
|
206
206
|
this._readyResolve = resolve;
|
|
207
207
|
this._readyReject = reject;
|
|
208
208
|
});
|
|
209
|
-
new Promise((resolve) => {
|
|
210
|
-
window.addEventListener('beforeunload', () => resolve(), { once: true });
|
|
211
|
-
}).then(() => Playlist.release());
|
|
212
209
|
}
|
|
213
210
|
/**
|
|
214
211
|
* The current summarized state of the player, as a string. It is preferred that you use the 'isX' accessors,
|
|
@@ -218,12 +215,6 @@ export class RmxAudioPlayer {
|
|
|
218
215
|
get currentState() {
|
|
219
216
|
return this._currentState;
|
|
220
217
|
}
|
|
221
|
-
/**
|
|
222
|
-
* True if the plugin has been initialized. You'll likely never see this state; it is handled internally.
|
|
223
|
-
*/
|
|
224
|
-
get isInitialized() {
|
|
225
|
-
return this._inititialized;
|
|
226
|
-
}
|
|
227
218
|
get currentTrack() {
|
|
228
219
|
return this._currentItem;
|
|
229
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RmxAudioPlayer.js","sourceRoot":"","sources":["../../src/RmxAudioPlayer.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,qBAAqB,EACrB,iCAAiC,EACpC,MAAM,aAAa,CAAC;AAiBrB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxD;;GAEG;AAEH,MAAM,qBAAqB,GAAG;IAC1B,qBAAqB,CAAC,2BAA2B;IACjD,qBAAqB,CAAC,kBAAkB;IACxC,qBAAqB,CAAC,mBAAmB;IACzC,qBAAqB,CAAC,iBAAiB;IACvC,qBAAqB,CAAC,iBAAiB;IACvC,qBAAqB,CAAC,gBAAgB;IACtC,qBAAqB,CAAC,eAAe;IACrC,qBAAqB,CAAC,mBAAmB;IACzC,qBAAqB,CAAC,eAAe;CACxC,CAAC;AAEF,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"RmxAudioPlayer.js","sourceRoot":"","sources":["../../src/RmxAudioPlayer.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
|
+
import { RmxAudioStatusMessage } from './Constants';
|
|
2
3
|
import { AddAllItemOptions, AddItemOptions, PlayByIdOptions, PlayByIndexOptions, PlaylistOptions, PlaylistPlugin, RemoveItemOptions, RemoveItemsOptions, SeekToOptions, SelectByIdOptions, SelectByIndexOptions, SetLoopOptions, SetPlaybackRateOptions, SetPlaybackVolumeOptions } from './definitions';
|
|
3
4
|
import { AudioPlayerOptions, AudioTrack } from './interfaces';
|
|
4
5
|
export declare class PlaylistWeb extends WebPlugin implements PlaylistPlugin {
|
|
@@ -40,7 +41,7 @@ export declare class PlaylistWeb extends WebPlugin implements PlaylistPlugin {
|
|
|
40
41
|
currentPosition: number;
|
|
41
42
|
};
|
|
42
43
|
protected setCurrent(item: AudioTrack, position?: number): Promise<void>;
|
|
43
|
-
protected
|
|
44
|
+
protected updateStatus(msgType: RmxAudioStatusMessage, value: any, trackId?: string): void;
|
|
44
45
|
private hlsLoaded;
|
|
45
46
|
protected loadHlsJs(): Promise<unknown>;
|
|
46
47
|
}
|
package/dist/esm/web.js
CHANGED
|
@@ -19,15 +19,18 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
19
19
|
const track = validateTrack(options.item);
|
|
20
20
|
if (track) {
|
|
21
21
|
this.playlistItems.push(track);
|
|
22
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, track, track.trackId);
|
|
22
23
|
}
|
|
23
24
|
return Promise.resolve();
|
|
24
25
|
}
|
|
25
26
|
async clearAllItems() {
|
|
26
27
|
await this.release();
|
|
27
28
|
this.playlistItems = [];
|
|
29
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_PLAYLIST_CLEARED, null, "INVALID");
|
|
28
30
|
return Promise.resolve();
|
|
29
31
|
}
|
|
30
32
|
async initialize() {
|
|
33
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_INIT, null, "INVALID");
|
|
31
34
|
return Promise.resolve();
|
|
32
35
|
}
|
|
33
36
|
async pause() {
|
|
@@ -36,24 +39,28 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
36
39
|
}
|
|
37
40
|
async play() {
|
|
38
41
|
var _a;
|
|
39
|
-
|
|
42
|
+
await ((_a = this.audio) === null || _a === void 0 ? void 0 : _a.play());
|
|
40
43
|
}
|
|
41
|
-
playTrackById(options) {
|
|
42
|
-
this.playlistItems
|
|
43
|
-
if (
|
|
44
|
-
|
|
44
|
+
async playTrackById(options) {
|
|
45
|
+
for (let track of this.playlistItems) {
|
|
46
|
+
if (track.trackId === options.id) {
|
|
47
|
+
if (track !== this.currentTrack) {
|
|
48
|
+
await this.setCurrent(track);
|
|
49
|
+
}
|
|
45
50
|
return this.play();
|
|
46
51
|
}
|
|
47
|
-
}
|
|
52
|
+
}
|
|
48
53
|
return Promise.reject();
|
|
49
54
|
}
|
|
50
|
-
playTrackByIndex(options) {
|
|
51
|
-
this.playlistItems.
|
|
55
|
+
async playTrackByIndex(options) {
|
|
56
|
+
for (let { index, item } of this.playlistItems.map((item, index) => ({ index, item }))) {
|
|
52
57
|
if (index === options.index) {
|
|
53
|
-
|
|
58
|
+
if (item !== this.currentTrack) {
|
|
59
|
+
await this.setCurrent(item);
|
|
60
|
+
}
|
|
54
61
|
return this.play();
|
|
55
62
|
}
|
|
56
|
-
}
|
|
63
|
+
}
|
|
57
64
|
return Promise.reject();
|
|
58
65
|
}
|
|
59
66
|
async release() {
|
|
@@ -64,17 +71,19 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
64
71
|
removeItem(options) {
|
|
65
72
|
this.playlistItems.forEach((item, index) => {
|
|
66
73
|
if (options.index && options.index === index) {
|
|
67
|
-
this.playlistItems.splice(index, 1);
|
|
74
|
+
const removedTrack = this.playlistItems.splice(index, 1);
|
|
75
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, removedTrack[0], removedTrack[0].trackId);
|
|
68
76
|
}
|
|
69
77
|
else if (options.id && options.id === item.trackId) {
|
|
70
|
-
this.playlistItems.splice(index, 1);
|
|
78
|
+
const removedTrack = this.playlistItems.splice(index, 1);
|
|
79
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ITEM_ADDED, removedTrack[0], removedTrack[0].trackId);
|
|
71
80
|
}
|
|
72
81
|
});
|
|
73
82
|
return Promise.resolve();
|
|
74
83
|
}
|
|
75
84
|
removeItems(options) {
|
|
76
|
-
options.items.forEach((item) => {
|
|
77
|
-
this.removeItem(item);
|
|
85
|
+
options.items.forEach(async (item) => {
|
|
86
|
+
await this.removeItem(item);
|
|
78
87
|
});
|
|
79
88
|
return Promise.resolve();
|
|
80
89
|
}
|
|
@@ -126,7 +135,7 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
126
135
|
}
|
|
127
136
|
return Promise.resolve();
|
|
128
137
|
}
|
|
129
|
-
skipForward() {
|
|
138
|
+
async skipForward() {
|
|
130
139
|
let found = null;
|
|
131
140
|
this.playlistItems.forEach((item, index) => {
|
|
132
141
|
if (!found && this.getCurrentTrackId() === item.trackId) {
|
|
@@ -137,11 +146,15 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
137
146
|
found = -1;
|
|
138
147
|
}
|
|
139
148
|
if (found !== null) {
|
|
149
|
+
this.updateStatus(RmxAudioStatusMessage.RMX_STATUS_SKIP_BACK, {
|
|
150
|
+
currentIndex: found + 1,
|
|
151
|
+
currentItem: this.playlistItems[found + 1]
|
|
152
|
+
}, this.playlistItems[found + 1].trackId);
|
|
140
153
|
return this.setCurrent(this.playlistItems[found + 1]);
|
|
141
154
|
}
|
|
142
155
|
return Promise.reject();
|
|
143
156
|
}
|
|
144
|
-
skipBack() {
|
|
157
|
+
async skipBack() {
|
|
145
158
|
let found = null;
|
|
146
159
|
this.playlistItems.forEach((item, index) => {
|
|
147
160
|
if (!found && this.getCurrentTrackId() === item.trackId) {
|
|
@@ -152,8 +165,11 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
152
165
|
found = this.playlistItems.length - 1;
|
|
153
166
|
}
|
|
154
167
|
if (found !== null) {
|
|
155
|
-
this.
|
|
156
|
-
|
|
168
|
+
this.updateStatus(RmxAudioStatusMessage.RMX_STATUS_SKIP_BACK, {
|
|
169
|
+
currentIndex: found - 1,
|
|
170
|
+
currentItem: this.playlistItems[found - 1]
|
|
171
|
+
}, this.playlistItems[found - 1].trackId);
|
|
172
|
+
return this.setCurrent(this.playlistItems[found - 1]);
|
|
157
173
|
}
|
|
158
174
|
return Promise.reject();
|
|
159
175
|
}
|
|
@@ -184,14 +200,7 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
184
200
|
registerHtmlListeners(position) {
|
|
185
201
|
const canPlayListener = async () => {
|
|
186
202
|
var _a;
|
|
187
|
-
this.
|
|
188
|
-
action: 'status',
|
|
189
|
-
status: {
|
|
190
|
-
msgType: RmxAudioStatusMessage.RMXSTATUS_CANPLAY,
|
|
191
|
-
trackId: this.getCurrentTrackId(),
|
|
192
|
-
value: this.getCurrentTrackStatus('loading'),
|
|
193
|
-
}
|
|
194
|
-
});
|
|
203
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_CANPLAY, this.getCurrentTrackStatus('paused'));
|
|
195
204
|
if (position) {
|
|
196
205
|
await this.seekTo({ position });
|
|
197
206
|
}
|
|
@@ -200,57 +209,22 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
200
209
|
if (this.audio) {
|
|
201
210
|
this.audio.addEventListener('canplay', canPlayListener);
|
|
202
211
|
this.audio.addEventListener('playing', () => {
|
|
203
|
-
this.
|
|
204
|
-
action: 'status',
|
|
205
|
-
status: {
|
|
206
|
-
msgType: RmxAudioStatusMessage.RMXSTATUS_PLAYING,
|
|
207
|
-
trackId: this.getCurrentTrackId(),
|
|
208
|
-
value: this.getCurrentTrackStatus('playing'),
|
|
209
|
-
}
|
|
210
|
-
});
|
|
212
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_PLAYING, this.getCurrentTrackStatus('playing'));
|
|
211
213
|
});
|
|
212
214
|
this.audio.addEventListener('pause', () => {
|
|
213
|
-
this.
|
|
214
|
-
action: 'status',
|
|
215
|
-
status: {
|
|
216
|
-
msgType: RmxAudioStatusMessage.RMXSTATUS_PAUSE,
|
|
217
|
-
trackId: this.getCurrentTrackId(),
|
|
218
|
-
value: this.getCurrentTrackStatus('paused'),
|
|
219
|
-
}
|
|
220
|
-
});
|
|
215
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_PAUSE, this.getCurrentTrackStatus('paused'));
|
|
221
216
|
});
|
|
222
217
|
this.audio.addEventListener('error', () => {
|
|
223
|
-
this.
|
|
224
|
-
action: 'status',
|
|
225
|
-
status: {
|
|
226
|
-
msgType: RmxAudioStatusMessage.RMXSTATUS_ERROR,
|
|
227
|
-
trackId: this.getCurrentTrackId(),
|
|
228
|
-
value: this.getCurrentTrackStatus('error'),
|
|
229
|
-
}
|
|
230
|
-
});
|
|
218
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_ERROR, this.getCurrentTrackStatus('error'));
|
|
231
219
|
});
|
|
232
220
|
this.audio.addEventListener('ended', () => {
|
|
233
|
-
this.
|
|
234
|
-
action: 'status',
|
|
235
|
-
status: {
|
|
236
|
-
msgType: RmxAudioStatusMessage.RMXSTATUS_STOPPED,
|
|
237
|
-
trackId: this.getCurrentTrackId(),
|
|
238
|
-
value: this.getCurrentTrackStatus('stopped'),
|
|
239
|
-
}
|
|
240
|
-
});
|
|
221
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_STOPPED, this.getCurrentTrackStatus('stopped'));
|
|
241
222
|
});
|
|
242
223
|
let lastTrackId, lastPosition;
|
|
243
224
|
this.audio.addEventListener('timeupdate', () => {
|
|
244
225
|
const status = this.getCurrentTrackStatus(this.lastState);
|
|
245
226
|
if (lastTrackId !== this.getCurrentTrackId() || lastPosition !== status.currentPosition) {
|
|
246
|
-
this.
|
|
247
|
-
action: 'status',
|
|
248
|
-
status: {
|
|
249
|
-
msgType: RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION,
|
|
250
|
-
trackId: this.getCurrentTrackId(),
|
|
251
|
-
value: status,
|
|
252
|
-
}
|
|
253
|
-
});
|
|
227
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION, status);
|
|
254
228
|
lastTrackId = this.getCurrentTrackId();
|
|
255
229
|
lastPosition = status.currentPosition;
|
|
256
230
|
}
|
|
@@ -317,28 +291,26 @@ export class PlaylistWeb extends WebPlugin {
|
|
|
317
291
|
this.play();
|
|
318
292
|
});
|
|
319
293
|
}
|
|
294
|
+
this.updateStatus(RmxAudioStatusMessage.RMXSTATUS_TRACK_CHANGED, {
|
|
295
|
+
currentItem: item
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
updateStatus(msgType, value, trackId) {
|
|
320
299
|
this.notifyListeners('status', {
|
|
321
300
|
action: 'status',
|
|
322
301
|
status: {
|
|
323
|
-
msgType:
|
|
324
|
-
trackId: this.getCurrentTrackId(),
|
|
325
|
-
value:
|
|
326
|
-
currentItem: item
|
|
327
|
-
}
|
|
302
|
+
msgType: msgType,
|
|
303
|
+
trackId: trackId ? trackId : this.getCurrentTrackId(),
|
|
304
|
+
value: value
|
|
328
305
|
}
|
|
329
306
|
});
|
|
330
307
|
}
|
|
331
|
-
log(message, ...optionalParams) {
|
|
332
|
-
if (this.options.verbose) {
|
|
333
|
-
console.log(message, ...optionalParams);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
308
|
loadHlsJs() {
|
|
337
309
|
if (this.hlsLoaded) {
|
|
338
310
|
return Promise.resolve();
|
|
339
311
|
}
|
|
340
312
|
return new Promise((resolve, reject) => {
|
|
341
|
-
|
|
313
|
+
const script = document.createElement('script');
|
|
342
314
|
script.type = 'text/javascript';
|
|
343
315
|
script.src = 'https://cdn.jsdelivr.net/npm/hls.js@1.1.1';
|
|
344
316
|
document.getElementsByTagName('head')[0].appendChild(script);
|