Netflix即时播放器(Silverlight)的JavaScript API?

9

Netflix Instant播放器(Silverlight)有没有Javascript API?最好是一个受支持的、有文档的API,但如果只有一个不受支持、没有文档的API也可以;这是为了一个个人项目。

我想能够播放/暂停并跳转到指定时间。


请参见http://stackoverflow.com/questions/9195337/use-javascript-to-pause-jump-to-position-and-adjust-volume-in-netflixs-silver,以及有关控制HTML5播放器的信息,请参见https://dev59.com/XYbca4cB1Zd3GeqPbd5B。 - rogerdpack
6个回答

13
我很高兴深入研究了这个问题,我认为我找到了你的答案。
首先,我发现Netflix的一位员工在一篇(虽然有点旧)帖子中表示,他们的许可要求禁止他们提供外部控制播放器的方式(所有内容都需要包装在Netflix品牌的应用程序中,如果提供与播放器外部交互的方法,将允许您将Netflix播放器嵌入不应该去的地方)。你可以在这里找到那个回复(尽管它已经四年了,但我想情况没有太大变化)。

http://developer.netflix.com/forum/read/54172

我试图在"立即观看"页面上进行搜寻,发现了一些对象,例如netflix.SilverLight和netflix.SilverLight.MoviePlayer(具有getPlugin()方法,返回有关插件的一些详细信息和可挂接事件,但没有控制方法),但它们大多与暴露播放器视口大小有关,以及其他必要的东西来将其放置在页面上。我真的找不到任何对象中的内容表明它们与电影播放器交互,似乎让我可以访问它。

我还获取了播放器二进制文件,并通过其中发现了一个ScriptInterface对象,其中包含PlayMovie()、StopMovie()、ShowCurtain()和HideCurtain()等带有[ScriptableMember]修饰的方法。

然后,我注意到播放器二进制文件中还有另一个名为Netflix.Silverlight.CBPApp.HostedPlayer的命名空间,它有自己的接口-HostedPlayerScriptInterface。其中包含了你想要的所有内容-播放位置数据,增加和减少播放速度的控件,暂停、播放、设置播放位置,查询播放状态等,所有这些都被装饰为[ScriptableMember]。

现在我要让你失望了——看起来(无论出于什么原因),这个接口没有作为[ScriptableType]公开,而据我所知,这是从javascript访问它的先决条件。事实上,似乎唯一以这种方式公开的是播放器触发的事件。我猜测这段代码是用于与其他合作伙伴集成,或者是遗留下来的自视频播放器原始代码继承的某人,但似乎故意省略了这个[ScriptableType]参数。也许有一种方法可以请求构建为“Hosted”的二进制文件,虽然我不确定这意味着什么,我还怀疑人们会很明显地注意到你正在尝试做什么,并迅速阻止它。

抱歉回答这么长并以失望告终,但目前看来真的没有办法。我看到一些建议基本上相当于向模拟键盘控件发送按键,但这显然不是你要找的,所以我会在这里回答“不行”。:)

编辑:

进一步研究表明,这不是我想象中的死路。我挖掘完后会更新这个问题。

编辑2:

看起来你需要欺骗Netflix播放器,让它认为它正在运行托管播放器模式。有一些可以传递的配置选项,但我不确定具体该如何操作。看起来这都是在播放器初始化时设置的 - 也许可以使用一些书签脚本重新加载页面并注入更改?或者只需重新加载播放器并更改设置。

this.PlayerViewModel = (applicationConfiguration.PlayerConfiguration.EnableHostedPlayerControl ? new HostedPlayerViewModel() : new GenesisPlayerViewModel());

这是我想出来的地方。当使用 HostedPlayerViewModel 时,会执行以下代码:

HtmlPage.RegisterScriptableObject("HostedPlayerControlScriptInterface_1", this.b)

如果我理解正确,这将让您通过获取包含 Netflix Silverlight 播放器的 DOM 对象并调用它来访问此注册对象。
silverlightPlayer.content.findName('HostedPlayerControlScriptInterface_1').WhateverMethod()

请注意,我对JavaScript互操作性的掌握不多,很多内容都是从文档中推断出来的,但是似乎在其中有一个JavaScript控制API,只需要将播放器变为托管模式即可。我得停在这里了,但希望这能给你一个好的开始。我已经转储了托管播放器JavaScript API文件的内容,这样一旦您成功将播放器置于托管模式,就可以看到公开的方法。

http://pastebin.com/UeN3NFMg

祝你好运!


1
很好的文章。我尝试通过在Chrome中使用以下Tampermonkey脚本设置托管播放器配置来跟随您提供的内容:http://paste.kde.org/734150/。不幸的是,似乎最可能正确启用它的选项会导致播放器无法加载(请参见剪贴板中的注释)。在使用其他选项(或无选项)加载后,以下内容永远不起作用。 var player = document.getElementById('SLPlayer'); player.content.findName('HostedPlayerControlScriptInterface_1'); // null player.content // seems right 我对Silverlight不熟悉,但有什么想法吗? - boombatower

4
我晚了很多,我相信Netflix处理客户端代码的方式已经发生了很多变化,但是我建议您查看netflix.cadmium.objects.videoPlayer()返回的对象。这可能会有所改变,但是这可能会有用。

哦,我应该补充说明,这在 Firefox 中不起作用,可能是因为对于 Firefox,Netflix 在 Silverlight 中呈现播放器控件,而不是 JS。 - eremzeit

3

由于您提到了未记录的内容...

在Silverlight中,要使方法直接暴露给JavaScript,它需要在其类上具有[ScriptableType]属性,在自身上具有[ScriptableMember]属性。您可以尝试打开Netflix播放器的XAP文件,反汇编主程序集,并搜索任何带有[ScriptableMember]的方法。这可能完全没有用处,但您仍然可以尝试。


жңүдәәеҒҡиҝҮиҝҷдёӘеҗ—пјҹжҲ‘з”Ёзҡ„жҳҜMacпјҢжүҖд»Ҙж— жі•и§ЈжһҗNetflixзҡ„Silverlightеә”з”ЁзЁӢеәҸгҖӮжҲ‘д№ҹжғідҪҝз”ЁJavaScriptжҺ§еҲ¶NetflixдёҠзҡ„и§Ҷйў‘ж’ӯж”ҫгҖӮ - RobKohr

1

1
在提问之前,我已经尝试过了;不幸的是,这个API似乎只用于查找/排队/播放即时电影,而不能控制播放器。(说实话,我的原始问题对我想要做什么并不清楚。) - Evan Krall

1

Boxee可能曾经可以控制它:http://dir.boxee.tv/apps/helper2/netflix.js(此外,也许还有其他一些分支)。

我也想知道Netflix转向HTML5实现是否会允许插件控制播放。祝好运!


似乎Boxee的脚本是基于HostedPlayer,而Max在下面的帖子中指出这是一个死胡同。您可以通过netflix.Silverlight.MoviePlayer.getPlugin().settings.hostedPlayer来进行双重检查,该设置为false,并且netflix.Silverlight.MoviePlayer.get_hosted_player_control()无法使用。在Chrome中,我的视频正在使用HTML5,所以您说的也许在那里会起作用! - Derek Dahmer
@DerekDahmer 或许现在是可能的,例如:https://dev59.com/XYbca4cB1Zd3GeqPbd5B#27931990 - rogerdpack
@DerekDahmer 我在那篇帖子中添加了我的最新作品(针对HTML5版本,实际上几乎可以控制LOL)。 - rogerdpack

-3

<iframe src="https://www.netflix.com/watch"></iframe>


4
欢迎来到Stack Overflow。仅提供代码答案通常可以通过添加一些解释来改进其工作原理和原因。对于已有答案的旧问题,非常重要的是指出你的回答解决了问题的哪一个新方面。在这种情况下,您正在提供一个现在可行的答案,通过绕过问题中提到的Silverlight部分,因为您的答案没有回应该部分。 - Jason Aller

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