如何在客户端与 Netflix Cadmium 视频播放器交互?

How to interact with Netflix Cadmium video player on the client?

我有一个 Netflix 帐户,我已经在 Google Chrome 中查看了它的视频播放器 运行。 Netflix 调用其视频播放器 "Cadmium" 并且 javascript 公开了您可能期望的所有功能和事件处理程序,例如播放、停止、暂停、静音等。我正在构建一些 Chrome 扩展使我能够调用这些 Cadmium 播放器函数,但对我来说最困难的部分是弄清楚如何创建播放器的实例以便我可以开始调用。 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 视频播放器上的静音按钮时,执行会遇到断点。 Netflix js(不出所料)通过方法重命名被严重混淆了。我尝试在调试器中单步执行代码,结果遇到了一百个兔子洞,但始终无法找到到达堆栈顶部的方式,因此我可以进行相同的调用(在堆栈顶部)以模拟用户单击静音按钮。我还尝试了以编程方式单击 UI 播放器上的静音按钮的方法,这同样可以满足我的需求,但它们有严格的防御机制,让我像陀螺一样旋转。

由于 javascript 有超过 10 万行,我不确定哪些块与此 post 完全相关,我建议您在 [=22] 中加载 Netflix =],打开开发工具,播放电影,然后检查暂停或静音按钮。与这些视频播放器控件进行交互会将您带入 javascript 的迷宫,我正在尝试了解如何利用它以编程方式控制播放器的各个方面(目前仅通过开发工具就可以了)。我需要弄清楚的另一件重要事情是如何查询视频播放器以确定播放视频的当前经过时间。

有什么办法可以破解这个难题吗? (提前致谢!)

使用 Chrome,我使用 HTML 5 个视频进行播放。

一旦掌握了 <video> 标签元素,就可以使用 HTML 5 video API:

获取<video>元素

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

70143639是视频的id,如https://www.netflix.com/watch/70143639

剩余时间 (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();

时光倒流

提供: netflix.cadmium.UiEvents.events.resize[1].scope.events.drage‌​nd[1].handler(null, {value: 600, pointerEventData: {playing: false}}); 其中 600 是要搜索的秒数。

请注意,我 运行 使用此 "Whoops, something went wrong..." :

video.currentTime += 60;

即使有暂停和播放电话。这就是 this demo page does, you nay need to read the full spec on seeking.

静音并获得静音状态

video.muted = true

video.currentTime一样,这是一个可写的属性。