UNPKG

nativescript-cast

Version:

NativeScript Chromecast Plugin.

470 lines 20.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var utils_1 = require("tns-core-modules/utils/utils"); var camelCase_1 = require("lodash/fp/camelCase"); var upperFirst_1 = require("lodash/fp/upperFirst"); var color_1 = require("tns-core-modules/color"); var cast_common_1 = require("./cast.common"); var cast_types_1 = require("./cast.types"); var media_queue_delegate_ios_1 = require("./media-queue-delegate.ios"); var remote_media_client_listener_ios_1 = require("./remote-media-client-listener.ios"); var session_manager_listener_ios_1 = require("./session-manager-listener.ios"); var METADATA_PREFIX = 'kGCKMetadataKey'; function metadataTypeEnumToString(metadataType) { switch (metadataType) { case 1: return cast_types_1.MetadataType.MOVIE; case 2: return cast_types_1.MetadataType.TV_SHOW; case 3: return cast_types_1.MetadataType.MUSIC_TRACK; case 4: return cast_types_1.MetadataType.PHOTO; case 5: return cast_types_1.MetadataType.USER; case 100: return cast_types_1.MetadataType.USER; default: return cast_types_1.MetadataType.GENERIC; } } exports.metadataTypeEnumToString = metadataTypeEnumToString; function metadataTypeStringToEnum(metadataType) { switch (metadataType) { case cast_types_1.MetadataType.MOVIE: return 1; case cast_types_1.MetadataType.TV_SHOW: return 2; case cast_types_1.MetadataType.MUSIC_TRACK: return 3; case cast_types_1.MetadataType.PHOTO: return 4; case cast_types_1.MetadataType.AUDIO_BOOK_CHAPTER: return 5; case cast_types_1.MetadataType.USER: return 100; default: return 0; } } exports.metadataTypeStringToEnum = metadataTypeStringToEnum; function streamTypeEnumToString(streamType) { switch (streamType) { case 1: return cast_types_1.StreamType.BUFFERED; case 2: return cast_types_1.StreamType.LIVE; case 99: 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 1; case cast_types_1.StreamType.LIVE: return 2; case cast_types_1.StreamType.UNKNOWN: return 99; default: return 0; } } exports.streamTypeStringToEnum = streamTypeStringToEnum; function repeatModeStringToEnum(repeatMode) { switch (repeatMode) { case cast_types_1.RepeatMode.OFF: return 1; case cast_types_1.RepeatMode.SINGLE: return 2; case cast_types_1.RepeatMode.ALL: return 3; case cast_types_1.RepeatMode.ALL_AND_SHUFFLE: return 4; default: return 1; } } exports.repeatModeStringToEnum = repeatModeStringToEnum; function repeatModeEnumToString(repeatMode) { switch (repeatMode) { case 1: return cast_types_1.RepeatMode.OFF; case 2: return cast_types_1.RepeatMode.SINGLE; case 3: return cast_types_1.RepeatMode.ALL; case 4: return cast_types_1.RepeatMode.ALL_AND_SHUFFLE; default: return cast_types_1.RepeatMode.OFF; } } exports.repeatModeEnumToString = repeatModeEnumToString; function resumeStateStringToEnum(resumeState) { switch (resumeState) { case cast_types_1.ResumeState.PLAY: return 1; case cast_types_1.ResumeState.PAUSE: return 2; default: return 0; } } exports.resumeStateStringToEnum = resumeStateStringToEnum; function queueTypeStringToEnum(queueType) { switch (queueType) { case cast_types_1.QueueType.ALBUM: return 1; case cast_types_1.QueueType.PLAYLIST: return 2; case cast_types_1.QueueType.AUDIO_BOOK: return 3; case cast_types_1.QueueType.RADIO_STATION: return 4; case cast_types_1.QueueType.PODCAST_SERIES: return 5; case cast_types_1.QueueType.TV_SERIES: return 6; case cast_types_1.QueueType.VIDEO_PLAYLIST: return 7; case cast_types_1.QueueType.LIVE_TV: return 8; case cast_types_1.QueueType.MOVIE: return 9; default: return 0; } } exports.queueTypeStringToEnum = queueTypeStringToEnum; function queueTypeEnumToString(queueType) { switch (queueType) { case 1: return cast_types_1.QueueType.ALBUM; case 2: return cast_types_1.QueueType.PLAYLIST; case 3: return cast_types_1.QueueType.AUDIO_BOOK; case 4: return cast_types_1.QueueType.RADIO_STATION; case 5: return cast_types_1.QueueType.PODCAST_SERIES; case 6: return cast_types_1.QueueType.TV_SERIES; case 7: return cast_types_1.QueueType.VIDEO_PLAYLIST; case 8: return cast_types_1.QueueType.LIVE_TV; case 9: 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.metadata; var metaDataKeys = utils_1.ios.collections.nsArrayToJSArray(metadata.allKeys()); var images = utils_1.ios.collections.nsArrayToJSArray(metadata.images()); var textTracks = []; var textTrackStyle = {}; var castMetadata = { metadataType: metadataTypeEnumToString(metadata.metadataType), images: [], }; metaDataKeys.forEach(function (key) { var fixedKey = camelCase_1.default(key.replace('kGCKMetadataKey', '')); castMetadata[fixedKey] = metadata.objectForKey(key); }); images.forEach(function (img) { castMetadata.images.push({ url: img.URL.absoluteString, width: img.width, height: img.height }); }); if (mediaInfo.mediaTracks) { var tracks = utils_1.ios.collections.nsArrayToJSArray(mediaInfo.mediaTracks); textTracks = tracks .filter(function (track) { return track.type === 1; }) .map(function (track) { return { id: track.identifier, src: track.contentIdentifier, contentType: track.contentType, name: track.name, language: track.languageCode, }; }); } if (mediaInfo.textTrackStyle) { textTrackStyle = { foregroundColor: mediaInfo.textTrackStyle.foregroundColor.CSSString(), backgroundColor: mediaInfo.textTrackStyle.foregroundColor.CSSString(), edgeColor: mediaInfo.textTrackStyle.edgeColor.CSSString(), windowColor: mediaInfo.textTrackStyle.windowColor.CSSString(), fontFamily: mediaInfo.textTrackStyle.fontFamily, customData: mediaInfo.textTrackStyle.customData }; } return { contentId: mediaInfo.contentID, streamType: streamTypeEnumToString(mediaInfo.streamType), contentType: mediaInfo.contentType, metadata: castMetadata, duration: mediaInfo.streamDuration, textTracks: textTracks, textTrackStyle: textTrackStyle, }; } exports.convertMediaInfo = convertMediaInfo; var CastButton = (function (_super) { __extends(CastButton, _super); function CastButton() { return _super.call(this) || this; } CastButton.prototype.createNativeView = function () { var button = GCKUICastButton.alloc().initWithFrame(CGRectMake(0, 0, 24, 24)); this.mCastContext = GCKCastContext.sharedInstance(); this.mCastContext.useDefaultExpandedMediaControls = true; this.mSessionManager = this.mCastContext.sessionManager; this.mSessionManagerListener = new session_manager_listener_ios_1.SessionManagerListenerImpl; this.mSessionManagerListener.owner = this; this.mRemoteMediaClientListener = new remote_media_client_listener_ios_1.RemoteMediaClientListenerImpl; this.mRemoteMediaClientListener.owner = this; this.mMediaQueueDelegate = new media_queue_delegate_ios_1.MediaQueueDelegate; this.mMediaQueueDelegate.owner = this; 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.removeSessionManagerListener(); _super.prototype.disposeNativeView.call(this); }; CastButton.prototype.addSessionManagerListener = function () { this.mSessionManager.addListener(this.mSessionManagerListener); }; CastButton.prototype.removeSessionManagerListener = function () { this.mSessionManager.removeListener(this.mSessionManagerListener); }; CastButton.prototype.getRemoteMediaClient = function () { return this.mSessionManager.currentCastSession.remoteMediaClient; }; CastButton.prototype.buildMediaInfo = function (mediaInfo) { var metadata; if (mediaInfo.metadata) { var metadataType = metadataTypeStringToEnum(mediaInfo.metadata.metadataType); metadata = GCKMediaMetadata.alloc().initWithMetadataType(metadataType); Object.keys(mediaInfo.metadata).forEach(function (key) { if (cast_common_1.CastButtonBase.validMetadataKeys.indexOf(key) > -1) { var fixedKey = METADATA_PREFIX + upperFirst_1.default(key); var value = mediaInfo.metadata[key]; metadata.setStringForKey(value, fixedKey); } }); if (mediaInfo.metadata.images && mediaInfo.metadata.images.length) { mediaInfo.metadata.images.forEach(function (img) { var uri = NSURL.URLWithString(img.url); metadata.addImage(GCKImage.alloc().initWithURLWidthHeight(uri, img.width, img.height)); }); } } var mediaTracks = null; if (mediaInfo.textTracks && mediaInfo.textTracks.length > 0) { mediaTracks = NSMutableArray.arrayWithCapacity(mediaInfo.textTracks.length); mediaInfo.textTracks.forEach(function (track, index) { mediaTracks.addObject(GCKMediaTrack.alloc().initWithIdentifierContentIdentifierContentTypeTypeTextSubtypeNameLanguageCodeCustomData(index + 1, track.src, track.contentType, 1, 1, track.name, track.language, null)); }); } var textTrackStyle = null; if (mediaInfo.textTrackStyle) { textTrackStyle = GCKMediaTextTrackStyle.new(); textTrackStyle.foregroundColor = GCKColor.alloc().initWithCSSString(mediaInfo.textTrackStyle.foregroundColor); textTrackStyle.backgroundColor = GCKColor.alloc().initWithCSSString(mediaInfo.textTrackStyle.backgroundColor); textTrackStyle.edgeColor = GCKColor.alloc().initWithCSSString(mediaInfo.textTrackStyle.edgeColor); textTrackStyle.windowColor = GCKColor.alloc().initWithCSSString(mediaInfo.textTrackStyle.windowColor); textTrackStyle.fontFamily = mediaInfo.textTrackStyle.fontFamily; textTrackStyle.customData = mediaInfo.textTrackStyle.customData; } var streamType = typeof mediaInfo.streamType === 'string' ? streamTypeStringToEnum(mediaInfo.streamType) : mediaInfo.streamType; var mediaInformation = GCKMediaInformationBuilder.alloc().initWithContentID(mediaInfo.contentId); mediaInformation.contentType = mediaInfo.contentType; mediaInformation.customData = mediaInfo.customData; mediaInformation.mediaTracks = mediaTracks; mediaInformation.metadata = metadata; mediaInformation.startAbsoluteTime = mediaInfo.startAbsoluteTime; mediaInformation.streamDuration = mediaInfo.duration; mediaInformation.streamType = streamType; mediaInformation.textTrackStyle = textTrackStyle; return mediaInformation.build(); }; CastButton.prototype.buildQueueItem = function (options) { var builtMediaInfo = this.buildMediaInfo(options.mediaInformation); var builder = GCKMediaQueueItemBuilder.new(); builder.mediaInformation = builtMediaInfo; if (options) { builder.autoplay = options.autoplay || true; builder.customData = options.customData; builder.playbackDuration = options.playbackDuration || Infinity; builder.preloadTime = options.preloadTime; builder.startTime = options.startTime || 0; if (options.activeTrackIds && options.activeTrackIds.length) { builder.activeTrackIDs = NSArray.arrayWithArray(options.activeTrackIds); } } return builder.build(); }; CastButton.prototype.loadMedia = function (media, autoplay, position) { if (autoplay === void 0) { autoplay = true; } if (position === void 0) { position = 0; } var remoteMediaClient = this.getRemoteMediaClient(); remoteMediaClient.addListener(this.mRemoteMediaClientListener); var builtMediaInfo = this.buildMediaInfo(media); var requestData = GCKMediaLoadRequestDataBuilder.new(); requestData.mediaInformation = builtMediaInfo; requestData.autoplay = +autoplay; requestData.startTime = position; remoteMediaClient.loadMediaWithLoadRequestData(requestData.build()); }; CastButton.prototype.loadQueue = function (options) { var _this = this; var queueItems = []; options.items.forEach(function (item) { var queueItem = _this.buildQueueItem(item); if (queueItem) { queueItems.push(queueItem); } else { console.log('queue item not built'); console.log(item); } }); var mediaQueueData = GCKMediaQueueDataBuilder.new(); if (options) { mediaQueueData.queueID = options.queueID; mediaQueueData.name = options.name; mediaQueueData.queueType = queueTypeStringToEnum(options.queueType); mediaQueueData.startIndex = options.startIndex || 0; mediaQueueData.startTime = options.startTime || 0; if (options.repeatMode) { mediaQueueData.repeatMode = repeatModeStringToEnum(options.repeatMode); } } mediaQueueData.items = NSArray.arrayWithArray(queueItems); var remoteMediaClient = this.getRemoteMediaClient(); remoteMediaClient.addListener(this.mRemoteMediaClientListener); this.mMediaQueue = GCKMediaQueue.alloc().initWithRemoteMediaClient(remoteMediaClient); this.mMediaQueue.addDelegate(this.mMediaQueueDelegate); this.mCastContext.defaultExpandedMediaControlsViewController.setButtonTypeAtIndex(3, 1); this.mCastContext.defaultExpandedMediaControlsViewController.setButtonTypeAtIndex(2, 2); var requestData = GCKMediaLoadRequestDataBuilder.new(); requestData.queueData = mediaQueueData.build(); remoteMediaClient.loadMediaWithLoadRequestData(requestData.build()); }; CastButton.prototype.showController = function () { this.mCastContext.presentDefaultExpandedMediaControls(); }; CastButton.prototype.showCastInstructions = function () { this.mCastContext.presentCastInstructionsViewControllerOnceWithCastButton(this.nativeView); }; CastButton.prototype.showCastDialog = function () { this.mCastContext.presentCastDialog(); }; CastButton.prototype.getMediaInfo = function () { var remoteMediaClient = this.getRemoteMediaClient(); if (!remoteMediaClient) { return {}; } var mediaInfo = remoteMediaClient.mediaStatus.mediaInformation; return convertMediaInfo(mediaInfo); }; CastButton.prototype.pauseMedia = function (customData) { this.getRemoteMediaClient().pauseWithCustomData(customData); }; CastButton.prototype.playMedia = function (customData) { this.getRemoteMediaClient().playWithCustomData(customData); }; CastButton.prototype.seekMedia = function (position, resumeState, customData) { this.getRemoteMediaClient().seekToTimeIntervalResumeStateCustomData(position, resumeStateStringToEnum(resumeState), customData); }; CastButton.prototype.stopMedia = function (customData) { this.getRemoteMediaClient().stopWithCustomData(customData); }; CastButton.prototype.setActiveTrackIds = function (trackIds) { this.getRemoteMediaClient().setActiveTrackIDs(trackIds); }; CastButton.prototype.setTintColor = function (color) { var mRouteButton = this.getNativeView(); mRouteButton.tintColor = new color_1.Color(color).ios; }; CastButton.prototype.setVolume = function (volume, customData) { var remoteMediaClient = this.getRemoteMediaClient(); remoteMediaClient.setStreamVolumeCustomData(volume, customData); }; CastButton.prototype.setMuted = function (muted, customData) { var remoteMediaClient = this.getRemoteMediaClient(); remoteMediaClient.setStreamMutedCustomData(muted, customData); }; CastButton.prototype.queueNextItem = function () { this.getRemoteMediaClient().queueNextItem(); }; CastButton.prototype.queuePreviousItem = function () { this.getRemoteMediaClient().queuePreviousItem(); }; CastButton.prototype.queueSetRepeatMode = function (repeatMode) { this.getRemoteMediaClient().queueSetRepeatMode(repeatModeStringToEnum(repeatMode)); }; 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().queueInsertAndPlayItemBeforeItemWithIDPlayPositionCustomData(queueItem, options.beforeItemID || kGCKMediaQueueInvalidItemID, options.playPosition || 0, options.customData); } else { this.getRemoteMediaClient().queueInsertItemBeforeItemWithID(queueItem, options.beforeItemID || kGCKMediaQueueInvalidItemID); } }; 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().queueInsertItemsBeforeItemWithIDCustomData(queueItems, options.beforeItemID || kGCKMediaQueueInvalidItemID, options.customData); }; CastButton.prototype.queueRemoveItems = function (itemIDs, customData) { this.getRemoteMediaClient().queueRemoveItemsWithIDsCustomData(itemIDs, customData); }; CastButton.prototype.queueReorderItems = function (itemIDs, beforeItemID, customData) { this.getRemoteMediaClient().queueReorderItemsWithIDsInsertBeforeItemWithIDCustomData(itemIDs, beforeItemID || kGCKMediaQueueInvalidItemID, customData); }; CastButton.prototype.queueJumpToItem = function (itemID, playPosition, customData) { this.getRemoteMediaClient().queueJumpToItemWithIDPlayPositionCustomData(itemID, playPosition, customData); }; CastButton.prototype.queueUpdateItems = function (options) { console.log('queueUpdateItems not implemented'); }; return CastButton; }(cast_common_1.CastButtonBase)); exports.CastButton = CastButton; //# sourceMappingURL=cast.ios.js.map