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

问题描述 投票:0回答:2

我有一个 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 代码超过 100K 行,并且我不确定哪些块与本文相关,我建议您在 Chrome 中加载 Netflix,打开开发工具,播放电影,然后检查暂停或静音按钮。与这些视频播放器控件交互会将您带入 JavaScript 的迷宫,我正在尝试了解如何利用它以编程方式控制播放器的各个方面(目前仅从开发工具就可以了)。我需要弄清楚的另一件重要的事情是如何查询视频播放器以确定播放视频的当前经过时间。

有什么想法可以解决这个问题吗? (预先感谢!)

javascript netflix
2个回答
16
投票

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

一旦掌握了

<video>
标签元素,您就可以使用 HTML 5 视频 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
是要查找的秒数。

请注意,我使用此方法遇到了“哎呀,出了问题......”:

video.currentTime += 60;

即使暂停和播放通话。这就是这个演示页面所做的,您可能需要阅读有关寻求的完整规范

静音并获得静音状态

video.muted = true

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


0
投票

嗨,在播放器中寻找我发现:

let videoId = netflix.appContext.state.playerApp.getAPI().videoPlayer.getAllPlayerSessionIds()[0];
netflix.appContext.state.playerApp.getAPI().videoPlayer.getVideoPlayerBySessionId(videoId).seek(10000);

        

在此示例中,播放器将以 10000 毫秒播放视频。 但是您需要直接在 html 页面中注入脚本,如果您要在清单 v3 注入的内容脚本中使用此扩展,对于我的情况将不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.