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

21
我有一个 Netflix 帐户,我已经在 Google Chrome 中查看了其视频播放器。Netflix 称其视频播放器为 "Cadmium",JavaScript 公开了您可能期望的所有函数和事件处理程序,例如播放、停止、暂停、静音等。我正在构建一个小型的 Chrome 扩展程序,使我可以调用这些 Cadmium 播放器函数,但对我来说困难的是如何创建播放器实例以便我可以开始调用。JavaScript 代码很大、复杂且有些晦涩。一旦我可以创建该播放器的实例,我认为调用函数将变得很容易。
以下是相关的 JavaScript 代码段:
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播放器上的静音按钮的方法,这同样符合我的需求,但它们有严格的防御机制,让我像陀螺一样旋转。

由于有超过100K行JavaScript代码,我不确定哪些块会与此帖子相关,因此建议您在Chrome中加载Netflix,打开开发工具,播放电影并检查暂停或静音按钮。与这些视频播放器控件交互将带您进入迷宫般的JavaScript,我正试图了解如何将其纳入程序化控制播放器的方面(目前仅从开发工具中进行)。我需要弄清楚的另一件重要事情是如何查询视频播放器以确定正在播放的视频的当前流逝时间。

有任何想法如何解决这个问题吗?(提前感谢!)

1个回答

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();

来回穿越时空

引用自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 一样,这是一个可写属性。


1
@SweatCoder 抱歉,我混淆了获取video和剩余时间标签的代码。我编辑了我的答案,这应该修复你上面提到的所有问题。 - pyb
1
请参见https://dev59.com/Lp7ha4cB1Zd3GeqPq_FL。 - HerrimanCoder
执行 video.currentTime += 10 会导致 Netflix 抛出 "哎呀,出了点问题" 的错误信息。:/ - rebelliard
1
@pyb 对我来说是这样的:netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[1].handler(null, {value: 600, pointerEventData: {playing: false}});,其中 value 是要寻找的播放秒数。 - rebelliard
镉对象不再存在,至少不在Netflix对象中。 - HerrimanCoder
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接