package { import com.brightcove.api.APIModules; import com.brightcove.api.CustomModule; import com.brightcove.api.components.ComboBox; import com.brightcove.api.dtos.VideoDTO; import com.brightcove.api.events.CaptionsEvent; import com.brightcove.api.events.MediaEvent; import com.brightcove.api.events.PropertyChangeEvent; import com.brightcove.api.events.ExperienceEvent; import com.brightcove.api.modules.CaptionsModule; import com.brightcove.api.modules.ExperienceModule; import com.brightcove.api.modules.VideoPlayerModule; import com.brightcove.api.modules.SocialModule; import flash.system.Capabilities; /** * This plugin loads in a dfxp file for each video based on a custom field value, dfxpPath. * If a combo box exists in the player with the id "closedCaptionsCombo" it will be made * visible and populated with the languages from the file. */ public class CaptionPlugin extends CustomModule { private static const CC_OFF:String = "CC off"; private var mVideoPlayer:VideoPlayerModule; private var mExperienceModule:ExperienceModule; private var mCaptionsModule:CaptionsModule; private var mLanguageSelector:ComboBox; private var mLanguage:String; private var mIgnoreSelection:Boolean; private var mSocialModule:SocialModule; /** * Initialization method called by super class when player is ready for interaction. */ override protected function initialize():void { mVideoPlayer = player.getModule(APIModules.VIDEO_PLAYER) as VideoPlayerModule; // only run if there is a video player if (mVideoPlayer) { // default to the browser language mSocialModule = player.getModule(APIModules.SOCIAL) as SocialModule; mSocialModule.setEmbedCode("this is my new embed code"); mExperienceModule = player.getModule(APIModules.EXPERIENCE) as ExperienceModule; mExperienceModule.addEventListener(ExperienceEvent.TEMPLATE_READY, onTemplateReady); debug(ExperienceEvent.TEMPLATE_READY); // if we find the combo with the expected id, set up listener for change mLanguageSelector = mExperienceModule.getElementByID("closedCaptionsCombo") as ComboBox; if (mLanguageSelector) { mLanguageSelector.addEventListener(PropertyChangeEvent.CHANGE, onComboChange); } mCaptionsModule = player.getModule(APIModules.CAPTIONS) as CaptionsModule; mCaptionsModule.addEventListener(CaptionsEvent.DFXP_LOAD_SUCCESS, onCaptionsLoad); mCaptionsModule.addEventListener(CaptionsEvent.DFXP_LOAD_ERROR, onCaptionsLoadError); // set up for when the video changes to load in new dfxp file mVideoPlayer.addEventListener(MediaEvent.CHANGE, onMediaChange); // if video has already loaded, check for dfxp if (mVideoPlayer.getCurrentVideo()) { onMediaChange(null); } } debug("METAL METAL METAL METAL METAL"); //debug(mSocialModule.getEmbedCode()); } /** * Handler for when the video changes in the player. * This loads in new dfxp for video if path can be found in custom field. */ private function onMediaChange(pEvent:MediaEvent):void { // remove current language mCaptionsModule.setLanguage(null); // remove languages from combo if (mLanguageSelector) { mIgnoreSelection = true; mLanguageSelector.setData([mExperienceModule.getTranslation(CC_OFF)]); mIgnoreSelection = false; } // load dfxp if path can be found var video:VideoDTO = mVideoPlayer.getCurrentVideo(); var dfxpurl:String = mExperienceModule.getPlayerParameter("dfxpurl") as String; if (video && dfxpurl) { mCaptionsModule.loadDFXP(dfxpurl); } else if (mLanguageSelector) { // hide selector when there is no file to load mLanguageSelector.setIncludeInLayout(false); } } /** * Handler for when the language selection changes. */ private function onComboChange(pEvent:PropertyChangeEvent):void { if (mIgnoreSelection) { return; } mLanguage = mLanguageSelector.getSelectedData().label; // in this case, send null value for language to shut it off if (mLanguage == mExperienceModule.getTranslation(CC_OFF)) { mCaptionsModule.setLanguage(null); } else { mCaptionsModule.setLanguage(mLanguage); } var str:String = "NEW EMBED CODE: [lang: "+ mLanguage + "]"; str+= "[dfxpurl : "+(mExperienceModule.getPlayerParameter("dfxpurl") as String)+"]"; str+= "[playerID : "+(mExperienceModule.getPlayerParameter("playerID") as String)+"]"; str+= "[playerKey : "+(mExperienceModule.getPlayerParameter("playerKey") as String)+"]"; str+= "[videoPlayer : "+(mExperienceModule.getPlayerParameter("@videoPlayer") as String)+"]"; mSocialModule.setEmbedCode(str); } /** * Handler for when dfxp file loads for video. */ private function onCaptionsLoad(pEvent:CaptionsEvent):void { var video:VideoDTO = mVideoPlayer.getCurrentVideo(); // just in case player has been removed if (video == null) { return; } var languages:Array = mCaptionsModule.getLanguages(video.id); // populate languages if combo exists if (mLanguageSelector) { // we have captions, so make list visible mLanguageSelector.setIncludeInLayout(true); // always have off switch at top languages.unshift(mExperienceModule.getTranslation(CC_OFF)); mIgnoreSelection = true; mLanguageSelector.setData(languages); mIgnoreSelection = false; // see if we can find the previous selection var languageIndex:int = languages.indexOf(mLanguage); if (languageIndex > -1) { mLanguageSelector.setSelectedIndex(languageIndex); } else { // turn off captions if we don't know which language mLanguageSelector.setSelectedIndex(0); } // if there is no combo box, just use browser default } else { mCaptionsModule.setLanguage(Capabilities.language); } } /** * Handler for when dfxp file fails to load for video. */ private function onCaptionsLoadError(pEvent:CaptionsEvent):void { if (mLanguageSelector) { // hide selector when there is an error mLanguageSelector.setIncludeInLayout(false); } } private function onTemplateReady(pEvent:ExperienceEvent):void { debug("SAMSUNG?"); //mSocialModule.setEmbedCode("create my own embed code + "); } private function debug(str:String):void{ if(mExperienceModule) { mExperienceModule.debug(str); } } } }