web-dev-qa-db-ja.com

クライアントでNetflixカドミウムビデオプレーヤーと対話する方法は?

私はNetflixアカウントを持っており、GoogleChrome内で実行されているビデオプレーヤーを内部から覗き見ました。 Netflixはそのビデオプレーヤーを「カドミウム」と呼び、JavaScriptは、再生、停止、一時停止、ミュートなど、期待されるすべての関数とイベントハンドラーを公開します。私は少しChromeこれらのカドミウムプレーヤー関数を呼び出すことを可能にする拡張機能ですが、私にとって難しいのは、呼び出しを開始できるようにプレーヤーのインスタンスを作成する方法を理解することです。JavaScriptは大きく、複雑で、ややあいまいです。作成できるようになるとそのプレイヤーのインスタンスでは、関数を呼び出すのは簡単だと思います。

これがjsの関連するチャンクです:

muteOn: function() {
          this.savedVolume = this.getVolume(),
          this.updateVolumeDisplay(0),
          this.scrubber.updatePercent(0),
          this.muted = !0,
          this.videoPlayer.setMuted(this.muted)
}

Chrome開発ツールでは、そのブロック内にブレークポイントを設定できます。netflixビデオプレーヤーの[ミュート]ボタンをクリックすると、実行がブレークポイントに到達します。Netflixjsは、(当然のことながら)メソッドによって非常に難読化されています。名前の変更:デバッガーでコードをステップ実行しようとしましたが、100個の難読化された穴が見つかりましたが、スタックの一番上に到達する方法が見つからなかったため、同じ呼び出しを(スタックの一番上で)行ってユーザーをシミュレートできましたミュートボタンをクリックします。UIプレーヤーのミュートボタンをプログラムでクリックするアプローチも試しました。これは私のニーズも同様に満たしますが、そこには深刻な防御メカニズムがあり、トップのように回転します。

10万行を超えるJavaScriptがあり、どのチャンクがこの投稿に正確に関連するかわからないため、ChromeにNetflixをロードし、開発ツールを開いて、映画を再生し、一時停止またはミュートを調べることをお勧めします。ボタン。これらのビデオプレーヤーコントロールを操作すると、JavaScriptの迷路にたどり着きます。これを利用して、プログラムでプレーヤーの側面を制御する方法を確認しようとしています(今のところ開発ツールからでも問題ありません)。私が理解する必要があるもう1つの重要なことは、ビデオプレーヤーにクエリを実行して、再生中のビデオの現在の経過時間を決定する方法です。

このナッツを割る方法はありますか? (前もって感謝します!)

13
HerrimanCoder

Chromeを使用して、HTML5ビデオを使用して再生します。

_<video>_タグ要素を取得したら、 HTML 5ビデオAPI を使用できます。

_<video>_要素を取得します

_var video = document.evaluate('//*[@id="70143639"]/video',document).iterateNext()
_

_70143639_は、 https://www.netflix.com/watch/70143639 のように、動画のIDです。

残り時間(HH:mm)

_document.evaluate('//*[@id="netflix-player"]/div[4]/section[1]/label', document).iterateNext().innerHTML
_

経過時間(秒)

_video.currentTime
_

経過時間の更新

_video.addEventListener("timeupdate",
    function(e) {
        console.debug("Seconds elapsed: ", e.timeStamp/1000/60);
    }
);
_

_video.currentTime_の場合と同じ結果が得られないことに注意してください。違いに基づいて、オフセットを使用する必要がある場合があります。また、仕様で説明されているものかもしれません: https://www.w3.org/TR/html5/embedded-content-0.html

演奏する

_video.play();
_

一時停止

_video.pause();
_

時間の前後に行きます

礼儀 rebelliardnetflix.cadmium.UiEvents.events.resize[1].scope.events.drage‌​nd[1].handler(null, {value: 600, pointerEventData: {playing: false}});ここで、_600_はシークする秒数です。

これを使用して、「おっと、何かがうまくいかなかった...」に遭遇したことに注意してください。

_video.currentTime += 60;
_

一時停止して通話を再生しても。これは このデモページ が行うことです。 シークに関する完全な仕様 を読む必要はありません。

ミュートしてミュートステータスを取得する

_video.muted = true
_

_video.currentTime_と同様に、これは書き込み可能なプロパティです。

13
pyb