2010-09-24 18 views
2

J'utilise l'API YouTube AS3 Player pour charger des vidéos dans un projet Flash. Je reçois cette erreur vraiment gênant lors du chargement du swf du joueur:Comment éviter les erreurs de sécurité lors de l'utilisation de l'API Youtube AS3 Player

SecurityError: Error #2047: Security sandbox violation: parent: http://www.degoudenglimlach.be/main.swf cannot access http://www.youtube.com/[[IMPORT]]/s.ytimg.com/yt/swf/watch_as3-vflbgr4dW.swf. 

J'ai essayé d'ajouter ce qui suit à mon code avant de charger le swf, mais il ne fait aucune différence:

Security.allowDomain("*"); 
Security.allowDomain("www.youtube.com"); 
Security.allowDomain("youtube.com"); 
Security.allowDomain("s.ytimg.com"); 
Security.allowDomain("i.ytimg.com"); 

Toute aide serait génial.

Voilà toute ma classe wrapper:

package be.zap.media 
{ 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.net.URLRequest; 
    import flash.system.Security; 
    import flash.system.System; 

    /** 
    * ... 
    * @author Yens Resmann 
    */ 
    public class ZapYoutubeVideo extends Sprite 
    { 
     private var ytPlayer : Object; 
     private var ldr : Loader 
     private static const YOUTUBE_EMBEDDED_PLAYER_URL : String = "http://www.youtube.com/v/VIDEO_ID?version=3"; 

     public static const PLAYER_READY : String = "playerReady"; 

     public static const QUALITY_SMALL : String = "small"; 
     public static const QUALITY_MEDIUM : String = "medium"; 
     public static const QUALITY_LARGE : String = "large"; 
     public static const QUALITY_HD720 : String = "hd720"; 
     public static const QUALITY_HD1080 : String = "hd1080"; 
     public static const QUALITY_HIGHRES : String = "highres"; 
     public static const QUALITY_DEFAULT : String = "default"; 

     public function ZapYoutubeVideo() 
     { 
      Security.allowDomain("*"); 
      Security.allowDomain("www.youtube.com"); 
      Security.allowDomain("youtube.com"); 
      Security.allowDomain("s.ytimg.com"); 
      Security.allowDomain("i.ytimg.com"); 

      ldr = new Loader(); 
      ldr.contentLoaderInfo.addEventListener(Event.INIT, handleInitPlayer); 
      addEventListener(Event.REMOVED_FROM_STAGE, handleRemovedFromStage); 
     } 

     public function initPlayer(vidId : String) 
     { 
      var url : String = YOUTUBE_EMBEDDED_PLAYER_URL.split("VIDEO_ID").join(vidId); 
      ldr.load(new URLRequest(url)); 
     } 

     private function handleInitPlayer(e:Event):void 
     { 
      addChild(ldr); 
      ldr.contentLoaderInfo.removeEventListener(Event.INIT, handleInitPlayer); 

      ldr.content.addEventListener("onReady", handlePlayerReady); 
      ldr.content.addEventListener("onError", handlePlayerError); 
      ldr.content.addEventListener("onStateChange", handlePlayerStageChange); 
      ldr.content.addEventListener("onPlaybackQualityChange", handlePlayerQualityChange); 
     } 

     private function handlePlayerReady(e:Event):void 
     { 
      ytPlayer = ldr.content; 
      dispatchEvent(new Event(PLAYER_READY)); 
     } 

     public function queueVideoById(videoID : String, quality : String = QUALITY_DEFAULT):void 
     { 
      ytPlayer.cueVideoById(videoID, 0, quality); 
     } 

     public function loadVideoById(videoID : String, quality : String = QUALITY_DEFAULT):void 
     { 
      ytPlayer.loadVideoById(videoID, 0, quality); 
     } 

     public function queueVideoByUrl(url : String, quality : String = QUALITY_DEFAULT):void 
     { 
      ytPlayer.cueVideoByUrl(url, 0, quality); 
     } 

     public function loadVideoByUrl(url : String, quality : String = QUALITY_DEFAULT):void 
     { 
      ytPlayer.loadVideoByUrl(url, 0, quality); 
     } 

     public function setSize(w:int, h:int):void 
     { 
      ytPlayer.setSize(w, h); 
     } 

     private function handlePlayerError(e:Event):void 
     { 

     } 

     private function handlePlayerStageChange(e:Event):void 
     { 

     } 

     private function handlePlayerQualityChange(e:Event):void 
     { 

     } 

     private function handleRemovedFromStage(e:Event):void 
     { 
      removeEventListener(Event.REMOVED_FROM_STAGE, handleRemovedFromStage); 
      dispose(); 
     } 

     public function dispose():void 
     { 
      ytPlayer.destroy(); 
      if (ldr) { 
       if (contains(ldr)) { 
        removeChild(ldr); 
       } 
       ldr = null; 
      } 
     } 

     /** 
     * parse out the Youtube Video ID from the video URL 
     * @param url 
     * @return String 
     */ 
     public static function getIdFromURL(url:String):String 
     { 
      var parts : Array = []; 
      if (url.indexOf("watch?v=") != -1) { 
       parts = url.split("watch?v="); 
      } else if (url.indexOf("watch/v/") != -1) { 
       parts = url.split("watch/v/"); 
      } else if (url.indexOf("youtu.be/") != -1) { 
       parts = url.split("youtu.be/"); 
      } 
      return String(parts[1]).split("/").join(""); 
     } 

     /** 
     * get the thumbnail of the video 
     * @param String youtube Video ID 
     * @return URLRequest 
     */ 
     public static function getThumbnail(videoId : String):URLRequest 
     { 
      return new URLRequest("http://img.youtube.com/vi/" + videoId + "/0.jpg"); 
     } 

    } 

} 

Répondre

1

Je ne pense pas qu'il soit possible, regardez les messages d'erreur et vous devriez voir qu'ils ont surtout à faire face au fait que YouTube n'a pas encore actualisé son fichier de politique crossdomain et ne spécifie pas de politique de méta. voici leur dossier politique:

<!-- http://www.youtube.com/crossdomain.xml --> 
<!DOCTYPE cross-domain-policy 
    SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-access-from domain="*.youtube.com" /> 
    <allow-access-from domain="s.ytimg.com" /> 
</cross-domain-policy> 

Ils ont besoin d'ajouter une ligne comme celui-ci:

<site-control permitted-cross-domain-policies="all"/> 
+0

Alors API est très jolie à moins de mettre à jour ce fichier de politique? – Yens

+0

Eh bien, cela fonctionne réellement, ces erreurs sont surtout des avertissements que le fichier de politique devrait être mis à jour. c'est ennuyeux mais il n'y a pas grand-chose à faire à ce sujet – PatrickS

+0

La plupart de ces erreurs sont des avertissements. Si tel était le cas, cela ne me dérangerait pas beaucoup, mais l'erreur dont je parle rend Firefox + FP10.1 Crash pour une raison quelconque. – Yens

1

J'utilise cette fonction

private function test():void 
{ 
    var ytLoader:SWFLoader = new SWFLoader(); 
    ytLoader.addEventListener(Event.INIT, playerLoaderInitHandler); 
    ytLoader.loaderContext = new LoaderContext(true); 
    ytLoader.load("http://www.youtube.com/v/TXrc6BwGCXE?version=3"); 
} 
private function playerLoaderInitHandler(event:Event):void 
{ 
    var loader:SWFLoader = event.currentTarget as SWFLoader; 
    addChild(loader); 
} 

J'utilise SWFLoader au lieu de Loader.

+0

Merci, la classe SWFLoader de greensock a fonctionné sans problèmes. La classe Loader du flash natif ne semble plus fonctionner, après les changements de youtube.Cela fonctionnait bien avant. Non seulement il a besoin de "https", mais il continue à donner des "erreurs de sécurité", même après avoir ajouté tous les types de fonctions system.security() dans le fichier de script. –

0

J'ai le même problème et je passe beaucoup de temps à essayer de corriger sans masquer l'erreur. J'ai donc fait un mouvement très fou. Selon mon erreur, autre pile de trace ressemble que:

error before .... 
cannot access https://s.ytimg.com/yts/swfbin/player-vflzYgZmb/watch_as3.swf. 
at flash.display::DisplayObject/get parent() 
at fl.managers::FocusManager/isTabVisible() 
at fl.managers::FocusManager/tabEnabledChangeHandler() 
at flash.events::EventDispatcher/dispatchEventFunction() 
at flash.events::EventDispatcher/dispatchEvent() 
at com.google.youtube.ui::UIElement/onAddedToStage() 

Alors ce que je remarqué, que l'API de lecteur youtube vérifie si les enfants de l'onglet sont activés, alors j'ai enlevé il ajouter dans le récipient MC, où le joueur est placé:

this.tabChildren = false; 

et devinez quoi - plus d'erreur! Et aussi je devais ajouter au joueur de scène après avoir placé tabChildren à faux et quand le joueur est prêt.