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

Posted

技术标签:

【中文标题】如何在客户端与 Netflix Cadmium 视频播放器交互?【英文标题】:How to interact with Netflix Cadmium video player on the client? 【发布时间】:2017-06-18 12:54:28 【问题描述】:

我有一个 Netflix 帐户,并且我已经窥视了它在 Google Chrome 中运行的视频播放器的幕后花絮。 Netflix 将其视频播放器称为“Cadmium”,并且 javascript 公开了您可能期望的所有功能和事件处理程序,例如播放、停止、暂停、静音等。我正在构建一个小的 Chrome 扩展程序,使我能够调用这些镉player 函数,但对我来说困难的部分是弄清楚如何创建播放器的实例,以便我可以开始调用。 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 播放器上的静音按钮的方法,这同样可以很好地满足我的需求,但它们有严格的防御机制,让我像陀螺一样旋转。

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

任何想法我可以如何破解这个坚果? (提前致谢!)

【问题讨论】:

【参考方案1】:

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

及时往返

感谢rebelliard: netflix.cadmium.UiEvents.events.resize[1].scope.events.drage‌​nd[1].handler(null, value: 600, pointerEventData: playing: false); 其中600 是要查找的秒数。

请注意,我遇到了“糟糕,出了点问题......”使用这个:

video.currentTime += 60;

即使是暂停和播放通话。这就是this demo page 所做的,你不需要阅读full spec on seeking。

静音并获得静音状态

video.muted = true

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

【讨论】:

pyb,这很有希望,但我遇到了一些问题。尽管过去和剩余时间工作得很好,但我无法成功调用video.play()video.pause()。我分别得到video.play is not a functionvideo.pause is not a function。事件侦听器也什么都不做——我希望在执行它并单击 netflix 上的“播放”按钮后看到控制台输出,但什么也没有。我从 Chrome 开发工具的控制台窗口调用所有这些。有什么想法吗? 还有一点需要注意:video 变量似乎只计算为显示经过时间的标签——而不是播放器本身。 @SweatCoder 抱歉,我混合了代码以获得video 和剩余时间的标签。我编辑了我的答案,这应该可以解决您上面提到的所有问题。 谢谢 pyb,这很有帮助。关于让 video.currentTime (set/seek) 工作的任何新想法?我在上面碰到了砖墙。 @pyb 搜索以这种方式为我工作:netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[1].handler(null, value: 600, pointerEventData: playing: false);,其中value 是要搜索的播放秒数。

以上是关于如何在客户端与 Netflix Cadmium 视频播放器交互?的主要内容,如果未能解决你的问题,请参考以下文章

springcloud与常用组件微量说明,部分组件已被最新的替代,这是netflix springcloud

Netflix Eureka

使用 Netflix Feign 和 Hystrix 设置请求超时

Spring Cloud Netflix(网飞)

SpringCloud Netflix入门简介

启动和使用 Netflix Eureka 服务注册表的过程