UNPKG

nativescript-cast

Version:

NativeScript Chromecast Plugin.

570 lines 26.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var camelCase_1 = require("lodash/fp/camelCase"); var snakeCase_1 = require("lodash/fp/snakeCase"); var utils_1 = require("tns-core-modules/utils/utils"); var cast_common_1 = require("./cast.common"); var cast_types_1 = require("./cast.types"); var media_queue_callback_android_1 = require("./media-queue-callback.android"); var media_router_callback_android_1 = require("./media-router-callback.android"); var remote_media_client_callback_android_1 = require("./remote-media-client-callback.android"); var session_manager_listener_android_1 = require("./session-manager-listener.android"); var _a = androidx.mediarouter.media, MediaRouter = _a.MediaRouter, MediaRouteSelector = _a.MediaRouteSelector, MediaControlIntent = _a.MediaControlIntent; var _b = com.google.android.gms.cast.framework, CastButtonFactory = _b.CastButtonFactory, CastContext = _b.CastContext; var _c = com.google.android.gms.cast, MediaInfo = _c.MediaInfo, MediaLoadRequestData = _c.MediaLoadRequestData, MediaMetadata = _c.MediaMetadata, MediaQueueData = _c.MediaQueueData, MediaQueueItem = _c.MediaQueueItem, MediaStatus = _c.MediaStatus, MediaTrack = _c.MediaTrack; var METADATA_PREFIX = 'KEY_'; var ArrayList = java.util.ArrayList; var WebImage = com.google.android.gms.common.images.WebImage; var SessionManagerListener; function initSessionManagerListener() { if (SessionManagerListener) { return; } SessionManagerListener = session_manager_listener_android_1.SessionManagerListenerImpl; } var ProgressListener; function initProgressListener() { if (ProgressListener) { return; } } function metadataTypeEnumToString(metadataType) { switch (metadataType) { case MediaMetadata.MEDIA_TYPE_MOVIE: return cast_types_1.MetadataType.MOVIE; case MediaMetadata.MEDIA_TYPE_TV_SHOW: return cast_types_1.MetadataType.TV_SHOW; case MediaMetadata.MEDIA_TYPE_MUSIC_TRACK: return cast_types_1.MetadataType.MUSIC_TRACK; case MediaMetadata.MEDIA_TYPE_PHOTO: return cast_types_1.MetadataType.PHOTO; case MediaMetadata.MEDIA_TYPE_USER: return cast_types_1.MetadataType.USER; case MediaMetadata.MEDIA_TYPE_AUDIOBOOK_CHAPTER: return cast_types_1.MetadataType.AUDIO_BOOK_CHAPTER; default: return cast_types_1.MetadataType.GENERIC; } } exports.metadataTypeEnumToString = metadataTypeEnumToString; function metadataTypeStringToEnum(metadataType) { switch (metadataType) { case cast_types_1.MetadataType.MOVIE: return MediaMetadata.MEDIA_TYPE_MOVIE; case cast_types_1.MetadataType.TV_SHOW: return MediaMetadata.MEDIA_TYPE_TV_SHOW; case cast_types_1.MetadataType.MUSIC_TRACK: return MediaMetadata.MEDIA_TYPE_MUSIC_TRACK; case cast_types_1.MetadataType.PHOTO: return MediaMetadata.MEDIA_TYPE_PHOTO; case cast_types_1.MetadataType.AUDIO_BOOK_CHAPTER: return MediaMetadata.MEDIA_TYPE_AUDIOBOOK_CHAPTER; case cast_types_1.MetadataType.USER: return MediaMetadata.MEDIA_TYPE_USER; default: return MediaMetadata.MEDIA_TYPE_GENERIC; } } exports.metadataTypeStringToEnum = metadataTypeStringToEnum; function streamTypeEnumToString(streamType) { switch (streamType) { case MediaInfo.STREAM_TYPE_BUFFERED: return cast_types_1.StreamType.BUFFERED; case MediaInfo.STREAM_TYPE_LIVE: return cast_types_1.StreamType.LIVE; case MediaInfo.STREAM_TYPE_INVALID: return cast_types_1.StreamType.UNKNOWN; default: return cast_types_1.StreamType.NONE; } } exports.streamTypeEnumToString = streamTypeEnumToString; function streamTypeStringToEnum(streamType) { switch (streamType) { case cast_types_1.StreamType.BUFFERED: return MediaInfo.STREAM_TYPE_BUFFERED; case cast_types_1.StreamType.LIVE: return MediaInfo.STREAM_TYPE_LIVE; case cast_types_1.StreamType.UNKNOWN: return MediaInfo.STREAM_TYPE_INVALID; default: return MediaInfo.STREAM_TYPE_NONE; } } exports.streamTypeStringToEnum = streamTypeStringToEnum; function repeatModeStringToEnum(repeatMode) { switch (repeatMode) { case cast_types_1.RepeatMode.OFF: return MediaStatus.REPEAT_MODE_REPEAT_OFF; case cast_types_1.RepeatMode.SINGLE: return MediaStatus.REPEAT_MODE_REPEAT_SINGLE; case cast_types_1.RepeatMode.ALL: return MediaStatus.REPEAT_MODE_REPEAT_ALL; case cast_types_1.RepeatMode.ALL_AND_SHUFFLE: return MediaStatus.REPEAT_MODE_REPEAT_ALL_AND_SHUFFLE; default: return MediaStatus.REPEAT_MODE_REPEAT_OFF; } } exports.repeatModeStringToEnum = repeatModeStringToEnum; function repeatModeEnumToString(repeatMode) { switch (repeatMode) { case MediaStatus.REPEAT_MODE_REPEAT_OFF: return cast_types_1.RepeatMode.OFF; case MediaStatus.REPEAT_MODE_REPEAT_SINGLE: return cast_types_1.RepeatMode.SINGLE; case MediaStatus.REPEAT_MODE_REPEAT_ALL: return cast_types_1.RepeatMode.ALL; case MediaStatus.REPEAT_MODE_REPEAT_ALL_AND_SHUFFLE: return cast_types_1.RepeatMode.ALL_AND_SHUFFLE; default: return cast_types_1.RepeatMode.OFF; } } exports.repeatModeEnumToString = repeatModeEnumToString; function queueTypeStringToEnum(queueType) { switch (queueType) { case cast_types_1.QueueType.ALBUM: return MediaQueueData.MEDIA_QUEUE_TYPE_ALBUM; case cast_types_1.QueueType.PLAYLIST: return MediaQueueData.MEDIA_QUEUE_TYPE_PLAYLIST; case cast_types_1.QueueType.AUDIO_BOOK: return MediaQueueData.MEDIA_QUEUE_TYPE_AUDIO_BOOK; case cast_types_1.QueueType.RADIO_STATION: return MediaQueueData.MEDIA_QUEUE_TYPE_RADIO_STATION; case cast_types_1.QueueType.PODCAST_SERIES: return MediaQueueData.MEDIA_QUEUE_TYPE_PODCAST_SERIES; case cast_types_1.QueueType.TV_SERIES: return MediaQueueData.MEDIA_QUEUE_TYPE_TV_SERIES; case cast_types_1.QueueType.VIDEO_PLAYLIST: return MediaQueueData.MEDIA_QUEUE_TYPE_VIDEO_PLAYLIST; case cast_types_1.QueueType.LIVE_TV: return MediaQueueData.MEDIA_QUEUE_TYPE_LIVE_TV; case cast_types_1.QueueType.MOVIE: return MediaQueueData.MEDIA_QUEUE_TYPE_MOVIE; default: return MediaQueueData.MEDIA_QUEUE_TYPE_GENERIC; } } exports.queueTypeStringToEnum = queueTypeStringToEnum; function queueTypeEnumToString(queueType) { switch (queueType) { case MediaQueueData.MEDIA_QUEUE_TYPE_ALBUM: return cast_types_1.QueueType.ALBUM; case MediaQueueData.MEDIA_QUEUE_TYPE_PLAYLIST: return cast_types_1.QueueType.PLAYLIST; case MediaQueueData.MEDIA_QUEUE_TYPE_AUDIO_BOOK: return cast_types_1.QueueType.AUDIO_BOOK; case MediaQueueData.MEDIA_QUEUE_TYPE_RADIO_STATION: return cast_types_1.QueueType.RADIO_STATION; case MediaQueueData.MEDIA_QUEUE_TYPE_PODCAST_SERIES: return cast_types_1.QueueType.PODCAST_SERIES; case MediaQueueData.MEDIA_QUEUE_TYPE_TV_SERIES: return cast_types_1.QueueType.TV_SERIES; case MediaQueueData.MEDIA_QUEUE_TYPE_VIDEO_PLAYLIST: return cast_types_1.QueueType.VIDEO_PLAYLIST; case MediaQueueData.MEDIA_QUEUE_TYPE_LIVE_TV: return cast_types_1.QueueType.LIVE_TV; case MediaQueueData.MEDIA_QUEUE_TYPE_MOVIE: return cast_types_1.QueueType.MOVIE; default: return cast_types_1.QueueType.GENERIC; } } exports.queueTypeEnumToString = queueTypeEnumToString; function convertMediaInfo(mediaInfo) { if (!mediaInfo) { return null; } var metadata = mediaInfo.getMetadata(); var metaDataKeys = utils_1.ad.collections.stringSetToStringArray(metadata.keySet()); var images = metadata.getImages(); var tracks = mediaInfo.getMediaTracks(); var textTracks = []; if (tracks) { for (var i = 0; i < tracks.size(); i++) { var track = tracks.get(i); if (track.getType() === MediaTrack.TYPE_TEXT) { textTracks.push({ id: track.getId(), src: track.getContentId(), contentType: track.getContentType(), name: track.getName(), language: track.getLanguage(), }); } } } var castMetadata = { metadataType: metadataTypeEnumToString(metadata.getMediaType()), images: [], }; metaDataKeys.forEach(function (key) { var fixedKey = camelCase_1.default(key.replace('com.google.android.gms.cast.metadata.', '')); castMetadata[fixedKey] = metadata.getString(key); }); if (images) { for (var index_1 = 0; index_1 < images.size(); index_1++) { var img = images.get(index_1); castMetadata.images.push({ url: img.getUrl().toString(), width: img.getWidth(), height: img.getHeight() }); } } return { contentId: mediaInfo.getContentId(), streamType: streamTypeEnumToString(mediaInfo.getStreamType()), contentType: mediaInfo.getContentType(), metadata: castMetadata, duration: mediaInfo.getStreamDuration() / 1000, textTracks: textTracks }; } exports.convertMediaInfo = convertMediaInfo; var CastButton = (function (_super) { __extends(CastButton, _super); function CastButton() { return _super.call(this) || this; } CastButton.prototype.createNativeView = function () { var appContext = utils_1.ad.getApplicationContext(); initSessionManagerListener(); var button = new androidx.mediarouter.app.MediaRouteButton(this._context); CastButtonFactory.setUpMediaRouteButton(appContext, button); this.mMediaRouter = MediaRouter.getInstance(appContext); this.mMediaRouteSelector = new MediaRouteSelector.Builder() .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO) .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK) .build(); this.mMediaRouterCallback = new media_router_callback_android_1.MediaRouterCallback(this); this.mCastContext = CastContext.getSharedInstance(appContext); this.mSessionManager = this.mCastContext.getSessionManager(); this.mSessionManagerListener = new SessionManagerListener(this); this.mRemoteMediaClientCallback = new remote_media_client_callback_android_1.RemoteMediaClientCallback(this); this.mMediaQeueuCallback = new media_queue_callback_android_1.MediaQueueCallback(this); this.addMediaRouterCallback(); this.addSessionManagerListener(); return button; }; CastButton.prototype.getNativeView = function () { return this.nativeView; }; CastButton.prototype.initNativeView = function () { this.nativeView.owner = this; _super.prototype.initNativeView.call(this); }; CastButton.prototype.disposeNativeView = function () { this.nativeView.owner = null; this.removeMediaRouterCallback(); this.removeSessionManagerListener(); _super.prototype.disposeNativeView.call(this); }; CastButton.prototype.addMediaRouterCallback = function () { this.mMediaRouter.addCallback(this.mMediaRouteSelector, this.mMediaRouterCallback, MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY); }; CastButton.prototype.removeMediaRouterCallback = function () { if (this.mMediaRouter && this.mMediaRouterCallback) { this.mMediaRouter.removeCallback(this.mMediaRouterCallback); } }; CastButton.prototype.addSessionManagerListener = function () { this.mSessionManager.addSessionManagerListener(this.mSessionManagerListener); }; CastButton.prototype.removeSessionManagerListener = function () { this.mSessionManager.removeSessionManagerListener(this.mSessionManagerListener); }; CastButton.prototype.addRemoteMediaClientCallback = function () { this.getRemoteMediaClient().registerCallback(this.mRemoteMediaClientCallback); }; CastButton.prototype.removeRemoteMediaClientCallback = function () { this.getRemoteMediaClient().unregisterCallback(this.mRemoteMediaClientCallback); }; CastButton.prototype.addMediaQueueCallback = function () { var mediaQueue = this.getRemoteMediaClient().getMediaQueue(); mediaQueue.registerCallback(this.mMediaQeueuCallback); }; CastButton.prototype.removeMediaQueueCallback = function () { var mediaQueue = this.getRemoteMediaClient().getMediaQueue(); mediaQueue.unregisterCallback(this.mMediaQeueuCallback); }; CastButton.prototype.addProgressListenenr = function () { this.getRemoteMediaClient().addProgressListener(this.mRemoteMediaClientProgressListener, 100); }; CastButton.prototype.removeProgressListener = function () { this.getRemoteMediaClient().removeProgressListener(this.mRemoteMediaClientProgressListener); }; CastButton.prototype.getRemoteMediaClient = function () { return this.mSessionManager.getCurrentCastSession().getRemoteMediaClient(); }; CastButton.prototype.buildMediaInfo = function (mediaInfo) { var metadata; if (mediaInfo.metadata) { var metadataType = metadataTypeStringToEnum(mediaInfo.metadata.metadataType); metadata = new MediaMetadata(metadataType); Object.keys(mediaInfo.metadata).forEach(function (key) { if (cast_common_1.CastButtonBase.validMetadataKeys.indexOf(key) > -1) { var fixedKey = METADATA_PREFIX + snakeCase_1.default(key).toUpperCase(); var value = mediaInfo.metadata[key]; metadata.putString(MediaMetadata[fixedKey], value); } }); if (mediaInfo.metadata.images && mediaInfo.metadata.images.length) { mediaInfo.metadata.images.forEach(function (img) { var uri = android.net.Uri.parse(img.url); var thumb = new WebImage(uri, img.width, img.height); metadata.addImage(thumb); }); } } var streamType = streamTypeStringToEnum(mediaInfo.streamType); var mediaInformation = new MediaInfo.Builder(mediaInfo.contentId) .setContentType(mediaInfo.contentType) .setStreamType(MediaInfo[streamType]); if (metadata) { mediaInformation.setMetadata(metadata); } if (mediaInfo.duration) { mediaInformation.setStreamDuration(mediaInfo.duration); } if (mediaInfo.customData) { var customData = new org.json.JSONObject(JSON.stringify(mediaInfo.customData)); mediaInformation.setCustomData(customData); } if (mediaInfo.textTracks && mediaInfo.textTracks.length > 0) { var tracks_1 = new ArrayList(); mediaInfo.textTracks.forEach(function (item, index) { var track = new MediaTrack.Builder(index + 1, MediaTrack.TYPE_TEXT) .setContentId(item.src) .setContentType(item.contentType) .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setName(item.name) .setLanguage(item.language) .build(); tracks_1.add(track); }); mediaInformation.setMediaTracks(tracks_1); } return mediaInformation.build(); }; CastButton.prototype.buildQueueItem = function (options) { var builtMediaInfo = this.buildMediaInfo(options.mediaInformation); var builder = new MediaQueueItem.Builder(builtMediaInfo) .setAutoplay(options.autoplay || true) .setCustomData(options.customData) .setPlaybackDuration(options.playbackDuration || Infinity) .setPreloadTime(options.preloadTime) .setStartTime(options.startTime || 0); if (options.activeTrackIds && options.activeTrackIds.length) { builder.setActiveTrackIds(options.activeTrackIds); } return builder.build(); }; CastButton.prototype.loadMedia = function (media, options) { var builtMediaInfo = this.buildMediaInfo(media); var requestData = new MediaLoadRequestData.Builder() .setAutoplay(new java.lang.Boolean(options.autoplay)) .setCredentials(options.credentials) .setCredentialsType(options.credentialsType) .setCurrentTime(options.startTime) .setCustomData(options.customData) .setMediaInfo(builtMediaInfo) .setPlaybackRate(options.playbackRate) .setQueueData(null); if (options.activeTrackIds && options.activeTrackIds.length) { requestData.setActiveTrackIds(options.activeTrackIds); } this.addRemoteMediaClientCallback(); this.addProgressListenenr(); this.getRemoteMediaClient().load(requestData.build()); }; CastButton.prototype.loadQueue = function (options) { var _this = this; var queueItems = new ArrayList(); options.items.forEach(function (item) { var queueItem = _this.buildQueueItem(item); if (queueItem) { queueItems.add(queueItem); } else { console.log('queue item not built'); console.log(item); } }); var queueData = new MediaQueueData.Builder(); if (options) { queueData .setName(options.name) .setQueueId(options.queueID) .setQueueType(queueTypeStringToEnum(options.queueType)) .setRepeatMode(repeatModeStringToEnum(options.repeatMode)) .setStartIndex(options.startIndex || 0) .setStartTime(options.startTime || 0); } queueData.setItems(queueItems); this.addRemoteMediaClientCallback(); this.addMediaQueueCallback(); var requestData = new MediaLoadRequestData.Builder() .setAutoplay(new java.lang.Boolean(options.autoplay || true)) .setQueueData(queueData.build()); this.getRemoteMediaClient().load(requestData.build()); }; CastButton.prototype.showController = function () { var intent = new android.content.Intent(this._context, com.google.android.gms.cast.framework.media.widget.ExpandedControllerActivity.class); this._context.startActivity(intent); }; CastButton.prototype.showCastInstructions = function (title, singleTime) { if (title === void 0) { title = 'Touch to cast media to your TV'; } if (singleTime === void 0) { singleTime = true; } var overlay = new com.google.android.gms.cast.framework.IntroductoryOverlay.Builder(this._context, this.getNativeView()) .setTitleText(title); if (singleTime) { overlay.setSingleTime(); } overlay.build().show(); }; CastButton.prototype.showCastDialog = function () { this.getNativeView().showDialog(); }; CastButton.prototype.getMediaInfo = function () { var mediaInfo = this.getRemoteMediaClient().getMediaInfo(); return convertMediaInfo(mediaInfo); }; CastButton.prototype.pauseMedia = function (customData) { this.getRemoteMediaClient().pause(customData); }; CastButton.prototype.playMedia = function (customData) { this.getRemoteMediaClient().play(customData); }; CastButton.prototype.seekMedia = function (position, resumeState, customData) { if (resumeState === void 0) { resumeState = 0; } this.getRemoteMediaClient().seek(position * 1000, resumeState, customData); }; CastButton.prototype.stopMedia = function (customData) { this.getRemoteMediaClient().stop(customData); }; CastButton.prototype.setActiveTrackIds = function (trackIds) { this.getRemoteMediaClient().setActiveMediaTracks(trackIds); }; CastButton.prototype.setTintColor = function () { console.log('setTintColor not available for Android.'); }; CastButton.prototype.setVolume = function (volume, customData) { var remoteMediaClient = this.getRemoteMediaClient(); remoteMediaClient.setStreamVolume(volume, customData); }; CastButton.prototype.setMuted = function (muted, customData) { var remoteMediaClient = this.getRemoteMediaClient(); remoteMediaClient.setStreamMute(muted, customData); }; CastButton.prototype.queueNextItem = function () { this.getRemoteMediaClient().queueNext(null); }; CastButton.prototype.queuePreviousItem = function () { this.getRemoteMediaClient().queuePrev(null); }; CastButton.prototype.queueSetRepeatMode = function (repeatMode) { this.getRemoteMediaClient().queueSetRepeatMode(repeatModeStringToEnum(repeatMode), null); }; CastButton.prototype.queueFetchItemIDs = function () { console.log('queueFetchItemIDs not implemented'); }; CastButton.prototype.queueFetchItemAtIndex = function (index) { console.log('queueFetchItemAtIndex not implemented'); }; CastButton.prototype.queueInsertItem = function (options) { var queueItem = this.buildQueueItem(options.item); if (options.play) { this.getRemoteMediaClient().queueInsertAndPlayItem(queueItem, options.beforeItemID || com.google.android.gms.cast.MediaQueueItem.INVALID_ITEM_ID, options.playPosition || 0, options.customData); } else { this.getRemoteMediaClient().queueInsertItems([queueItem], options.beforeItemID || com.google.android.gms.cast.MediaQueueItem.INVALID_ITEM_ID, options.customData); } }; CastButton.prototype.queueInsertItems = function (options) { var _this = this; var queueItems = []; options.items.forEach(function (item) { var queueItem = _this.buildQueueItem(item); queueItems.push(queueItem); }); this.getRemoteMediaClient().queueInsertItems(queueItems, options.beforeItemID || com.google.android.gms.cast.MediaQueueItem.INVALID_ITEM_ID, options.customData); }; CastButton.prototype.queueRemoveItems = function (itemIDs, customData) { this.getRemoteMediaClient().queueRemoveItems(itemIDs, customData); }; CastButton.prototype.queueReorderItems = function (itemIDs, beforeItemID, customData) { this.getRemoteMediaClient().queueReorderItems(itemIDs, beforeItemID || com.google.android.gms.cast.MediaQueueItem.INVALID_ITEM_ID, customData); }; CastButton.prototype.queueJumpToItem = function (itemID, playPosition, customData) { this.getRemoteMediaClient().queueJumpToItem(itemID, playPosition, customData); }; CastButton.prototype.queueUpdateItems = function (options) { console.log('queueUpdateItems not implemented'); }; CastButton.prototype.onMediaStatusUpdate = function () { var mediaStatus = this.getRemoteMediaClient().getMediaStatus(); var info = null; var status = null; if (mediaStatus) { var mediaInfo = mediaStatus.getMediaInfo(); if (mediaInfo) { info = convertMediaInfo(mediaInfo); } var playerState = cast_types_1.PlayerState.UNKNOWN; var trackIds = mediaStatus.getActiveTrackIds(); var activeTrackIds = []; if (trackIds) { for (var i = 0; i < trackIds.length; i++) { activeTrackIds.push(trackIds[i]); } } switch (mediaStatus.getPlayerState()) { case MediaStatus.PLAYER_STATE_IDLE: playerState = cast_types_1.PlayerState.IDLE; break; case MediaStatus.PLAYER_STATE_PLAYING: playerState = cast_types_1.PlayerState.PLAYING; break; case MediaStatus.PLAYER_STATE_PAUSED: playerState = cast_types_1.PlayerState.PAUSED; break; case MediaStatus.PLAYER_STATE_BUFFERING: playerState = cast_types_1.PlayerState.BUFFERING; break; } var queueData = mediaStatus.getQueueData(); status = { activeTrackIds: activeTrackIds, playerState: playerState, idleReason: mediaStatus.getIdleReason(), isMuted: mediaStatus.isMute(), playbackRate: mediaStatus.getPlaybackRate(), streamPosition: mediaStatus.getStreamPosition(), volume: mediaStatus.getStreamVolume(), currentItemID: mediaStatus.getCurrentItemId(), loadingItemID: mediaStatus.getLoadingItemId(), preloadedItemID: mediaStatus.getPreloadedItemId(), queueData: { name: queueData.getName(), queueID: queueData.getQueueId(), queueType: queueTypeEnumToString(queueData.getQueueType()), repeatMode: repeatModeEnumToString(queueData.getRepeatMode()), startIndex: queueData.getStartIndex(), startTime: queueData.getStartTime(), }, queueItemCount: mediaStatus.getQueueItemCount(), }; } this.sendEvent(cast_common_1.CastButtonBase.castEvent, { eventName: cast_types_1.CastEvent.onMediaStatusChanged, status: status, info: info, android: this.nativeView }); }; return CastButton; }(cast_common_1.CastButtonBase)); exports.CastButton = CastButton; //# sourceMappingURL=cast.android.js.map