Chrome中的Netflix视频播放器 - 如何寻求?

Her*_*der 6 javascript netflix javascript-objects dom-events video-player

我一直无法弄清楚如何在Chrome中运行的Netflix视频播放器中进行视频搜索(自动前进到视频中的某个点).该currentTime属性可以读取但不能在Netflix播放器中设置,设置后立即触发错误"哎呀!出错了.".PlayPause等其他操作效果很好.例如,您可以尝试以下操作:

  1. 登录Netflix(来自谷歌浏览器)并转到电影" 世界末日".
  2. 电影加载后,如果开始播放,请将其暂停.
  3. 打开Chrome开发者工具面板.转到"控制台"选项卡.
  4. 将以下代码段粘贴到控制台中,然后点击<ENTER>:

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

注意:id值特定于Armageddon.如果您选择其他电影,这很好,请根据该电影的网址中的ID更改ID.

  1. 输入以下内容,然后按<Enter>:video.play().观察视频恢复播放.

很简单,但如何让视频自动前进到视频中的特定点?您可能想参考此文档.显然,您可以通过从左到右拖动视频播放器滑块手动搜索并将其释放到某个位置.您可能希望在执行此操作时发现调用哪个方法或事件,并对其进行模拟.到目前为止我没有运气.

有任何想法吗?

Dmi*_*kin 16

看起来netflix改变了播放器api.它是我发现的:

const videoPlayer = netflix
  .appContext
  .state
  .playerApp
  .getAPI()
  .videoPlayer

// Getting player id
const playerSessionId = videoPlayer
  .getAllPlayerSessionIds()[0]

const player = videoPlayer
  .getVideoPlayerBySessionId(playerSessionId)
Run Code Online (Sandbox Code Playgroud)

现在您可以使用完整播放器API.例如player.seekplayer.getCurrentTimeplayer.pause等..

  • @StephenCagle没什么超自然的:)只是chrome dev-tools及其自动完成.第一个我寻找任何全局变量(所以我找到了`window.netflix`).然后我只是专注地阅读所有属性,方法名称等,并花了很多时间来实验它:) (4认同)
  • 这正是我一直在寻找的。“cadmium”对象不再通过“netflix” API 提供。谢谢。 (2认同)
  • Dimitry,你介意解释你的演绎过程来解决这个问题吗?几个月前我放弃了,因为我无法破解它.你是怎么解决这个问题的?什么工具,什么过程,什么思路.谢谢! (2认同)

Dan*_*ish 6

如果您希望它在 chrome 扩展中工作,它只能在 netflix 的控制台日志中工作,那么您需要将此代码注入脚本标记中才能使其工作。

const videoPlayer = netflix.appContext.state.playerApp.getAPI().videoPlayer;
const player = videoPlayer.getVideoPlayerBySessionId(videoPlayer.getAllPlayerSessionIds()[0]);

player.seek(1091243) //seek to roughly 18mins

player.getCurrentTime() // will give you the current video time.
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


kb0*_*kb0 3

最后找到了一个简单的解决方案:

netflix.cadmium.UiEvents.events.resize[1].scope.events.dragend[1].handler(null, {value: 999, pointerEventData: {playing: false}});
Run Code Online (Sandbox Code Playgroud)

您可以设置:

  • 使用value属性的位置
  • 使用pointerEventData.playing属性的播放状态

这不是完整的解决方案,但可能很有用。

以前版本的 netflix 播放器使用全局对象window.netflix.cadmium.objects.videoPlayer。在最新版本中它是空的,但您可以在事件侦听器中访问此对象:

  1. 打开 Chrome 开发者工具
  2. 选择“正文”元素
  3. 选择“事件监听器”
  4. 打开“框架侦听器”
  5. 选择“keydown”事件,“body”-处理程序 p(e),“[[Scopes]]”,1 [[Closure]]
  6. 您可以使用上下文菜单保存此对象引用 - “存储为全局变量”
  7. 然后在新的全局变量中,您可以访问temp1.cadmium.objects.videoPlayer

    temp1.cadmium.objects.videoPlayer().getDuration() temp1.cadmium.objects.videoPlayer().seek(2283839); temp1.cadmium.objects.videoPlayer().seek(4283839);

[![在此处输入图像描述][1]][1]

我不确定是否可以全自动进行。您可以通过以下方式访问此侦听器

getEventListeners(document.getElementsByTagName("body")[0]).keydown[0].listener
Run Code Online (Sandbox Code Playgroud)

但我不知道如何访问范围变量

  • 截至 2017 年 9 月,此方法不再有效:netflix 对象中未引用镉。 (4认同)
  • @SweatCoder,由于内容脚本的限制,它在 chrome 扩展中不起作用(https://developer.chrome.com/extensions/content_scripts):“但是,内容脚本有一些限制。它们不能......使用变量或由网页或其他内容脚本定义的功能......”。您可以尝试使用 http://stackoverflow.com/questions/12395722/can-the-window-object-be-modified-from-a-chrome-extension 中的解决方法 (2认同)