nativescript-cast
Version:
NativeScript Chromecast Plugin.
470 lines • 20.6 kB
JavaScript
"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