2

我正在尝试编写一个扩展程序,当它检测到 chrome 请求音频文件时,它将下载音频文件。我这个项目是基于谷歌提供的“Download_links”和“catifier”两个样本的代码。这是我目前拥有的:

var RequestMatcher = chrome.declarativeWebRequest.RequestMatcher;
var IgnoreRules = chrome.declarativeWebRequest.IgnoreRules;
var RedirectRequest = chrome.declarativeWebRequest.RedirectRequest;
var songFileURL = "http://somefile.mp3";
...
function registerRules() {
    var redirectRule = {
    priority: 100,

    conditions: [
        new RequestMatcher({
            contentType: ['audio/mp3']
        }),
    ],

    actions: [
        chrome.downloads.download({url: songFileURL}),
    ]
};
...

当我加载并尝试它时,我收到一个错误:Uncaught Error: Invalid value for argument 1. Property '.0': Value does not match any valid type choices. 无论我尝试什么,我都无法弄清楚是什么导致了这个错误。总的来说,我对 Chrome 扩展和 JavaScript 相当满​​意,所以我确信这是一个简单的解决方法,但我无法弄清楚。有任何想法吗?

4

1 回答 1

3

我认为问题在于您指定了不受支持的操作。可以在页面chrome.declarativeWebRequest找到可用操作的列表。

我认为您应该使用chrome.webRequest.onBeforeRequest,onHeadersReceivedonComplete来跟踪媒体链接并从那里启动自定义下载,可能以某种延迟的方式,因为我不确定downloads仅从另一个请求处理程序中工作。

首先,您可以查看 Google 的CatBlock示例,或其他相关答案其他答案。基本上,您需要通过添加适当的事件处理程序addListener,并在处理程序调用chrome.downloads.download({url: request.url})中,其中将request作为输入参数传递给处理程序。

您应该根据自己的要求决定选择哪一个事件(例如,onBeforeRequest或)。onComplete据我了解,您不想阻止原始请求,因此等待原始下载完成,然后在处理程序中onComplete处理它可能很有用,这样 Chrome 就可以通过从缓存中复制已经下载的文件来优化该过程。

{cancel: true}作为替代方案,您可以通过从每个声音文件的处理程序返回来阻止初始下载onBeforeRequest,然后作为单个文件开始下载,可能saveAs涉及选项。

于 2012-12-22T21:52:27.700 回答