1

YouTubeビデオのソースswfファイルを変更したいのですが。ビデオは<embed>要素です。

構築方法:

<embed width="640" id="movie_player-flash" height="390"
       tabindex="0" type="application/x-shockwave-flash"
       src="http://s.ytimg.com/yt/swfbin/watch_as3-vfl07wZSq.swf" flasvars="...">

(例はGoogleのYouTubeチャンネルにあります)

flashvars設定付きの長い文字列であるため、いくつかの属性とコンテンツを省略しましたが、これはビデオにまったく影響しますか?


私が試したこと:

  1. 属性を変更するだけで試しましたsrcが、何の影響もありません。

    document.getElementById('movie_player-flash').src = url;
    
  2. また、オリジナルのクローンを作成し、ソースを変更して再追加しようとしました。そして再び:何も:

    var player = document.getElementById('movie_player-flash');
    var playerClone = player.cloneNode(true);
    playerClone.setAttribute('src', url);
    
    player.parentNode.replaceChild(playerClone, player);
    

ビデオソースの変更を達成する方法を知っている人はいますか?

4

1 に答える 1

2

ここには多くの問題があります:

  1. フラッシュビデオは常に入っているわけではなく<embed id="movie_player-flash"、時々入ってい<embed id="movie_player"ます。これはGoogleなので、おそらく他のスキームもあります。だから、単純なdocument.getElementById('movie_player-flash')ものがすぐに出てきます。次のようなものを使用します:

    var flashEmbed  = document.querySelectorAll ("#movie_player-flash, #movie_player");
    if (flashEmbed.length) {
        flashEmbed  = flashEmbed[0];
        // DO THE SWITCH HERE.
    }
    


  2. src属性を変更するだけで機能します、まれな状況でのみ機能します。別のビデオに切り替える場合:

    1. パラメータは必要ありません。(ただし、適切なタグ を作成することで、これらを復元できる場合が<object>あります。)<param>
    2. 外部依存関係をロードしません。 これらは、ターゲットページと同じドメインにない場合、クロスドメインセキュリティによってブロックされます。さらに、フラッシュファイルがロードするオブジェクトのパスは、ファイル自体の中で修正されることがよくあります(同じドメインであっても、404エラーが発生する可能性があります)。

    その後、それは動作することができます。このフィドルを参照してください。

  3. 再:

    flashvars設定付きの長い文字列であるため、いくつかの属性とコンテンツを省略しましたが、これはビデオにまったく影響しますか?

    現代のYoutubeでは、それflashvarsがすべてです!また、src属性を比較すると、ほとんどすべてのフラッシュビデオで同じであることがわかります。たとえば、どのビデオを試しても、現在はsrcですhttp://s.ytimg.com/yt/swfbin/watch_as3-vfl07wZSq.swf

    これは、<embed>タグによってロードされたフラッシュオブジェクトがビデオではないためです。これは、プレーヤー(およびその他のもの)をロードするシェルオブジェクトであり、プレーヤーは実際のビデオファイルをロードします。

    したがって、名目上、あるYoutubeビデオを別のビデオに変更するには、パラメータやを変更する必要がありますflashvarssrcを古いスタイルの直接<embed>リンク(例:)に変更しても、再生ボタンが押されるhttp://www.youtube.com/v/uY3LAFJbKyY?version=3&amp;hl=en_US&amp;rel=0までは機能しているように見えます。その後、パラメータで定義されたビデオが戻って再生されます。

  4. ただし、 Youtubeは(今のところ)古いシステムの側面を保持しています。したがって、古いスタイルの埋め込みリンクが見つかった場合は、をそれに交換して、を持たないものにsrc置き換えることができます。答えの最後にあるコードを参照してください。<embed>flashvars

    古いスタイルの埋め込みリンクを見つける1つの方法は次のとおりです。

    1. ビデオのYoutubeページで、 [共有]ボタンを押します
    2. 埋め込みボタンを押します。
    3. [古い埋め込みコードを使用する]チェックボックスをオンにします。
    4. textareaに<object>...<embed>...HTMLが表示されます。<embed> srcそれをコピーして、属性だけを抽出します。(例えば:

      http://www.youtube.com/v/uY3LAFJbKyY?version=3&amp;hl=en_US&amp;rel=0
      


      他のすべてを破棄します。

  5. フラッシュエレメントは必ずしもすぐにロードされるとは限りません。AJAXを介して置き換えることもできます。したがって、(右)が表示されるのを待つ必要があるかもしれません<embed>
    簡単にするために、これをsetInterval()で示しますが、堅牢で実用的なソリューションの場合は、この回答に示すようにwaitForKeyElements()ユーティリティを使用することをお勧めします。


すべてをまとめると、ほとんどのビデオを交換する完全なGreasemonkeyスクリプトがあります。

// ==UserScript==
// @name        _Youtube, replace flash video
// @description Replaces most videos with the Greatest Video Of All Time!
// @include     http://www.youtube.com/watch*
// @include     http://www.youtube.com/user*
// @grant       none
// ==/UserScript==

var embedChkIntval  = setInterval ( function () {
        var flashEmbed  = document.querySelectorAll ("#movie_player-flash, #movie_player");
        if (flashEmbed.length) {
            var playerClone = flashEmbed[0].cloneNode (true);
            playerClone.src = 'http://www.youtube.com/v/dQw4w9WgXcQ?version=3&amp;hl=en_US&amp;rel=0';
            playerClone.removeAttribute ("flashvars");

            flashEmbed[0].parentNode.replaceChild (playerClone, flashEmbed[0]);
            clearInterval (embedChkIntval);
        }
    },
    150
);
于 2012-09-17T06:01:06.693 に答える