portokala123

Chromecast receiver v3 fake mediaElement for youtube

Dec 12th, 2018
791
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     const context = cast.framework.CastReceiverContext.getInstance();
  2.     const playerManager = context.getPlayerManager();
  3.    
  4.     var yt_events = {};
  5.     var pause_request = false;
  6.     var yt_player;
  7.    
  8.     var yt_video_fake = {
  9.         removeAttribute: function(attr) {
  10.         },
  11.         setAttribute: function(attr, val) {
  12.         },
  13.        
  14.         getCurrentTimeSec: function() { return yt_player && yt_player.getCurrentTime ? yt_player.getCurrentTime() : 0; },
  15.         getDurationSec: function() { return yt_player ? yt_player.getDuration() : 0; },
  16.         getVolume: function() {
  17.             if(!yt_player || !yt_player.getVolume) {
  18.                 return 0;
  19.             }
  20.            
  21.             var volume = new cast.framework.messages.Volume();
  22.            
  23.             volume.level = yt_player.getVolume() / 100;
  24.             volume.muted = yt_player.isMuted() ? true : false;
  25.            
  26.             return volume;
  27.         },
  28.         setVolume: function(vol) { yt_player && yt_player.setVolume(vol.level * 100); },
  29.         getState: function() {
  30.             if(!yt_player || !yt_player.getPlayerState) {
  31.                 return 'IDLE';
  32.             }
  33.            
  34.             var state = yt_player.getPlayerState();
  35.             var _state;
  36.            
  37.             if(pause_request) {
  38.                 pause_request = false;
  39.                 state = YT.PlayerState.PAUSED;
  40.             }
  41.            
  42.             switch(state) {
  43.                 default: case YT.PlayerState.UNSTARTED:
  44.                     _state = 'IDLE';
  45.                 break;
  46.                
  47.                 case YT.PlayerState.PLAYING:
  48.                     _state = 'PLAYING';
  49.                 break;
  50.                
  51.                 case YT.PlayerState.PAUSED:
  52.                     _state = 'PAUSED';
  53.                 break;
  54.                
  55.                 case YT.PlayerState.BUFFERING:
  56.                     _state = 'BUFFERING';
  57.                 break;
  58.                
  59.                 case YT.PlayerState.ENDED:
  60.                     _state = 'ENDED';
  61.                 break;
  62.             }
  63.            
  64.             return _state;
  65.         },
  66.        
  67.         addEventListener: function(e, func) { },
  68.         load: function() {},
  69.         play: function() { yt_player && yt_player.playVideo(); },
  70.         pause: function() { if(yt_player && yt_player.pauseVideo) {pause_request = true; yt_player.pauseVideo(); }},
  71.         seek: function(timeTo) { yt_player && yt_player.seekTo(timeTo, true);},
  72.         reset: function() {
  73.             if(yt_player) {
  74.                 try { yt_player.destroy && yt_player.destroy(); } catch(e) {
  75.                     //console.trace(e);
  76.                 };
  77.                 delete yt_player;
  78.             }
  79.         },
  80.        
  81.         registerErrorCallback: function(func) { yt_events['error'] = func; },
  82.         registerEndedCallback: function(func) { yt_events['ended'] = func; },
  83.         registerLoadCallback: function(func) { yt_events['load'] = func; },
  84.        
  85.         unregisterErrorCallback: function () { delete yt_events['error'] },
  86.         unregisterEndedCallback: function () { delete yt_events['ended']},
  87.         unregisterLoadCallback: function () { delete yt_events['load']}
  88.     };
  89.    
  90.     Object.defineProperty(yt_video_fake, 'currentTime', {
  91.         val1: null,
  92.         get: function() { return yt_player && yt_player.getCurrentTime ? yt_player.getCurrentTime() : this.val1; },
  93.         set: function(newValue) {
  94.             yt_player && yt_player.seekTo(newValue, true);
  95.             this.val1 = newValue;
  96.         },
  97.         enumerable      : true,
  98.         configurable    : true
  99.     });
  100.    
  101.     Object.defineProperty(yt_video_fake, 'volume', {
  102.         val1: null,
  103.         get: function() { var vol = this.getVolume(); if(vol) return vol['level']; return 1; },
  104.         set: function(newValue) {
  105.             yt_player && yt_player.setVolume && yt_player.setVolume(newValue * 100);
  106.             this.val1 = newValue;
  107.         },
  108.         enumerable      : true,
  109.         configurable    : true
  110.     });
  111.    
  112.    
  113.     Object.defineProperty(yt_video_fake, 'duration', {
  114.         val1: null,
  115.         get: function() { return this.getDurationSec(); },
  116.         set: function() {},
  117.         enumerable      : true,
  118.         configurable    : true
  119.     });
  120.    
  121.    
  122.     function YoutubePlayMedia(videoid) {
  123.         var yt_container = $('#yt_container');
  124.        
  125.         if(!yt_container.length) {
  126.             yt_container = $('<div id="yt_container" style="position:absolute;top:0;left:0;width:100%;height:100%;"></div>');
  127.             $('body').append(yt_container);
  128.         }
  129.        
  130.         yt_container.html('<iframe id="youtube_container" style="width:100%;height:100%;" frameborder="0" allowfullscreen="1" allow="autoplay; encrypted-media" title="YouTube video player" src="//www.youtube.com/embed/' + videoid +'?autoplay=1&enablejsapi=1&modestbranding=1&controls=0&fs=0&iv_load_policy=3&rel=0&cc_load_policy=1&cc_lang_pref=bg"></iframe>');
  131.        
  132.         yt_player = new YT.Player('youtube_container', {
  133.             events: {
  134.                 'onReady': function(e) {
  135.                     yt_player.is_loaded = true;
  136.                     yt_player.playVideo();
  137.                 },
  138.                 'onStateChange': function(e) {
  139.                     switch(e.data) {
  140.                         case YT.PlayerState.PLAYING:
  141.                             if(yt_player.is_loaded) {
  142.                                 if(yt_events['load']) {
  143.                                     yt_events['load']();
  144.                                 }
  145.                             }
  146.                            
  147.                         break;
  148.                        
  149.                         case YT.PlayerState.ENDED:
  150.                             //yt_events['ended'] && yt_events['ended'](e);
  151.                         break;
  152.                     }
  153.                 },
  154.                 'onError': function(e) {
  155.                     //yt_events['error'] && yt_events['error'](e);
  156.                 }
  157.             }
  158.         });
  159.     }
  160.    
  161.     function YoutubeLoadMedia(url) {
  162.         current_media_type = 'Youtube';
  163.        
  164.         window.onYouTubeIframeAPIReady = function() {
  165.             window.youtube_loaded = true;
  166.             YoutubePlayMedia(url);
  167.         }
  168.        
  169.         if(!window.youtube_script) {
  170.             window.youtube_script = document.createElement('script');
  171.             window.youtube_script.src = "https://www.youtube.com/iframe_api";
  172.             var firstScriptTag = document.getElementsByTagName('script')[0];
  173.             firstScriptTag.parentNode.insertBefore(window.youtube_script, firstScriptTag);
  174.         } else {
  175.             // Вече имаме api направо действаме
  176.             YoutubePlayMedia(url);
  177.         }
  178.     }
  179.    
  180.    
  181.     playerManager.setMessageInterceptor(
  182.         cast.framework.messages.MessageType.LOAD,
  183.         loadRequestData => {
  184.             if (loadRequestData.media && loadRequestData.media.contentId) {
  185.                 YoutubeLoadMedia(loadRequestData.media.contentId);
  186.                 playerManager.setMediaElement(yt_video_fake);
  187.                
  188.                 return false;
  189.             }
  190.            
  191.             return loadRequestData;
  192.         }
  193.     );
  194.    
  195.     const options = new cast.framework.CastReceiverOptions();
  196.     options.disableIdleTimeout = true;
  197.    
  198.     context.start(options);
Advertisement
Add Comment
Please, Sign In to add comment