capacitor-plugin-playlist 0.1.21 → 0.1.22

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 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["esm/Constants.js","esm/utils.js","esm/plugin.js","esm/RmxAudioPlayer.js","esm/web.js"],"sourcesContent":["/**\n * Enum describing the possible errors that may come from the plugins\n */\nexport var RmxAudioErrorType;\n(function (RmxAudioErrorType) {\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_NONE_ACTIVE\"] = 0] = \"RMXERR_NONE_ACTIVE\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_ABORTED\"] = 1] = \"RMXERR_ABORTED\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_NETWORK\"] = 2] = \"RMXERR_NETWORK\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_DECODE\"] = 3] = \"RMXERR_DECODE\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_NONE_SUPPORTED\"] = 4] = \"RMXERR_NONE_SUPPORTED\";\n})(RmxAudioErrorType || (RmxAudioErrorType = {}));\n;\n/**\n * String descriptions corresponding to the RmxAudioErrorType values\n */\nexport const RmxAudioErrorTypeDescriptions = [\n 'No Active Sources',\n 'Aborted',\n 'Network',\n 'Failed to Decode',\n 'No Supported Sources',\n];\n/**\n * Enumeration of all status messages raised by the plugin.\n * NONE, REGISTER and INIT are structural and probably not useful to you.\n */\nexport var RmxAudioStatusMessage;\n(function (RmxAudioStatusMessage) {\n /**\n * The starting state of the plugin. You will never see this value;\n * it changes before the callbacks are even registered to report changes to this value.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_NONE\"] = 0] = \"RMXSTATUS_NONE\";\n /**\n * Raised when the plugin registers the callback handler for onStatus callbacks.\n * You will probably not be able to see this (nor do you need to).\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_REGISTER\"] = 1] = \"RMXSTATUS_REGISTER\";\n /**\n * Reserved for future use\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_INIT\"] = 2] = \"RMXSTATUS_INIT\";\n /**\n * Indicates an error is reported in the 'value' field.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_ERROR\"] = 5] = \"RMXSTATUS_ERROR\";\n /**\n * The reported track is being loaded by the player\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_LOADING\"] = 10] = \"RMXSTATUS_LOADING\";\n /**\n * The reported track is able to begin playback\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_CANPLAY\"] = 11] = \"RMXSTATUS_CANPLAY\";\n /**\n * The reported track has loaded 100% of the file (either from disc or network)\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_LOADED\"] = 15] = \"RMXSTATUS_LOADED\";\n /**\n * (iOS only): Playback has stalled due to insufficient network\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_STALLED\"] = 20] = \"RMXSTATUS_STALLED\";\n /**\n * Reports an update in the reported track's buffering status\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_BUFFERING\"] = 25] = \"RMXSTATUS_BUFFERING\";\n /**\n * The reported track has started (or resumed) playing\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYING\"] = 30] = \"RMXSTATUS_PLAYING\";\n /**\n * The reported track has been paused, either by the user or by the system.\n * (iOS only): This value is raised when MP3's are malformed (but still playable).\n * These require the user to explicitly press play again. This can be worked\n * around and is on the TODO list.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PAUSE\"] = 35] = \"RMXSTATUS_PAUSE\";\n /**\n * Reports a change in the reported track's playback position.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYBACK_POSITION\"] = 40] = \"RMXSTATUS_PLAYBACK_POSITION\";\n /**\n * The reported track has seeked.\n * On Android, only the plugin consumer can generate this (Notification controls on Android do not include a seek bar).\n * On iOS, the Command Center includes a seek bar so this will be reported when the user has seeked via Command Center.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_SEEK\"] = 45] = \"RMXSTATUS_SEEK\";\n /**\n * The reported track has completed playback.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_COMPLETED\"] = 50] = \"RMXSTATUS_COMPLETED\";\n /**\n * The reported track's duration has changed. This is raised once, when duration is updated for the first time.\n * For streams, this value is never reported.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_DURATION\"] = 55] = \"RMXSTATUS_DURATION\";\n /**\n * All playback has stopped, probably because the plugin is shutting down.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_STOPPED\"] = 60] = \"RMXSTATUS_STOPPED\";\n /**\n * The playlist has skipped forward to the next track.\n * On both Android and iOS, this will be raised if the notification controls/Command Center were used to skip.\n * It is unlikely you need to consume this event: RMXSTATUS_TRACK_CHANGED is also reported when this occurs,\n * so you can generalize your track change handling in one place.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMX_STATUS_SKIP_FORWARD\"] = 90] = \"RMX_STATUS_SKIP_FORWARD\";\n /**\n * The playlist has skipped back to the previous track.\n * On both Android and iOS, this will be raised if the notification controls/Command Center were used to skip.\n * It is unlikely you need to consume this event: RMXSTATUS_TRACK_CHANGED is also reported when this occurs,\n * so you can generalize your track change handling in one place.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMX_STATUS_SKIP_BACK\"] = 95] = \"RMX_STATUS_SKIP_BACK\";\n /**\n * Reported when the current track has changed in the native player. This event contains full data about\n * the new track, including the index and the actual track itself. The type of the 'value' field in this case\n * is OnStatusTrackChangedData.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_TRACK_CHANGED\"] = 100] = \"RMXSTATUS_TRACK_CHANGED\";\n /**\n * The entire playlist has completed playback.\n * After this event has been raised, the current item is set to null and the current index to -1.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYLIST_COMPLETED\"] = 105] = \"RMXSTATUS_PLAYLIST_COMPLETED\";\n /**\n * An item has been added to the playlist. For the setPlaylistItems and addAllItems methods, this status is\n * raised once for every track in the collection.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_ITEM_ADDED\"] = 110] = \"RMXSTATUS_ITEM_ADDED\";\n /**\n * An item has been removed from the playlist. For the removeItems and clearAllItems methods, this status is\n * raised once for every track that was removed.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_ITEM_REMOVED\"] = 115] = \"RMXSTATUS_ITEM_REMOVED\";\n /**\n * All items have been removed from the playlist\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYLIST_CLEARED\"] = 120] = \"RMXSTATUS_PLAYLIST_CLEARED\";\n /**\n * Just for testing.. you don't need this and in fact can never receive it, the plugin is destroyed before it can be raised.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_VIEWDISAPPEAR\"] = 200] = \"RMXSTATUS_VIEWDISAPPEAR\";\n})(RmxAudioStatusMessage || (RmxAudioStatusMessage = {}));\n;\n/**\n * String descriptions corresponding to the RmxAudioStatusMessage values\n */\nexport const RmxAudioStatusMessageDescriptions = {\n 0: 'No Status',\n 1: 'Plugin Registered',\n 2: 'Plugin Initialized',\n 5: 'Error',\n 10: 'Loading',\n 11: 'CanPlay',\n 15: 'Loaded',\n 20: 'Stalled',\n 25: 'Buffering',\n 30: 'Playing',\n 35: 'Paused',\n 40: 'Playback Position Changed',\n 45: 'Seeked',\n 50: 'Playback Completed',\n 55: 'Duration Changed',\n 60: 'Stopped',\n 90: 'Skip Forward',\n 95: 'Skip Backward',\n 100: 'Track Changed',\n 105: 'Playlist Completed',\n 110: 'Track Added',\n 115: 'Track Removed',\n 120: 'Playlist Cleared',\n 200: 'DEBUG_View_Disappeared',\n};\n//# sourceMappingURL=Constants.js.map","/**\n * Validates the list of AudioTrack items to ensure they are valid.\n * Used internally but you can call this if you need to :)\n *\n * @param items The AudioTrack items to validate\n */\nexport const validateTracks = (items) => {\n if (!items || !Array.isArray(items)) {\n return [];\n }\n return items.map(validateTrack).filter(x => !!x); // may produce an empty array!\n};\n/**\n * Validate a single track and ensure it is valid for playback.\n * Used internally but you can call this if you need to :)\n *\n * @param track The AudioTrack to validate\n */\nexport const validateTrack = (track) => {\n if (!track) {\n return null;\n }\n // For now we will rely on TS to do the heavy lifting, but we can add a validation here\n // that all the required fields are valid. For now we just take care of the unique ID.\n track.trackId = track.trackId || generateUUID();\n return track;\n};\n/**\n * Generate a v4 UUID for use as a unique trackId. Used internally, but you can use this to generate track ID's if you want.\n */\nconst generateUUID = () => {\n var d = new Date().getTime();\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n d += performance.now(); //use high-precision timer if available\n }\n // There are better ways to do this in ES6, we are intentionally avoiding the import\n // of an ES6 polyfill here.\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n return [].slice.call(template).map(function (c) {\n if (c === '-' || c === '4') {\n return c;\n }\n var r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n }).join('');\n};\n//# sourceMappingURL=utils.js.map","import { registerPlugin } from '@capacitor/core';\n// todo: find out why we get imported twice\nlet playListWebInstance;\nconst Playlist = registerPlugin('Playlist', {\n web: () => import('./web').then(m => {\n if (!playListWebInstance) {\n playListWebInstance = new m.PlaylistWeb();\n }\n return playListWebInstance;\n }),\n});\nexport { Playlist };\n//# sourceMappingURL=plugin.js.map","import { RmxAudioStatusMessage, RmxAudioStatusMessageDescriptions, } from './Constants';\nimport { validateTrack, validateTracks } from './utils';\nimport { Playlist } from './plugin';\n/*!\n * Module dependencies.\n */\nconst itemStatusChangeTypes = [\n RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION,\n RmxAudioStatusMessage.RMXSTATUS_DURATION,\n RmxAudioStatusMessage.RMXSTATUS_BUFFERING,\n RmxAudioStatusMessage.RMXSTATUS_CANPLAY,\n RmxAudioStatusMessage.RMXSTATUS_LOADING,\n RmxAudioStatusMessage.RMXSTATUS_LOADED,\n RmxAudioStatusMessage.RMXSTATUS_PAUSE,\n RmxAudioStatusMessage.RMXSTATUS_COMPLETED,\n RmxAudioStatusMessage.RMXSTATUS_ERROR,\n];\nexport class RmxAudioPlayer {\n /**\n * Creates a new RmxAudioPlayer instance.\n */\n constructor() {\n this.handlers = {};\n this.options = { verbose: false, resetStreamOnPause: true };\n this._inititialized = false;\n this._readyResolve = () => {\n };\n this._readyReject = () => {\n };\n this._currentState = 'unknown';\n this._hasError = false;\n this._hasLoaded = false;\n this._currentItem = null;\n /**\n * Player interface\n */\n /**\n * Returns a promise that resolves when the plugin is ready.\n */\n this.ready = () => {\n return this._initPromise;\n };\n this.initialize = async () => {\n Playlist.addListener('status', (data) => {\n if (data.action === 'status') {\n this.onStatus(data.status.trackId, data.status.msgType, data.status.value);\n }\n else {\n console.warn('Unknown audio player onStatus message:', data);\n }\n });\n try {\n await Playlist.initialize();\n this._inititialized = true;\n this._readyResolve();\n }\n catch (args) {\n const message = 'Capacitor RMXAUDIOPLAYER: Error initializing:';\n console.warn(message, args);\n this._readyReject();\n }\n return this._initPromise;\n };\n /**\n * Sets the player options. This can be called at any time and is not required before playback can be initiated.\n */\n this.setOptions = (options) => {\n this.options = Object.assign(Object.assign({}, this.options), options);\n return Playlist.setOptions(this.options);\n };\n /**\n * Playlist item management\n */\n /**\n * Sets the entire list of tracks to be played by the playlist.\n * This will clear all previous items from the playlist.\n * If you pass options.retainPosition = true, the current playback position will be\n * recorded and used when playback restarts. This can be used, for example, to set the\n * playlist to a new set of tracks, but retain the currently-playing item to avoid skipping.\n */\n this.setPlaylistItems = (items, options) => {\n return Playlist.setPlaylistItems({ items: validateTracks(items), options: options || {} });\n };\n /**\n * Add a single track to the end of the playlist\n */\n this.addItem = (trackItem) => {\n const validTrackItem = validateTrack(trackItem);\n if (!validTrackItem) {\n throw new Error('Provided track is null or not an audio track');\n }\n return Playlist.addItem({ item: validTrackItem });\n };\n /**\n * Adds the list of tracks to the end of the playlist.\n */\n this.addAllItems = (items) => {\n return Playlist.addAllItems({ items: validateTracks(items) });\n };\n /**\n * Removes a track from the playlist. If this is the currently playing item, the next item will automatically begin playback.\n */\n this.removeItem = (removeItem) => {\n if (!removeItem) {\n throw new Error('Track removal spec is empty');\n }\n if (!removeItem.trackId && !removeItem.trackIndex) {\n new Error('Track removal spec is invalid');\n }\n return Playlist.removeItem({ item: removeItem });\n };\n /**\n * Removes all given tracks from the playlist; these can be specified either by trackId or trackIndex. If the removed items\n * include the currently playing item, the next available item will automatically begin playing.\n */\n this.removeItems = (items) => {\n return Playlist.removeItems({ items });\n };\n /**\n * Clear the entire playlist. This will result in the STOPPED event being raised.\n */\n this.clearAllItems = () => {\n return Playlist.clearAllItems();\n };\n /**\n * Playback management\n */\n /**\n * Begin playback. If no tracks have been added, this has no effect.\n */\n this.play = () => {\n return Playlist.play();\n };\n /**\n * Play the track at the given index. If the track does not exist, this has no effect.\n */\n this.playTrackByIndex = (index, position) => {\n return Playlist.playTrackByIndex({ index, position: position || 0 });\n };\n /**\n * Play the track matching the given trackId. If the track does not exist, this has no effect.\n */\n this.playTrackById = (id, position) => {\n return Playlist.playTrackById({ id, position: position || 0 });\n };\n /**\n * Play the track matching the given trackId. If the track does not exist, this has no effect.\n */\n this.selectTrackByIndex = (index, position) => {\n return Playlist.selectTrackByIndex({ index, position: position || 0 });\n };\n /**\n * Play the track matching the given trackId. If the track does not exist, this has no effect.\n */\n this.selectTrackById = (id, position) => {\n return Playlist.selectTrackById({ id, position: position || 0 });\n };\n /**\n * Pause playback\n */\n this.pause = () => {\n return Playlist.pause();\n };\n /**\n * Skip to the next track. If you are already at the end, and loop is false, this has no effect.\n * If you are at the end, and loop is true, playback will begin at the beginning of the playlist.\n */\n this.skipForward = () => {\n return Playlist.skipForward();\n };\n /**\n * Skip to the previous track. If you are already at the beginning, this has no effect.\n */\n this.skipBack = () => {\n return Playlist.skipBack();\n };\n /**\n * Seek to the given position in the currently playing track. If the value exceeds the track length,\n * the track will complete and playback of the next track will begin.\n */\n this.seekTo = (position) => {\n return Playlist.seekTo({ position });\n };\n /**\n * Set the playback speed; a float value between [-1, 1] inclusive. If set to 0, this pauses playback.\n */\n this.setPlaybackRate = (rate) => {\n return Playlist.setPlaybackRate({ rate });\n };\n /**\n * Set the playback volume. Float value between [0, 1] inclusive.\n * On both Android and iOS, this sets the volume of the media stream, which can be externally\n * controlled by setting the overall hardware volume.\n */\n this.setVolume = (volume) => {\n return Playlist.setPlaybackVolume({ volume });\n };\n /**\n * Sets a flag indicating whether the playlist should loop back to the beginning once it reaches the end.\n */\n this.setLoop = (loop) => {\n return Playlist.setLoop({ loop: loop });\n };\n this.handlers = {};\n this._initPromise = new Promise((resolve, reject) => {\n this._readyResolve = resolve;\n this._readyReject = reject;\n });\n new Promise((resolve) => {\n window.addEventListener('beforeunload', () => resolve(), { once: true });\n }).then(() => Playlist.release());\n }\n /**\n * The current summarized state of the player, as a string. It is preferred that you use the 'isX' accessors,\n * because they properly interpret the range of these values, but this field is exposed if you wish to observe\n * or interrogate it.\n */\n get currentState() {\n return this._currentState;\n }\n /**\n * True if the plugin has been initialized. You'll likely never see this state; it is handled internally.\n */\n get isInitialized() {\n return this._inititialized;\n }\n get currentTrack() {\n return this._currentItem;\n }\n /**\n * If the playlist is currently playling a track.\n */\n get isPlaying() {\n return this._currentState === 'playing';\n }\n /**\n * True if the playlist is currently paused\n */\n get isPaused() {\n return this._currentState === 'paused' || this._currentState === 'stopped';\n }\n /**\n * True if the plugin is currently loading its *current* track.\n * On iOS, many tracks are loaded in parallel, so this only reports for the *current item*, e.g.\n * the item that will begin playback if you press pause.\n * If you need track-specific data, it is better to watch the onStatus stream and watch for RMXSTATUS_LOADING,\n * which will be raised independently & simultaneously for every track in the playlist.\n * On Android, tracks are only loaded as they begin playback, so this value and RMXSTATUS_LOADING should always\n * apply to the same track.\n */\n get isLoading() {\n return this._currentState === 'loading';\n }\n /**\n * True if the *currently playing track* has been loaded and can be played (this includes if it is *currently playing*).\n */\n get hasLoaded() {\n return this._hasLoaded;\n }\n /**\n * True if the *current track* has reported an error. In almost all cases,\n * the playlist will automatically skip forward to the next track, in which case you will also receive\n * an RMXSTATUS_TRACK_CHANGED event.\n */\n get hasError() {\n return this._hasError;\n }\n /**\n * Status event handling\n */\n /**\n * @internal\n * Call this function to emit an onStatus event via the on('status') handler.\n * Internal use only, to raise events received from the native interface.\n */\n onStatus(trackId, type, value) {\n var _a;\n const status = { type: type, trackId: trackId, value: value };\n if (this.options.verbose) {\n console.debug(`RmxAudioPlayer.onStatus: ${RmxAudioStatusMessageDescriptions[type]}(${type}) [${trackId}]: `, value);\n }\n if (status.type === RmxAudioStatusMessage.RMXSTATUS_TRACK_CHANGED) {\n this._hasError = false;\n this._hasLoaded = false;\n this._currentState = 'loading';\n this._currentItem = (_a = status.value) === null || _a === void 0 ? void 0 : _a.currentItem;\n }\n // The plugin's status changes only in response to specific events.\n if (itemStatusChangeTypes.indexOf(status.type) >= 0) {\n // Only change the plugin's *current status* if the event being raised is for the current active track.\n if (this._currentItem && this._currentItem.trackId === trackId) {\n if (status.value && status.value.status) {\n this._currentState = status.value.status;\n }\n if (status.type === RmxAudioStatusMessage.RMXSTATUS_CANPLAY) {\n this._hasLoaded = true;\n }\n if (status.type === RmxAudioStatusMessage.RMXSTATUS_ERROR) {\n this._hasError = true;\n }\n }\n }\n this.emit('status', status);\n }\n on(eventName, callback) {\n if (!Object.prototype.hasOwnProperty.call(this.handlers, eventName)) {\n this.handlers[eventName] = [];\n }\n this.handlers[eventName].push(callback);\n }\n /**\n * Remove an event handler from the plugin\n * @param eventName The name of the event whose subscription is to be removed\n * @param handle The event handler to destroy. Ensure that this is the SAME INSTANCE as the handler\n * that was passed in to create the subscription!\n */\n off(eventName, handle) {\n if (Object.prototype.hasOwnProperty.call(this.handlers, eventName)) {\n const handleIndex = this.handlers[eventName].indexOf(handle);\n if (handleIndex >= 0) {\n this.handlers[eventName].splice(handleIndex, 1);\n }\n }\n }\n /**\n * @internal\n * Raises an event via the corresponding event handler. Internal use only.\n * @param args Event args to pass through to the handler.\n */\n emit(...args) {\n const eventName = args.shift();\n if (!Object.prototype.hasOwnProperty.call(this.handlers, eventName)) {\n return false;\n }\n const handler = this.handlers[eventName];\n for (let i = 0; i < handler.length; i++) {\n const callback = this.handlers[eventName][i];\n if (typeof callback === 'function') {\n callback(...args);\n }\n }\n return true;\n }\n}\n//# sourceMappingURL=RmxAudioPlayer.js.map","import { WebPlugin } from '@capacitor/core';\nimport { validateTrack, validateTracks } from './utils';\nimport { RmxAudioStatusMessage } from './Constants';\nexport class PlaylistWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.playlistItems = [];\n this.loop = false;\n this.options = {};\n this.currentTrack = null;\n this.lastState = 'stopped';\n this.hlsLoaded = false;\n }\n addAllItems(options) {\n this.playlistItems = this.playlistItems.concat(validateTracks(options.items));\n return Promise.resolve();\n }\n addItem(options) {\n const track = validateTrack(options.item);\n if (track) {\n this.playlistItems.push(track);\n }\n return Promise.resolve();\n }\n async clearAllItems() {\n await this.release();\n this.playlistItems = [];\n return Promise.resolve();\n }\n async initialize() {\n return Promise.resolve();\n }\n async pause() {\n var _a;\n (_a = this.audio) === null || _a === void 0 ? void 0 : _a.pause();\n }\n async play() {\n var _a;\n return (_a = this.audio) === null || _a === void 0 ? void 0 : _a.play();\n }\n playTrackById(options) {\n this.playlistItems.forEach(async (item) => {\n if (item.trackId === options.id) {\n await this.setCurrent(item);\n return this.play();\n }\n });\n return Promise.reject();\n }\n playTrackByIndex(options) {\n this.playlistItems.forEach(async (item, index) => {\n if (index === options.index) {\n await this.setCurrent(item);\n return this.play();\n }\n });\n return Promise.reject();\n }\n async release() {\n await this.pause();\n this.audio = undefined;\n return Promise.resolve();\n }\n removeItem(options) {\n this.playlistItems.forEach((item, index) => {\n if (options.item.trackIndex && options.item.trackIndex === index) {\n this.playlistItems.splice(index, 1);\n }\n else if (options.item.trackId && options.item.trackId === item.trackId) {\n this.playlistItems.splice(index, 1);\n }\n });\n return Promise.resolve();\n }\n removeItems(options) {\n options.items.forEach((item) => {\n this.removeItem({ item });\n });\n return Promise.resolve();\n }\n seekTo(options) {\n if (this.audio) {\n this.audio.currentTime = options.position;\n return Promise.resolve();\n }\n return Promise.reject();\n }\n selectTrackById(options) {\n for (const item of this.playlistItems) {\n if (item.trackId === options.id) {\n return this.setCurrent(item);\n }\n }\n return Promise.reject();\n }\n selectTrackByIndex(options) {\n let index = 0;\n for (const item of this.playlistItems) {\n if (index === options.index) {\n return this.setCurrent(item);\n }\n index++;\n }\n return Promise.reject();\n }\n setLoop(options) {\n this.loop = options.loop;\n return Promise.resolve();\n }\n setOptions(options) {\n this.options = options || {};\n return Promise.resolve();\n }\n setPlaybackVolume(options) {\n if (this.audio) {\n this.audio.volume = options.volume;\n return Promise.resolve();\n }\n return Promise.reject();\n }\n setPlaylistItems(options) {\n var _a;\n this.playlistItems = options.items;\n if (this.playlistItems.length > 0) {\n return this.setCurrent(this.playlistItems[0], ((_a = options.options) === null || _a === void 0 ? void 0 : _a.playFromPosition) || 0);\n }\n return Promise.resolve();\n }\n skipForward() {\n let found = null;\n this.playlistItems.forEach((item, index) => {\n if (!found && this.getCurrentTrackId() === item.trackId) {\n found = index;\n }\n });\n if (found === this.playlistItems.length - 1) {\n found = -1;\n }\n if (found !== null) {\n return this.setCurrent(this.playlistItems[found + 1]);\n }\n return Promise.reject();\n }\n skipBack() {\n let found = null;\n this.playlistItems.forEach((item, index) => {\n if (!found && this.getCurrentTrackId() === item.trackId) {\n found = index;\n }\n });\n if (found === 0) {\n found = this.playlistItems.length - 1;\n }\n if (found !== null) {\n this.setCurrent(this.playlistItems[found - 1]);\n return Promise.resolve();\n }\n return Promise.reject();\n }\n setPlaybackRate(options) {\n if (this.audio) {\n this.audio.playbackRate = options.rate;\n return Promise.resolve();\n }\n return Promise.reject();\n }\n // register events\n /*\n private registerHlsListeners(hls: Hls, position?: number) {\n hls.on(Hls.Events.MANIFEST_PARSED, async () => {\n this.notifyListeners('status', {\n action: \"status\",\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_CANPLAY,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('loading'),\n }\n })\n if(position) {\n await this.seekTo({position});\n }\n });\n }*/\n registerHtmlListeners(position) {\n const canPlayListener = async () => {\n var _a;\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_CANPLAY,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('loading'),\n }\n });\n if (position) {\n await this.seekTo({ position });\n }\n (_a = this.audio) === null || _a === void 0 ? void 0 : _a.removeEventListener('canplay', canPlayListener);\n };\n if (this.audio) {\n this.audio.addEventListener('canplay', canPlayListener);\n this.audio.addEventListener('playing', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_PLAYING,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('playing'),\n }\n });\n });\n this.audio.addEventListener('pause', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_PAUSE,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('paused'),\n }\n });\n });\n this.audio.addEventListener('error', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_ERROR,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('error'),\n }\n });\n });\n this.audio.addEventListener('ended', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_STOPPED,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('stopped'),\n }\n });\n });\n let lastTrackId, lastPosition;\n this.audio.addEventListener('timeupdate', () => {\n const status = this.getCurrentTrackStatus(this.lastState);\n if (lastTrackId !== this.getCurrentTrackId() || lastPosition !== status.currentPosition) {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION,\n trackId: this.getCurrentTrackId(),\n value: status,\n }\n });\n lastTrackId = this.getCurrentTrackId();\n lastPosition = status.currentPosition;\n }\n });\n }\n }\n getCurrentTrackId() {\n if (this.currentTrack) {\n return this.currentTrack.trackId;\n }\n return 'INVALID';\n }\n getCurrentIndex() {\n if (this.currentTrack) {\n for (let i = 0; i < this.playlistItems.length; i++) {\n if (this.playlistItems[i].trackId === this.currentTrack.trackId) {\n return i;\n }\n }\n }\n return -1;\n }\n getCurrentTrackStatus(currentState) {\n var _a, _b;\n this.lastState = currentState;\n return {\n trackId: this.getCurrentTrackId(),\n isStream: !!((_a = this.currentTrack) === null || _a === void 0 ? void 0 : _a.isStream),\n currentIndex: this.getCurrentIndex(),\n status: currentState,\n currentPosition: ((_b = this.audio) === null || _b === void 0 ? void 0 : _b.currentTime) || 0,\n };\n }\n async setCurrent(item, position) {\n let wasPlaying = false;\n if (this.audio) {\n wasPlaying = !this.audio.paused;\n this.audio.pause();\n this.audio.src = '';\n this.audio.removeAttribute('src');\n this.audio.load();\n }\n this.audio = document.createElement('video');\n this.currentTrack = item;\n if (item.assetUrl.includes('.m3u8')) {\n await this.loadHlsJs();\n const hls = new Hls({\n autoStartLoad: true,\n debug: false,\n enableWorker: true,\n });\n hls.attachMedia(this.audio);\n hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n hls.loadSource(item.assetUrl);\n });\n //this.registerHlsListeners(hls, position);\n }\n else {\n this.audio.src = item.assetUrl;\n }\n await this.registerHtmlListeners(position);\n if (wasPlaying) {\n this.audio.addEventListener('canplay', () => {\n this.play();\n });\n }\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_TRACK_CHANGED,\n trackId: this.getCurrentTrackId(),\n value: {\n currentItem: item\n }\n }\n });\n }\n log(message, ...optionalParams) {\n if (this.options.verbose) {\n console.log(message, ...optionalParams);\n }\n }\n loadHlsJs() {\n if (this.hlsLoaded) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n var script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = 'https://cdn.jsdelivr.net/npm/hls.js@1.1.1';\n document.getElementsByTagName('head')[0].appendChild(script);\n script.onload = () => {\n this.hlsLoaded = true;\n resolve(void 0);\n };\n script.onerror = () => {\n reject();\n };\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["RmxAudioErrorType","RmxAudioStatusMessage","registerPlugin","WebPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["esm/Constants.js","esm/plugin.js","esm/utils.js","esm/RmxAudioPlayer.js","esm/web.js"],"sourcesContent":["/**\n * Enum describing the possible errors that may come from the plugins\n */\nexport var RmxAudioErrorType;\n(function (RmxAudioErrorType) {\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_NONE_ACTIVE\"] = 0] = \"RMXERR_NONE_ACTIVE\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_ABORTED\"] = 1] = \"RMXERR_ABORTED\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_NETWORK\"] = 2] = \"RMXERR_NETWORK\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_DECODE\"] = 3] = \"RMXERR_DECODE\";\n RmxAudioErrorType[RmxAudioErrorType[\"RMXERR_NONE_SUPPORTED\"] = 4] = \"RMXERR_NONE_SUPPORTED\";\n})(RmxAudioErrorType || (RmxAudioErrorType = {}));\n;\n/**\n * String descriptions corresponding to the RmxAudioErrorType values\n */\nexport const RmxAudioErrorTypeDescriptions = [\n 'No Active Sources',\n 'Aborted',\n 'Network',\n 'Failed to Decode',\n 'No Supported Sources',\n];\n/**\n * Enumeration of all status messages raised by the plugin.\n * NONE, REGISTER and INIT are structural and probably not useful to you.\n */\nexport var RmxAudioStatusMessage;\n(function (RmxAudioStatusMessage) {\n /**\n * The starting state of the plugin. You will never see this value;\n * it changes before the callbacks are even registered to report changes to this value.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_NONE\"] = 0] = \"RMXSTATUS_NONE\";\n /**\n * Raised when the plugin registers the callback handler for onStatus callbacks.\n * You will probably not be able to see this (nor do you need to).\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_REGISTER\"] = 1] = \"RMXSTATUS_REGISTER\";\n /**\n * Reserved for future use\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_INIT\"] = 2] = \"RMXSTATUS_INIT\";\n /**\n * Indicates an error is reported in the 'value' field.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_ERROR\"] = 5] = \"RMXSTATUS_ERROR\";\n /**\n * The reported track is being loaded by the player\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_LOADING\"] = 10] = \"RMXSTATUS_LOADING\";\n /**\n * The reported track is able to begin playback\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_CANPLAY\"] = 11] = \"RMXSTATUS_CANPLAY\";\n /**\n * The reported track has loaded 100% of the file (either from disc or network)\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_LOADED\"] = 15] = \"RMXSTATUS_LOADED\";\n /**\n * (iOS only): Playback has stalled due to insufficient network\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_STALLED\"] = 20] = \"RMXSTATUS_STALLED\";\n /**\n * Reports an update in the reported track's buffering status\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_BUFFERING\"] = 25] = \"RMXSTATUS_BUFFERING\";\n /**\n * The reported track has started (or resumed) playing\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYING\"] = 30] = \"RMXSTATUS_PLAYING\";\n /**\n * The reported track has been paused, either by the user or by the system.\n * (iOS only): This value is raised when MP3's are malformed (but still playable).\n * These require the user to explicitly press play again. This can be worked\n * around and is on the TODO list.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PAUSE\"] = 35] = \"RMXSTATUS_PAUSE\";\n /**\n * Reports a change in the reported track's playback position.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYBACK_POSITION\"] = 40] = \"RMXSTATUS_PLAYBACK_POSITION\";\n /**\n * The reported track has seeked.\n * On Android, only the plugin consumer can generate this (Notification controls on Android do not include a seek bar).\n * On iOS, the Command Center includes a seek bar so this will be reported when the user has seeked via Command Center.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_SEEK\"] = 45] = \"RMXSTATUS_SEEK\";\n /**\n * The reported track has completed playback.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_COMPLETED\"] = 50] = \"RMXSTATUS_COMPLETED\";\n /**\n * The reported track's duration has changed. This is raised once, when duration is updated for the first time.\n * For streams, this value is never reported.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_DURATION\"] = 55] = \"RMXSTATUS_DURATION\";\n /**\n * All playback has stopped, probably because the plugin is shutting down.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_STOPPED\"] = 60] = \"RMXSTATUS_STOPPED\";\n /**\n * The playlist has skipped forward to the next track.\n * On both Android and iOS, this will be raised if the notification controls/Command Center were used to skip.\n * It is unlikely you need to consume this event: RMXSTATUS_TRACK_CHANGED is also reported when this occurs,\n * so you can generalize your track change handling in one place.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMX_STATUS_SKIP_FORWARD\"] = 90] = \"RMX_STATUS_SKIP_FORWARD\";\n /**\n * The playlist has skipped back to the previous track.\n * On both Android and iOS, this will be raised if the notification controls/Command Center were used to skip.\n * It is unlikely you need to consume this event: RMXSTATUS_TRACK_CHANGED is also reported when this occurs,\n * so you can generalize your track change handling in one place.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMX_STATUS_SKIP_BACK\"] = 95] = \"RMX_STATUS_SKIP_BACK\";\n /**\n * Reported when the current track has changed in the native player. This event contains full data about\n * the new track, including the index and the actual track itself. The type of the 'value' field in this case\n * is OnStatusTrackChangedData.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_TRACK_CHANGED\"] = 100] = \"RMXSTATUS_TRACK_CHANGED\";\n /**\n * The entire playlist has completed playback.\n * After this event has been raised, the current item is set to null and the current index to -1.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYLIST_COMPLETED\"] = 105] = \"RMXSTATUS_PLAYLIST_COMPLETED\";\n /**\n * An item has been added to the playlist. For the setPlaylistItems and addAllItems methods, this status is\n * raised once for every track in the collection.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_ITEM_ADDED\"] = 110] = \"RMXSTATUS_ITEM_ADDED\";\n /**\n * An item has been removed from the playlist. For the removeItems and clearAllItems methods, this status is\n * raised once for every track that was removed.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_ITEM_REMOVED\"] = 115] = \"RMXSTATUS_ITEM_REMOVED\";\n /**\n * All items have been removed from the playlist\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_PLAYLIST_CLEARED\"] = 120] = \"RMXSTATUS_PLAYLIST_CLEARED\";\n /**\n * Just for testing.. you don't need this and in fact can never receive it, the plugin is destroyed before it can be raised.\n */\n RmxAudioStatusMessage[RmxAudioStatusMessage[\"RMXSTATUS_VIEWDISAPPEAR\"] = 200] = \"RMXSTATUS_VIEWDISAPPEAR\";\n})(RmxAudioStatusMessage || (RmxAudioStatusMessage = {}));\n;\n/**\n * String descriptions corresponding to the RmxAudioStatusMessage values\n */\nexport const RmxAudioStatusMessageDescriptions = {\n 0: 'No Status',\n 1: 'Plugin Registered',\n 2: 'Plugin Initialized',\n 5: 'Error',\n 10: 'Loading',\n 11: 'CanPlay',\n 15: 'Loaded',\n 20: 'Stalled',\n 25: 'Buffering',\n 30: 'Playing',\n 35: 'Paused',\n 40: 'Playback Position Changed',\n 45: 'Seeked',\n 50: 'Playback Completed',\n 55: 'Duration Changed',\n 60: 'Stopped',\n 90: 'Skip Forward',\n 95: 'Skip Backward',\n 100: 'Track Changed',\n 105: 'Playlist Completed',\n 110: 'Track Added',\n 115: 'Track Removed',\n 120: 'Playlist Cleared',\n 200: 'DEBUG_View_Disappeared',\n};\n//# sourceMappingURL=Constants.js.map","import { registerPlugin } from '@capacitor/core';\n// todo: find out why we get imported twice\nlet playListWebInstance;\nconst Playlist = registerPlugin('Playlist', {\n web: () => import('./web').then(m => {\n if (!playListWebInstance) {\n playListWebInstance = new m.PlaylistWeb();\n }\n return playListWebInstance;\n }),\n});\nexport { Playlist };\n//# sourceMappingURL=plugin.js.map","/**\n * Validates the list of AudioTrack items to ensure they are valid.\n * Used internally but you can call this if you need to :)\n *\n * @param items The AudioTrack items to validate\n */\nexport const validateTracks = (items) => {\n if (!items || !Array.isArray(items)) {\n return [];\n }\n return items.map(validateTrack).filter(x => !!x); // may produce an empty array!\n};\n/**\n * Validate a single track and ensure it is valid for playback.\n * Used internally but you can call this if you need to :)\n *\n * @param track The AudioTrack to validate\n */\nexport const validateTrack = (track) => {\n if (!track) {\n return null;\n }\n // For now we will rely on TS to do the heavy lifting, but we can add a validation here\n // that all the required fields are valid. For now we just take care of the unique ID.\n track.trackId = track.trackId || generateUUID();\n return track;\n};\n/**\n * Generate a v4 UUID for use as a unique trackId. Used internally, but you can use this to generate track ID's if you want.\n */\nconst generateUUID = () => {\n var d = new Date().getTime();\n if (typeof performance !== 'undefined' && typeof performance.now === 'function') {\n d += performance.now(); //use high-precision timer if available\n }\n // There are better ways to do this in ES6, we are intentionally avoiding the import\n // of an ES6 polyfill here.\n const template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';\n return [].slice.call(template).map(function (c) {\n if (c === '-' || c === '4') {\n return c;\n }\n var r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n }).join('');\n};\n//# sourceMappingURL=utils.js.map","import { RmxAudioStatusMessage, RmxAudioStatusMessageDescriptions } from './Constants';\nimport { Playlist } from './plugin';\nimport { validateTrack, validateTracks } from './utils';\n/*!\n * Module dependencies.\n */\nconst itemStatusChangeTypes = [\n RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION,\n RmxAudioStatusMessage.RMXSTATUS_DURATION,\n RmxAudioStatusMessage.RMXSTATUS_BUFFERING,\n RmxAudioStatusMessage.RMXSTATUS_CANPLAY,\n RmxAudioStatusMessage.RMXSTATUS_LOADING,\n RmxAudioStatusMessage.RMXSTATUS_LOADED,\n RmxAudioStatusMessage.RMXSTATUS_PAUSE,\n RmxAudioStatusMessage.RMXSTATUS_COMPLETED,\n RmxAudioStatusMessage.RMXSTATUS_ERROR,\n];\nexport class RmxAudioPlayer {\n /**\n * Creates a new RmxAudioPlayer instance.\n */\n constructor() {\n this.handlers = {};\n this.options = { verbose: false, resetStreamOnPause: true };\n this._inititialized = false;\n this._readyResolve = () => {\n };\n this._readyReject = () => {\n };\n this._currentState = 'unknown';\n this._hasError = false;\n this._hasLoaded = false;\n this._currentItem = null;\n /**\n * Player interface\n */\n /**\n * Returns a promise that resolves when the plugin is ready.\n */\n this.ready = () => {\n return this._initPromise;\n };\n this.initialize = async () => {\n Playlist.addListener('status', (data) => {\n if (data.action === 'status') {\n this.onStatus(data.status.trackId, data.status.msgType, data.status.value);\n }\n else {\n console.warn('Unknown audio player onStatus message:', data);\n }\n });\n try {\n await Playlist.initialize();\n this._inititialized = true;\n this._readyResolve();\n }\n catch (args) {\n const message = 'Capacitor RMXAUDIOPLAYER: Error initializing:';\n console.warn(message, args);\n this._readyReject();\n }\n return this._initPromise;\n };\n /**\n * Sets the player options. This can be called at any time and is not required before playback can be initiated.\n */\n this.setOptions = (options) => {\n this.options = Object.assign(Object.assign({}, this.options), options);\n return Playlist.setOptions(this.options);\n };\n /**\n * Playlist item management\n */\n /**\n * Sets the entire list of tracks to be played by the playlist.\n * This will clear all previous items from the playlist.\n * If you pass options.retainPosition = true, the current playback position will be\n * recorded and used when playback restarts. This can be used, for example, to set the\n * playlist to a new set of tracks, but retain the currently-playing item to avoid skipping.\n */\n this.setPlaylistItems = (items, options) => {\n return Playlist.setPlaylistItems({ items: validateTracks(items), options: options || {} });\n };\n /**\n * Add a single track to the end of the playlist\n */\n this.addItem = (trackItem) => {\n const validTrackItem = validateTrack(trackItem);\n if (!validTrackItem) {\n throw new Error('Provided track is null or not an audio track');\n }\n return Playlist.addItem({ item: validTrackItem });\n };\n /**\n * Adds the list of tracks to the end of the playlist.\n */\n this.addAllItems = (items) => {\n return Playlist.addAllItems({ items: validateTracks(items) });\n };\n /**\n * Removes a track from the playlist. If this is the currently playing item, the next item will automatically begin playback.\n */\n this.removeItem = (removeItem) => {\n if (!removeItem) {\n throw new Error('Track removal spec is empty');\n }\n if (!removeItem.trackId && !removeItem.trackIndex) {\n new Error('Track removal spec is invalid');\n }\n return Playlist.removeItem({ trackId: removeItem.trackId, trackIndex: removeItem.trackIndex });\n };\n /**\n * Removes all given tracks from the playlist; these can be specified either by trackId or trackIndex. If the removed items\n * include the currently playing item, the next available item will automatically begin playing.\n */\n this.removeItems = (items) => {\n return Playlist.removeItems({ items: items });\n };\n /**\n * Clear the entire playlist. This will result in the STOPPED event being raised.\n */\n this.clearAllItems = () => {\n return Playlist.clearAllItems();\n };\n /**\n * Playback management\n */\n /**\n * Begin playback. If no tracks have been added, this has no effect.\n */\n this.play = () => {\n return Playlist.play();\n };\n /**\n * Play the track at the given index. If the track does not exist, this has no effect.\n */\n this.playTrackByIndex = (index, position) => {\n return Playlist.playTrackByIndex({ index, position: position || 0 });\n };\n /**\n * Play the track matching the given trackId. If the track does not exist, this has no effect.\n */\n this.playTrackById = (id, position) => {\n return Playlist.playTrackById({ id, position: position || 0 });\n };\n /**\n * Play the track matching the given trackId. If the track does not exist, this has no effect.\n */\n this.selectTrackByIndex = (index, position) => {\n return Playlist.selectTrackByIndex({ index, position: position || 0 });\n };\n /**\n * Play the track matching the given trackId. If the track does not exist, this has no effect.\n */\n this.selectTrackById = (id, position) => {\n return Playlist.selectTrackById({ id, position: position || 0 });\n };\n /**\n * Pause playback\n */\n this.pause = () => {\n return Playlist.pause();\n };\n /**\n * Skip to the next track. If you are already at the end, and loop is false, this has no effect.\n * If you are at the end, and loop is true, playback will begin at the beginning of the playlist.\n */\n this.skipForward = () => {\n return Playlist.skipForward();\n };\n /**\n * Skip to the previous track. If you are already at the beginning, this has no effect.\n */\n this.skipBack = () => {\n return Playlist.skipBack();\n };\n /**\n * Seek to the given position in the currently playing track. If the value exceeds the track length,\n * the track will complete and playback of the next track will begin.\n */\n this.seekTo = (position) => {\n return Playlist.seekTo({ position });\n };\n /**\n * Set the playback speed; a float value between [-1, 1] inclusive. If set to 0, this pauses playback.\n */\n this.setPlaybackRate = (rate) => {\n return Playlist.setPlaybackRate({ rate });\n };\n /**\n * Set the playback volume. Float value between [0, 1] inclusive.\n * On both Android and iOS, this sets the volume of the media stream, which can be externally\n * controlled by setting the overall hardware volume.\n */\n this.setVolume = (volume) => {\n return Playlist.setPlaybackVolume({ volume });\n };\n /**\n * Sets a flag indicating whether the playlist should loop back to the beginning once it reaches the end.\n */\n this.setLoop = (loop) => {\n return Playlist.setLoop({ loop: loop });\n };\n this.handlers = {};\n this._initPromise = new Promise((resolve, reject) => {\n this._readyResolve = resolve;\n this._readyReject = reject;\n });\n new Promise((resolve) => {\n window.addEventListener('beforeunload', () => resolve(), { once: true });\n }).then(() => Playlist.release());\n }\n /**\n * The current summarized state of the player, as a string. It is preferred that you use the 'isX' accessors,\n * because they properly interpret the range of these values, but this field is exposed if you wish to observe\n * or interrogate it.\n */\n get currentState() {\n return this._currentState;\n }\n /**\n * True if the plugin has been initialized. You'll likely never see this state; it is handled internally.\n */\n get isInitialized() {\n return this._inititialized;\n }\n get currentTrack() {\n return this._currentItem;\n }\n /**\n * If the playlist is currently playling a track.\n */\n get isPlaying() {\n return this._currentState === 'playing';\n }\n /**\n * True if the playlist is currently paused\n */\n get isPaused() {\n return this._currentState === 'paused' || this._currentState === 'stopped';\n }\n /**\n * True if the plugin is currently loading its *current* track.\n * On iOS, many tracks are loaded in parallel, so this only reports for the *current item*, e.g.\n * the item that will begin playback if you press pause.\n * If you need track-specific data, it is better to watch the onStatus stream and watch for RMXSTATUS_LOADING,\n * which will be raised independently & simultaneously for every track in the playlist.\n * On Android, tracks are only loaded as they begin playback, so this value and RMXSTATUS_LOADING should always\n * apply to the same track.\n */\n get isLoading() {\n return this._currentState === 'loading';\n }\n /**\n * True if the *currently playing track* has been loaded and can be played (this includes if it is *currently playing*).\n */\n get hasLoaded() {\n return this._hasLoaded;\n }\n /**\n * True if the *current track* has reported an error. In almost all cases,\n * the playlist will automatically skip forward to the next track, in which case you will also receive\n * an RMXSTATUS_TRACK_CHANGED event.\n */\n get hasError() {\n return this._hasError;\n }\n /**\n * Status event handling\n */\n /**\n * @internal\n * Call this function to emit an onStatus event via the on('status') handler.\n * Internal use only, to raise events received from the native interface.\n */\n onStatus(trackId, type, value) {\n var _a;\n const status = { type: type, trackId: trackId, value: value };\n if (this.options.verbose) {\n console.debug(`RmxAudioPlayer.onStatus: ${RmxAudioStatusMessageDescriptions[type]}(${type}) [${trackId}]: `, value);\n }\n if (status.type === RmxAudioStatusMessage.RMXSTATUS_TRACK_CHANGED) {\n this._hasError = false;\n this._hasLoaded = false;\n this._currentState = 'loading';\n this._currentItem = (_a = status.value) === null || _a === void 0 ? void 0 : _a.currentItem;\n }\n // The plugin's status changes only in response to specific events.\n if (itemStatusChangeTypes.indexOf(status.type) >= 0) {\n // Only change the plugin's *current status* if the event being raised is for the current active track.\n if (this._currentItem && this._currentItem.trackId === trackId) {\n if (status.value && status.value.status) {\n this._currentState = status.value.status;\n }\n if (status.type === RmxAudioStatusMessage.RMXSTATUS_CANPLAY) {\n this._hasLoaded = true;\n }\n if (status.type === RmxAudioStatusMessage.RMXSTATUS_ERROR) {\n this._hasError = true;\n }\n }\n }\n this.emit('status', status);\n }\n on(eventName, callback) {\n if (!Object.prototype.hasOwnProperty.call(this.handlers, eventName)) {\n this.handlers[eventName] = [];\n }\n this.handlers[eventName].push(callback);\n }\n /**\n * Remove an event handler from the plugin\n * @param eventName The name of the event whose subscription is to be removed\n * @param handle The event handler to destroy. Ensure that this is the SAME INSTANCE as the handler\n * that was passed in to create the subscription!\n */\n off(eventName, handle) {\n if (Object.prototype.hasOwnProperty.call(this.handlers, eventName)) {\n const handleIndex = this.handlers[eventName].indexOf(handle);\n if (handleIndex >= 0) {\n this.handlers[eventName].splice(handleIndex, 1);\n }\n }\n }\n /**\n * @internal\n * Raises an event via the corresponding event handler. Internal use only.\n * @param args Event args to pass through to the handler.\n */\n emit(...args) {\n const eventName = args.shift();\n if (!Object.prototype.hasOwnProperty.call(this.handlers, eventName)) {\n return false;\n }\n const handler = this.handlers[eventName];\n for (let i = 0; i < handler.length; i++) {\n const callback = this.handlers[eventName][i];\n if (typeof callback === 'function') {\n callback(...args);\n }\n }\n return true;\n }\n}\n//# sourceMappingURL=RmxAudioPlayer.js.map","import { WebPlugin } from '@capacitor/core';\nimport { RmxAudioStatusMessage } from './Constants';\nimport { validateTrack, validateTracks } from './utils';\nexport class PlaylistWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.playlistItems = [];\n this.loop = false;\n this.options = {};\n this.currentTrack = null;\n this.lastState = 'stopped';\n this.hlsLoaded = false;\n }\n addAllItems(options) {\n this.playlistItems = this.playlistItems.concat(validateTracks(options.items));\n return Promise.resolve();\n }\n addItem(options) {\n const track = validateTrack(options.item);\n if (track) {\n this.playlistItems.push(track);\n }\n return Promise.resolve();\n }\n async clearAllItems() {\n await this.release();\n this.playlistItems = [];\n return Promise.resolve();\n }\n async initialize() {\n return Promise.resolve();\n }\n async pause() {\n var _a;\n (_a = this.audio) === null || _a === void 0 ? void 0 : _a.pause();\n }\n async play() {\n var _a;\n return (_a = this.audio) === null || _a === void 0 ? void 0 : _a.play();\n }\n playTrackById(options) {\n this.playlistItems.forEach(async (item) => {\n if (item.trackId === options.id) {\n await this.setCurrent(item);\n return this.play();\n }\n });\n return Promise.reject();\n }\n playTrackByIndex(options) {\n this.playlistItems.forEach(async (item, index) => {\n if (index === options.index) {\n await this.setCurrent(item);\n return this.play();\n }\n });\n return Promise.reject();\n }\n async release() {\n await this.pause();\n this.audio = undefined;\n return Promise.resolve();\n }\n removeItem(options) {\n this.playlistItems.forEach((item, index) => {\n if (options.trackIndex && options.trackIndex === index) {\n this.playlistItems.splice(index, 1);\n }\n else if (options.trackId && options.trackId === item.trackId) {\n this.playlistItems.splice(index, 1);\n }\n });\n return Promise.resolve();\n }\n removeItems(options) {\n options.items.forEach((item) => {\n this.removeItem(item);\n });\n return Promise.resolve();\n }\n seekTo(options) {\n if (this.audio) {\n this.audio.currentTime = options.position;\n return Promise.resolve();\n }\n return Promise.reject();\n }\n selectTrackById(options) {\n for (const item of this.playlistItems) {\n if (item.trackId === options.id) {\n return this.setCurrent(item);\n }\n }\n return Promise.reject();\n }\n selectTrackByIndex(options) {\n let index = 0;\n for (const item of this.playlistItems) {\n if (index === options.index) {\n return this.setCurrent(item);\n }\n index++;\n }\n return Promise.reject();\n }\n setLoop(options) {\n this.loop = options.loop;\n return Promise.resolve();\n }\n setOptions(options) {\n this.options = options || {};\n return Promise.resolve();\n }\n setPlaybackVolume(options) {\n if (this.audio) {\n this.audio.volume = options.volume;\n return Promise.resolve();\n }\n return Promise.reject();\n }\n setPlaylistItems(options) {\n var _a;\n this.playlistItems = options.items;\n if (this.playlistItems.length > 0) {\n return this.setCurrent(this.playlistItems[0], ((_a = options.options) === null || _a === void 0 ? void 0 : _a.playFromPosition) || 0);\n }\n return Promise.resolve();\n }\n skipForward() {\n let found = null;\n this.playlistItems.forEach((item, index) => {\n if (!found && this.getCurrentTrackId() === item.trackId) {\n found = index;\n }\n });\n if (found === this.playlistItems.length - 1) {\n found = -1;\n }\n if (found !== null) {\n return this.setCurrent(this.playlistItems[found + 1]);\n }\n return Promise.reject();\n }\n skipBack() {\n let found = null;\n this.playlistItems.forEach((item, index) => {\n if (!found && this.getCurrentTrackId() === item.trackId) {\n found = index;\n }\n });\n if (found === 0) {\n found = this.playlistItems.length - 1;\n }\n if (found !== null) {\n this.setCurrent(this.playlistItems[found - 1]);\n return Promise.resolve();\n }\n return Promise.reject();\n }\n setPlaybackRate(options) {\n if (this.audio) {\n this.audio.playbackRate = options.rate;\n return Promise.resolve();\n }\n return Promise.reject();\n }\n // register events\n /*\n private registerHlsListeners(hls: Hls, position?: number) {\n hls.on(Hls.Events.MANIFEST_PARSED, async () => {\n this.notifyListeners('status', {\n action: \"status\",\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_CANPLAY,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('loading'),\n }\n })\n if(position) {\n await this.seekTo({position});\n }\n });\n }*/\n registerHtmlListeners(position) {\n const canPlayListener = async () => {\n var _a;\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_CANPLAY,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('loading'),\n }\n });\n if (position) {\n await this.seekTo({ position });\n }\n (_a = this.audio) === null || _a === void 0 ? void 0 : _a.removeEventListener('canplay', canPlayListener);\n };\n if (this.audio) {\n this.audio.addEventListener('canplay', canPlayListener);\n this.audio.addEventListener('playing', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_PLAYING,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('playing'),\n }\n });\n });\n this.audio.addEventListener('pause', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_PAUSE,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('paused'),\n }\n });\n });\n this.audio.addEventListener('error', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_ERROR,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('error'),\n }\n });\n });\n this.audio.addEventListener('ended', () => {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_STOPPED,\n trackId: this.getCurrentTrackId(),\n value: this.getCurrentTrackStatus('stopped'),\n }\n });\n });\n let lastTrackId, lastPosition;\n this.audio.addEventListener('timeupdate', () => {\n const status = this.getCurrentTrackStatus(this.lastState);\n if (lastTrackId !== this.getCurrentTrackId() || lastPosition !== status.currentPosition) {\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_PLAYBACK_POSITION,\n trackId: this.getCurrentTrackId(),\n value: status,\n }\n });\n lastTrackId = this.getCurrentTrackId();\n lastPosition = status.currentPosition;\n }\n });\n }\n }\n getCurrentTrackId() {\n if (this.currentTrack) {\n return this.currentTrack.trackId;\n }\n return 'INVALID';\n }\n getCurrentIndex() {\n if (this.currentTrack) {\n for (let i = 0; i < this.playlistItems.length; i++) {\n if (this.playlistItems[i].trackId === this.currentTrack.trackId) {\n return i;\n }\n }\n }\n return -1;\n }\n getCurrentTrackStatus(currentState) {\n var _a, _b;\n this.lastState = currentState;\n return {\n trackId: this.getCurrentTrackId(),\n isStream: !!((_a = this.currentTrack) === null || _a === void 0 ? void 0 : _a.isStream),\n currentIndex: this.getCurrentIndex(),\n status: currentState,\n currentPosition: ((_b = this.audio) === null || _b === void 0 ? void 0 : _b.currentTime) || 0,\n };\n }\n async setCurrent(item, position) {\n let wasPlaying = false;\n if (this.audio) {\n wasPlaying = !this.audio.paused;\n this.audio.pause();\n this.audio.src = '';\n this.audio.removeAttribute('src');\n this.audio.load();\n }\n this.audio = document.createElement('video');\n this.currentTrack = item;\n if (item.assetUrl.includes('.m3u8')) {\n await this.loadHlsJs();\n const hls = new Hls({\n autoStartLoad: true,\n debug: false,\n enableWorker: true,\n });\n hls.attachMedia(this.audio);\n hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n hls.loadSource(item.assetUrl);\n });\n //this.registerHlsListeners(hls, position);\n }\n else {\n this.audio.src = item.assetUrl;\n }\n await this.registerHtmlListeners(position);\n if (wasPlaying) {\n this.audio.addEventListener('canplay', () => {\n this.play();\n });\n }\n this.notifyListeners('status', {\n action: 'status',\n status: {\n msgType: RmxAudioStatusMessage.RMXSTATUS_TRACK_CHANGED,\n trackId: this.getCurrentTrackId(),\n value: {\n currentItem: item\n }\n }\n });\n }\n log(message, ...optionalParams) {\n if (this.options.verbose) {\n console.log(message, ...optionalParams);\n }\n }\n loadHlsJs() {\n if (this.hlsLoaded) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n var script = document.createElement('script');\n script.type = 'text/javascript';\n script.src = 'https://cdn.jsdelivr.net/npm/hls.js@1.1.1';\n document.getElementsByTagName('head')[0].appendChild(script);\n script.onload = () => {\n this.hlsLoaded = true;\n resolve(void 0);\n };\n script.onerror = () => {\n reject();\n };\n });\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["RmxAudioErrorType","RmxAudioStatusMessage","registerPlugin","WebPlugin"],"mappings":"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"}
@@ -122,6 +122,13 @@ class AVBidirectionalQueuePlayer: AVQueuePlayer {
122
122
  rate = currentrate
123
123
  }
124
124
  }
125
+ open override func advanceToNextItem() {
126
+ if currentIndex() == nil || currentIndex()! < items().count - 1{
127
+ super.advanceToNextItem();
128
+ } else {
129
+ setCurrentIndex(0)
130
+ }
131
+ }
125
132
 
126
133
  func setCurrentIndex(_ currentIndex: Int) {
127
134
  setCurrentIndex(currentIndex, completionHandler: { _ in })
@@ -152,7 +159,8 @@ class AVBidirectionalQueuePlayer: AVQueuePlayer {
152
159
  }
153
160
 
154
161
  func replaceAllItems(with items: [AudioTrack]) {
155
- removeAllItems()
162
+ print("AVBI, replaceAllItems")
163
+ removeAllItemsSilently()
156
164
  appendItems(items)
157
165
  }
158
166
 
@@ -189,14 +197,20 @@ class AVBidirectionalQueuePlayer: AVQueuePlayer {
189
197
 
190
198
  super.play()
191
199
  }
192
-
200
+ // This does the same thing as the normal AVQueuePlayer removeAllItems, but clears our collection copy
193
201
  override func removeAllItems() {
194
- // This does the same thing as the normal AVQueuePlayer removeAllItems, but clears our collection copy
202
+ print("removeAllItems")
195
203
  super.removeAllItems()
196
204
  queuedAudioTracks.removeAll()
197
-
205
+
198
206
  NotificationCenter.default.post(name: NSNotification.Name(AVBidirectionalQueueCleared), object: self, userInfo: nil)
199
207
  }
208
+
209
+ func removeAllItemsSilently() {
210
+ print("removeAllItemsSilently")
211
+ super.removeAllItems()
212
+ queuedAudioTracks.removeAll()
213
+ }
200
214
 
201
215
  func remove(_ item: AudioTrack) {
202
216
  // This method calls the superclass to remove the items from the AVQueuePlayer itself, then removes
@@ -25,7 +25,6 @@ final class AudioTrack: AVPlayerItem {
25
25
  else {
26
26
  return nil
27
27
  }
28
-
29
28
  let track = AudioTrack(url: assetUrl)
30
29
  track.canUseNetworkResourcesForLiveStreamingWhilePaused = true
31
30
 
@@ -12,7 +12,7 @@ public extension DispatchQueue {
12
12
  - action: The closure to be executed
13
13
  Delays a closure execution and ensures no other executions are made during deadline
14
14
  */
15
- public func throttle(deadline: DispatchTime, context: AnyHashable? = nil, action: @escaping () -> Void) {
15
+ func throttle(deadline: DispatchTime, context: AnyHashable? = nil, action: @escaping () -> Void) {
16
16
  let worker = DispatchWorkItem {
17
17
  defer { throttleWorkItems.removeValue(forKey: context ?? nilContext) }
18
18
  action()
@@ -31,7 +31,7 @@ public extension DispatchQueue {
31
31
  - action: The closure to be executed
32
32
  Executes a closure and ensures no other executions will be made during the interval.
33
33
  */
34
- public func debounce(interval: Double, context: AnyHashable? = nil, action: @escaping () -> Void) {
34
+ func debounce(interval: Double, context: AnyHashable? = nil, action: @escaping () -> Void) {
35
35
  if let last = lastDebounceCallTimes[context ?? nilContext], last + interval > .now() {
36
36
  return
37
37
  }
@@ -44,4 +44,4 @@ public extension DispatchQueue {
44
44
  lastDebounceCallTimes.removeValue(forKey: context ?? nilContext)
45
45
  }
46
46
  }
47
- }
47
+ }
@@ -29,6 +29,8 @@ final class RmxAudioPlayer: NSObject {
29
29
 
30
30
  private let avQueuePlayer = AVBidirectionalQueuePlayer(items: [])
31
31
 
32
+ private var lastTrackId: String? = nil
33
+ private var lastRate: Float? = nil
32
34
  override init() {
33
35
  super.init()
34
36
 
@@ -140,7 +142,7 @@ final class RmxAudioPlayer: NSObject {
140
142
 
141
143
  func clearAllItems() {
142
144
  print("RmxAudioPlayer.execute=clearAllItems")
143
- removeAllTracks(false)
145
+ removeAllTracks()
144
146
  }
145
147
 
146
148
  func playTrack(index: Int, positionTime: Float?) throws {
@@ -385,7 +387,7 @@ final class RmxAudioPlayer: NSObject {
385
387
  }
386
388
  }
387
389
 
388
- func removeAllTracks(_ isCommand: Bool) {
390
+ func removeAllTracks() {
389
391
  for item in avQueuePlayer.queuedAudioTracks {
390
392
  removeTrackObservers(item)
391
393
  }
@@ -393,15 +395,6 @@ final class RmxAudioPlayer: NSObject {
393
395
  avQueuePlayer.removeAllItems()
394
396
  wasPlayingInterrupted = false
395
397
 
396
- print("RmxAudioPlayer, removeAllTracks, ==> RMXSTATUS_PLAYLIST_CLEARED")
397
- onStatus(.rmxstatus_PLAYLIST_CLEARED, trackId: "INVALID", param: nil)
398
-
399
- // a.t.m there's no way for this to be triggered from within the plugin,
400
- // but it might get added at some point.
401
- if isCommand {
402
- let action = "music-controls-clear"
403
- print("\(action)")
404
- }
405
398
  }
406
399
 
407
400
  // MARK: - remote control events
@@ -454,7 +447,6 @@ final class RmxAudioPlayer: NSObject {
454
447
  let trackStatus = getStatusItem(playerItem)
455
448
 
456
449
  onStatus(.rmxstatus_STALLED, trackId: playerItem?.trackId, param: trackStatus)
457
- onStatus(.rmxstatus_PAUSE, trackId: playerItem?.trackId, param: trackStatus)
458
450
  }
459
451
 
460
452
  @objc func playerItemDidReachEnd(_ notification: Notification?) {
@@ -528,31 +520,37 @@ final class RmxAudioPlayer: NSObject {
528
520
  }
529
521
 
530
522
  override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
531
- if keyPath != "loadedTimeRanges" {
532
- print("observing \(String(describing: keyPath))")
533
- print("observing \(String(describing: change))")
523
+ guard let change = change else {
524
+ return
534
525
  }
535
526
 
536
527
  switch keyPath {
537
528
  case "currentItem":
529
+ // only fire on real change!
538
530
  let player = object as? AVBidirectionalQueuePlayer
539
531
  let playerItem = player?.currentAudioTrack
532
+ guard lastTrackId != playerItem?.trackId else {
533
+ return // todo should call super instead or?
534
+ }
535
+ lastTrackId = playerItem?.trackId
540
536
  handleCurrentItemChanged(playerItem)
541
537
  case "rate":
542
- DispatchQueue.main.debounce(interval: 0.2, context: self, action: { [self] in
543
- let player = object as? AVBidirectionalQueuePlayer
544
-
545
- guard let playerItem = player?.currentAudioTrack else { return }
538
+ guard lastRate != change[.newKey] as? Float else {
539
+ return // todo should call super instead or?
540
+ }
541
+ self.lastRate = change[.newKey] as? Float
542
+ let player = object as? AVBidirectionalQueuePlayer
543
+
544
+ guard let playerItem = player?.currentAudioTrack else { return }
546
545
 
547
- let trackStatus = getStatusItem(playerItem)
548
- print("Playback rate changed: \(1), is playing: \(player?.isPlaying ?? false)")
546
+ let trackStatus = getStatusItem(playerItem)
547
+ print("Playback rate changed: \(String(describing: change[.newKey])), is playing: \(player?.isPlaying ?? false)")
549
548
 
550
- if player?.isPlaying ?? false {
551
- onStatus(.rmxstatus_PLAYING, trackId: playerItem.trackId, param: trackStatus)
552
- } else {
553
- onStatus(.rmxstatus_PAUSE, trackId: playerItem.trackId, param: trackStatus)
554
- }
555
- })
549
+ if player?.isPlaying ?? false {
550
+ onStatus(.rmxstatus_PLAYING, trackId: playerItem.trackId, param: trackStatus)
551
+ } else {
552
+ onStatus(.rmxstatus_PAUSE, trackId: playerItem.trackId, param: trackStatus)
553
+ }
556
554
  case "status":
557
555
  DispatchQueue.main.debounce(interval: 0.2, context: self, action: { [self] in
558
556
  let playerItem = object as? AudioTrack
@@ -562,10 +560,15 @@ final class RmxAudioPlayer: NSObject {
562
560
  DispatchQueue.main.debounce(interval: 0.2, context: self, action: { [self] in
563
561
  let player = object as? AVBidirectionalQueuePlayer
564
562
 
565
- guard let playerItem = player?.currentAudioTrack else { return }
563
+ guard let playerItem = player?.currentAudioTrack else {
564
+ return
565
+ }
566
+ guard lastTrackId != playerItem.trackId else {
567
+ return // todo should call super instead or?
568
+ }
566
569
 
567
570
  let trackStatus = getStatusItem(playerItem)
568
- print("Playback rate changed: \(1), is playing: \(player?.isPlaying ?? false)")
571
+ print("TCSPlayback rate changed: \(String(describing: change[.newKey])), is playing: \(player?.isPlaying ?? false)")
569
572
 
570
573
  if player?.timeControlStatus == .playing {
571
574
  onStatus(.rmxstatus_PLAYING, trackId: playerItem.trackId, param: trackStatus)
@@ -620,19 +623,18 @@ final class RmxAudioPlayer: NSObject {
620
623
  updatedNowPlayingInfo![MPMediaItemPropertyArtwork] = mediaItemArtwork
621
624
  }
622
625
  }
623
- updatedNowPlayingInfo![MPMediaItemPropertyPlaybackDuration] = NSNumber(value: duration ?? 0.0)
624
- updatedNowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = NSNumber(value: currentTime ?? 0.0)
625
- updatedNowPlayingInfo![MPNowPlayingInfoPropertyPlaybackRate] = NSNumber(value: 1.0)
626
+ updatedNowPlayingInfo![MPMediaItemPropertyPlaybackDuration] = duration ?? 0.0
627
+ updatedNowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTime ?? 0.0
628
+ updatedNowPlayingInfo![MPNowPlayingInfoPropertyPlaybackRate] = 1.0
626
629
 
627
630
  MPNowPlayingInfoCenter.default().nowPlayingInfo = updatedNowPlayingInfo
628
- print("noplaying \(String(describing: updatedNowPlayingInfo))")
631
+
629
632
  let commandCenter = MPRemoteCommandCenter.shared()
630
633
  commandCenter.nextTrackCommand.isEnabled = !avQueuePlayer.isAtEnd
631
634
  commandCenter.previousTrackCommand.isEnabled = !avQueuePlayer.isAtBeginning
632
635
  }
633
636
 
634
637
  func createCoverArtwork(_ coverUriOrNil: String?) -> MPMediaItemArtwork? {
635
- print("Creating cover art : \(String(describing: coverUriOrNil))")
636
638
  guard let coverUri = coverUriOrNil else {
637
639
  return nil
638
640
  }
@@ -654,9 +656,7 @@ final class RmxAudioPlayer: NSObject {
654
656
  }
655
657
 
656
658
  if isCoverImageValid(coverImage) {
657
- print("valid cover image \(String(describing: coverImage)) size \(coverImage!.size)")
658
659
  return MPMediaItemArtwork.init(boundsSize: coverImage!.size, requestHandler: { (size) -> UIImage in
659
- print("inted cover image \(String(describing: coverImage)) size \(coverImage!.size)")
660
660
  return coverImage!
661
661
  })
662
662
  }
@@ -850,7 +850,7 @@ final class RmxAudioPlayer: NSObject {
850
850
  }
851
851
 
852
852
  if avQueuePlayer.currentItem == currentItem {
853
- if avQueuePlayer.rate != 0 {
853
+ if avQueuePlayer.rate != 0.0 {
854
854
  status = "playing"
855
855
 
856
856
  if position <= 0 && (bufferInfo?["bufferPercent"] as? NSNumber)?.floatValue ?? 0.0 == 0.0 {
@@ -980,7 +980,6 @@ final class RmxAudioPlayer: NSObject {
980
980
  listener.addObserver(self, selector: #selector(itemStalledPlaying(_:)), name: .AVPlayerItemPlaybackStalled, object: playerItem)
981
981
 
982
982
  onStatus(.rmxstatus_ITEM_ADDED, trackId: playerItem?.trackId, param: playerItem?.toDict())
983
- onStatus(.rmxstatus_LOADING, trackId: playerItem?.trackId, param: nil)
984
983
  }
985
984
 
986
985
  @objc func queueCleared(_ notification: Notification?) {
@@ -1093,7 +1092,7 @@ final class RmxAudioPlayer: NSObject {
1093
1092
  avQueuePlayer.removeObserver(self as NSObject, forKeyPath: "timeControlStatus")
1094
1093
  deregisterMusicControlsEventListener()
1095
1094
 
1096
- removeAllTracks(false)
1095
+ removeAllTracks()
1097
1096
 
1098
1097
  playbackTimeObserver = nil
1099
1098
  isWaitingToStartPlayback = false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "capacitor-plugin-playlist",
3
- "version": "0.1.21",
3
+ "version": "0.1.22",
4
4
  "description": "Playlist ",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "module": "dist/esm/index.js",