Chrome エクステンション downloads API
- カテゴリ:
- JavaScript
- Chrome
- コメント数:
- Comments: 2
◆ 通常のダウンロードと同じもの
◆ 拡張機能用の新しいものではない
◆ フォルダ階層指定したダウンロードできるのが便利
◆ 今ダウンロード済みサイズと残り時間を定期的に取得すればプログレスバーが作れる
◆ 拡張機能用の新しいものではない
◆ フォルダ階層指定したダウンロードできるのが便利
◆ 今ダウンロード済みサイズと残り時間を定期的に取得すればプログレスバーが作れる
拡張機能の API を見てると downloads というのがあります
https://developer.chrome.com/extensions/downloads
これ使うと高機能ダウンローダが作れるのかなと調べてみました
拡張機能用に特別なダウンロード機能が別にあるわけじゃなくて 通常の Chrome のダウンロードと同じものです
拡張機能を通さずにダウンロードしたファイルの情報をみたり中断などもできます
反対に拡張機能で扱ったファイルの情報だけが必要ならダウンロード開始するときの ID を保存しておいて ID で検索することになります
ダウンロード済みやダウンロード中の情報が欲しいわけじゃないならあまり必要のない機能です
この機能を使うには permission に "downloads" が必要です
配列の 1 つ 1 つがひとつのダウンロードに対応してます
クエリが空だと全件持ってきます
一応デフォルトで最大は 1000 件に設定されているのでそれ以上の場合は
検索するクエリは
などです
サイズで検索できますがぴったりダウンロードサイズが一致なんて使うことまずなさそうです
サイズは 今ダウンロード終わってるサイズと全体サイズと解凍後のサイズの 3 つありますが ダウンロード先サーバが先にサイズを教えてくれるものじゃないと 全体サイズと解凍後のサイズが不明なことがあります
ダウンロード中に 10MB / 100MB みたいな表示の右側のサイズが表示されてないときが不明な時です
マニュアルページだと -1 と書いてるのですが実際にやってみると 0 と表示されてました
解凍後のサイズも ほとんどのところで gzip 圧縮されて通信してそうですが fileSize と totalBytes が違うのはいくつか試した限りでは見かけなかったです
コールバック関数で受け取るダウンロード情報は検索できる項目などがいろいろ入ってます
だいたい見たままです
incognito は incognitoモード(シークレットモード)でダウンロードしたかのフラグです
error はエラーがあったときだけ理由が入ってます
byExtensionId と byExtensionName は拡張機能からのダウンロードだと拡張機能の id と名前が入っています
これで検索できればいいのですが検索条件にはできないみたい
コールバック関数の引数にはダウンロード ID が入ります
filename はパスを書けます
/ をつければフォルダを指定できます
フォルダがなければ作られます
ですが 基準のフォルダより上には行けません
ブラウザで設定した基準フォルダの中で好きなところにダウンロードできます
saveAs を true にすればユーザが保存先を選ぶダイアログが出せます
method に GET か POST を選べば GET/POST を切り替えられます
POST にするときは body に文字列を入れると POST でデータを送れます
header に {name: ....., value: .....} フォーマットのオブジェクトの配列を入れるとヘッダーを設定できます
ひとつのオブジェクトでキーに名前でバリューに値というよく見そう?なフォーマットではないです
ファイルがすでに存在してた場合のデフォルトは (1) などをつけてファイル名を被らないようにするものですが 変更できます
conflictAction に "uniquify" か "overwrite" か "prompt" を設定します
uniquify はデフォルトの設定でユニークするためにファイル名を変更します
overwrite は上書きで prompt はユーザが入力するダイアログを出します
被っていたら自動キャンセルってできないみたい
ダウンローダでまとめてダウンロードするときに毎回ダイアログ出してユーザがいちいちキャンセルって大変そう
一時停止は再開できますがキャンセルは再開できないです
ダウンロードアイテムの canResume プロパティが true になってるものだけ再開できます
Windows でファイルの種類と関連付けているアイコンが取得できます
ファイルサイズが 32px か 16px のどちらかです
コールバック関数で受け取れる URL は base64 の文字列でした
そのまま img タグの src に設定して使えます
ダウンロードしたファイルが選択状態になっているので ファイルがいっぱいあってもすぐにどれかわかります
ダウンロード先がフォルダ階層設定していると 上の showDefaultFolder で開くフォルダと違うフォルダになります
普段ダウンロードした時に下に出てくるバーでファイルをクリックするのと一緒です
ファイルを直接開くのでもうひとつ "downloads.open" という permission が必要になります
manifest.json に追加してください
ダウンロードしたファイルは残ります
search と同じ条件で検索してヒットしたものをまとめて削除します
コールバック関数が受け取るのは 削除したもののダウンロードID の配列です
erase と違ってファイルを削除です
こっちは 指定したダウンロードID で 1 つずつです
また 消すのはファイルだけでダウンロードリストには残ります
ダウンロードするときにフォルダを作成していたらこの削除でフォルダが空になってもフォルダは残ります
ondragstart の中で呼び出すと ダウンロード済みのファイルのドラッグを開始して別アプリケーションに持っていけるらしいです
ダウンローダで ダウンロード一覧のリストがあってリストの要素をドラッグすると 対応するダウンロードしたファイルをつかんだ動きをして エディタにドロップすると エディタでダウンロードしたファイルが開けるっていう使い方なんだと思うんです
ですが やってみるとダウンロードしたアイテムをドラッグできないですし それどころか気にせず別のソフトにドロップしたら Chrome がフリーズして強制終了することになりました
別環境でやってみても発生したのでたぶんこの機能の問題みたいです
インストールされてる拡張機能のどれかがオフに設定していたら全体でバーが表示されません
どれかがオフに設定している状態でオンにしようとしたらエラーになります
ポーズしたとき
ダウンロード完了したとき
削除した時
残り時間やダウンロード済みサイズが変わってもこのイベントは起きないです
残り時間や進行状況を表示するなら自分で setInterval などで定期的に調べに行くしかなさそうです
search で取得したダウンロードアイテムのオブジェクトはダウンロードが進んでも変更されないので search で検索することを毎回する必要があります
全機能をみたいなら最初にあるリンク先を見てください
https://developer.chrome.com/extensions/downloads
これ使うと高機能ダウンローダが作れるのかなと調べてみました
拡張機能用に特別なダウンロード機能が別にあるわけじゃなくて 通常の Chrome のダウンロードと同じものです
拡張機能を通さずにダウンロードしたファイルの情報をみたり中断などもできます
反対に拡張機能で扱ったファイルの情報だけが必要ならダウンロード開始するときの ID を保存しておいて ID で検索することになります
ダウンロード済みやダウンロード中の情報が欲しいわけじゃないならあまり必要のない機能です
この機能を使うには permission に "downloads" が必要です
search
ダウンロードリストから検索できますchrome.downloads.search({}, e => console.log(e))
[Object, Object, Object, ....]
コールバック関数の第一引数にダウンロード情報のオブジェクトの配列が入ります配列の 1 つ 1 つがひとつのダウンロードに対応してます
クエリが空だと全件持ってきます
一応デフォルトで最大は 1000 件に設定されているのでそれ以上の場合は
chrome.downloads.search({limit:0}, e => console.log(e))
limit:0 をつけると制限なしで持ってきます検索するクエリは
- id: ダウンロードIDが一致するもの
- startTime: ダウンロード開始した時間
- startedBefore: ダウンロード開始がこの時間より前
- startedAfter: ダウンロード開始がこの時間より後
- endTime: ダウンロード終了した時間
- endedBefore: ダウンロード終了がこの時間より後
- endedAfter: ダウンロード終了がこの時間より後
- totalBytes: ダウンロードする全体のファイルサイズ (不明なものは -1)
- totalBytesGreater: ダウンロードする全体のファイルサイズがこのサイズ以上
- totalBytesLess: ダウンロードする全体のファイルサイズがこのサイズ以下
- bytesReceived: ダウンロード済みのサイズ (ダウンロード中は増えていく)
- fileSize: 解凍後のファイルサイズ zip とかじゃなくて http 通信のときの gzip とかなはず (不明なものは -1)
- filename: ダウンロードしたファイルの保存先 フルパス (C:\USER\username\Downloads\test\aaa とか)
- filenameRegex: ダウンロードしたファイルの保存先の正規表現
- url: ダウンロードする URL
- urlRegex: ダウンロードする URL の正規表現
- state: ダウンロード状態がどれか "progressing", "interrupted", "complete"
- paused: 中断中?
- exists: ダウンロードしたファイルが存在する?
- mime: MIMEタイプ "image/png" とか
- limit: 取得する最大数 (デフォルトは 1000 で無制限にするには 0 指定)
- orderBy: ソート基準 ソートするキーの文字列の配列 (["state", "-endTime"] だと state で昇順にして endTime で降順にソート)
などです
サイズで検索できますがぴったりダウンロードサイズが一致なんて使うことまずなさそうです
サイズは 今ダウンロード終わってるサイズと全体サイズと解凍後のサイズの 3 つありますが ダウンロード先サーバが先にサイズを教えてくれるものじゃないと 全体サイズと解凍後のサイズが不明なことがあります
ダウンロード中に 10MB / 100MB みたいな表示の右側のサイズが表示されてないときが不明な時です
マニュアルページだと -1 と書いてるのですが実際にやってみると 0 と表示されてました
解凍後のサイズも ほとんどのところで gzip 圧縮されて通信してそうですが fileSize と totalBytes が違うのはいくつか試した限りでは見かけなかったです
コールバック関数で受け取るダウンロード情報は検索できる項目などがいろいろ入ってます
bytesReceived: 1339397198
canResume: true
danger: "safe"
exists: true
fileSize: 1469054976
filename: "C:\Users\lyze\Downloads\Fedora-Live-Workstation-x86_64-23-10.iso"
id: 831
incognito: false
mime: "application/x-iso9660-image"
paused: true
referrer: ""
startTime: "2016-01-27T07:27:33.993Z"
state: "in_progress"
totalBytes: 1469054976
url: "https://download.fedoraproject.org/pub/fedora/linux/releases/23/Workstation/x86_64/iso/Fedora-Live-Workstation-x86_64-23-10.iso"
canResume: true
danger: "safe"
exists: true
fileSize: 1469054976
filename: "C:\Users\lyze\Downloads\Fedora-Live-Workstation-x86_64-23-10.iso"
id: 831
incognito: false
mime: "application/x-iso9660-image"
paused: true
referrer: ""
startTime: "2016-01-27T07:27:33.993Z"
state: "in_progress"
totalBytes: 1469054976
url: "https://download.fedoraproject.org/pub/fedora/linux/releases/23/Workstation/x86_64/iso/Fedora-Live-Workstation-x86_64-23-10.iso"
bytesReceived: 147793
canResume: false
danger: "safe"
error: "USER_CANCELED"
exists: true
fileSize: 0
filename: ""
id: 829
incognito: false
mime: "text/plain"
paused: false
referrer: "https://github.com/metafizzy/flickity/blob/master/dist/flickity.pkgd.js"
startTime: "2016-01-25T01:54:14.860Z"
state: "interrupted"
totalBytes: 0
url: "https://github.com/metafizzy/flickity/raw/master/dist/flickity.pkgd.js"
canResume: false
danger: "safe"
error: "USER_CANCELED"
exists: true
fileSize: 0
filename: ""
id: 829
incognito: false
mime: "text/plain"
paused: false
referrer: "https://github.com/metafizzy/flickity/blob/master/dist/flickity.pkgd.js"
startTime: "2016-01-25T01:54:14.860Z"
state: "interrupted"
totalBytes: 0
url: "https://github.com/metafizzy/flickity/raw/master/dist/flickity.pkgd.js"
byExtensionId: "ibnmdmaffpbfbkealmfgpldjbompbonb"
byExtensionName: "コードそーにゅー。"
bytesReceived: 152173
canResume: false
danger: "safe"
endTime: "2016-01-12T03:28:38.089Z"
exists: true
fileSize: 152173
filename: "C:\Users\lyze\Downloads\trailing_comma_proposal.pdf"
id: 816
incognito: false
mime: "application/octet-stream"
paused: false
referrer: "http://kangax.github.io/compat-table/es7/"
startTime: "2016-01-12T03:28:37.515Z"
state: "complete"
totalBytes: 152173
url: "https://github.com/tc39/tc39-notes/raw/master/es6/2014-09/trailing_comma_proposal.pdf"
byExtensionName: "コードそーにゅー。"
bytesReceived: 152173
canResume: false
danger: "safe"
endTime: "2016-01-12T03:28:38.089Z"
exists: true
fileSize: 152173
filename: "C:\Users\lyze\Downloads\trailing_comma_proposal.pdf"
id: 816
incognito: false
mime: "application/octet-stream"
paused: false
referrer: "http://kangax.github.io/compat-table/es7/"
startTime: "2016-01-12T03:28:37.515Z"
state: "complete"
totalBytes: 152173
url: "https://github.com/tc39/tc39-notes/raw/master/es6/2014-09/trailing_comma_proposal.pdf"
だいたい見たままです
incognito は incognitoモード(シークレットモード)でダウンロードしたかのフラグです
error はエラーがあったときだけ理由が入ってます
byExtensionId と byExtensionName は拡張機能からのダウンロードだと拡張機能の id と名前が入っています
これで検索できればいいのですが検索条件にはできないみたい
download
ダウンロードしますchrome.downloads.download({
url: "http://sample.net/sample.zip",
filename: "sample/sample.zip"
}, e => console.log(e))
url: "http://sample.net/sample.zip",
filename: "sample/sample.zip"
}, e => console.log(e))
コールバック関数の引数にはダウンロード ID が入ります
filename はパスを書けます
/ をつければフォルダを指定できます
フォルダがなければ作られます
ですが 基準のフォルダより上には行けません
ブラウザで設定した基準フォルダの中で好きなところにダウンロードできます
saveAs を true にすればユーザが保存先を選ぶダイアログが出せます
method に GET か POST を選べば GET/POST を切り替えられます
POST にするときは body に文字列を入れると POST でデータを送れます
header に {name: ....., value: .....} フォーマットのオブジェクトの配列を入れるとヘッダーを設定できます
ひとつのオブジェクトでキーに名前でバリューに値というよく見そう?なフォーマットではないです
ファイルがすでに存在してた場合のデフォルトは (1) などをつけてファイル名を被らないようにするものですが 変更できます
conflictAction に "uniquify" か "overwrite" か "prompt" を設定します
uniquify はデフォルトの設定でユニークするためにファイル名を変更します
overwrite は上書きで prompt はユーザが入力するダイアログを出します
被っていたら自動キャンセルってできないみたい
ダウンローダでまとめてダウンロードするときに毎回ダイアログ出してユーザがいちいちキャンセルって大変そう
pause, resume, cancel
ダウンロードID を指定して一時停止・再開・キャンセルしますvar did = 100
chrome.downloads.pause(did, () => console.log("download paused"))
chrome.downloads.pause(did, () => console.log("download paused"))
var did = 100
chrome.downloads.resume(did, () => console.log("download resumed"))
chrome.downloads.resume(did, () => console.log("download resumed"))
var did = 100
chrome.downloads.cancel(did, () => console.log("download canceled"))
chrome.downloads.cancel(did, () => console.log("download canceled"))
一時停止は再開できますがキャンセルは再開できないです
ダウンロードアイテムの canResume プロパティが true になってるものだけ再開できます
getFileIcon
ダウンロードアイコンを取得できますWindows でファイルの種類と関連付けているアイコンが取得できます
ファイルサイズが 32px か 16px のどちらかです
var did = 100
chrome.downloads.getFileIcon(did, {size:32}, e => console.log(e))
chrome.downloads.getFileIcon(did, {size:32}, e => console.log(e))
コールバック関数で受け取れる URL は base64 の文字列でした
そのまま img タグの src に設定して使えます
showDefaultFolder
ブラウザで設定しているダウンロードフォルダを開きますchrome.downloads.showDefaultFolder()
show
ダウンロードID を指定してそのファイルのダウンロード先フォルダを開きますダウンロードしたファイルが選択状態になっているので ファイルがいっぱいあってもすぐにどれかわかります
ダウンロード先がフォルダ階層設定していると 上の showDefaultFolder で開くフォルダと違うフォルダになります
var did = 100
chrome.downloads.show(did)
chrome.downloads.show(did)
open
ダウンロードID を指定してそのファイルを開きます普段ダウンロードした時に下に出てくるバーでファイルをクリックするのと一緒です
var did = 100
chrome.downloads.open(did)
chrome.downloads.open(did)
ファイルを直接開くのでもうひとつ "downloads.open" という permission が必要になります
manifest.json に追加してください
erase
ダウンロードリストから消しますダウンロードしたファイルは残ります
search と同じ条件で検索してヒットしたものをまとめて削除します
コールバック関数が受け取るのは 削除したもののダウンロードID の配列です
var did = 100
chrome.downloads.erase({id: did}, e => console.log(e))
chrome.downloads.erase({id: did}, e => console.log(e))
removeFile
ダウンロードしたファイルを削除しますerase と違ってファイルを削除です
こっちは 指定したダウンロードID で 1 つずつです
var did = 100
chrome.downloads.removeFile(did, e => console.log(e))
chrome.downloads.removeFile(did, e => console.log(e))
また 消すのはファイルだけでダウンロードリストには残ります
ダウンロードするときにフォルダを作成していたらこの削除でフォルダが空になってもフォルダは残ります
drag
使わないほうがいいかもしれませんvar did = 100
chrome.downloads.drag(did)
chrome.downloads.drag(did)
ondragstart の中で呼び出すと ダウンロード済みのファイルのドラッグを開始して別アプリケーションに持っていけるらしいです
ダウンローダで ダウンロード一覧のリストがあってリストの要素をドラッグすると 対応するダウンロードしたファイルをつかんだ動きをして エディタにドロップすると エディタでダウンロードしたファイルが開けるっていう使い方なんだと思うんです
ですが やってみるとダウンロードしたアイテムをドラッグできないですし それどころか気にせず別のソフトにドロップしたら Chrome がフリーズして強制終了することになりました
別環境でやってみても発生したのでたぶんこの機能の問題みたいです
setShelfEnabled
普通にダウンロードすると下にバーが出てきますが あれをなくしますインストールされてる拡張機能のどれかがオフに設定していたら全体でバーが表示されません
どれかがオフに設定している状態でオンにしようとしたらエラーになります
chrome.downloads.setShelfEnabled(false)
onChanged
ダウンロードアイテムの情報が変更されると起きるイベントですchrome.downloads.onChanged.addListener(delta => console.log(delta))
コールバック関数へは変化したところだけ渡されますポーズしたとき
id: 835
paused: Object { }
current: true
previous: false
canResume: Object { }
current: true
previous: false
paused: Object { }
current: true
previous: false
canResume: Object { }
current: true
previous: false
ダウンロード完了したとき
endTime: Object { }
current: "2016-01-27T08:48:59.805Z"
id: 835
state: Object { }
current: "complete"
previous: "in_progress"
current: "2016-01-27T08:48:59.805Z"
id: 835
state: Object { }
current: "complete"
previous: "in_progress"
削除した時
exists: Object { }
current: false
previous: true
id: 230
current: false
previous: true
id: 230
残り時間やダウンロード済みサイズが変わってもこのイベントは起きないです
残り時間や進行状況を表示するなら自分で setInterval などで定期的に調べに行くしかなさそうです
search で取得したダウンロードアイテムのオブジェクトはダウンロードが進んでも変更されないので search で検索することを毎回する必要があります
まとめ
意外と機能は多めだったのでほとんど書いてますがすべての機能を書いてるわけじゃないです全機能をみたいなら最初にあるリンク先を見てください
COMMENT
コメント一覧 (2)
-
- 2016/05/18 18:44
-
大変興味深いトピックで、ありがとうございます。
で、質問なんのですが、例えば、
chrome.downloads.download({
url: "http://sample.net/sample.zip,
filename: "sample/sample.zip"
}, e => console.log(e))
などのスクリプト言語は何なのでしょうか?
javascriptと思い込んで、作例したら、=> でエラーがでました。
宜しくお願いします。
-
- 2016/05/22 21:29
-
コメントありがとうございます!
言語はJavaScriptですよ
=> は比較的最近の書き方です
ES2015(ES6)のアロー関数で調べてみてください
記事内容的にChromeで確認されているかと思いますけど Chromeだと半年以上前から動くようになってるはずですのでアップデートをちゃんとしていたら => 動くはずです
それと 私も今気づいたのですけど 2行目の url で閉じの「"」が抜けていました(すみません)
コピペしたのだとすると=> じゃなくてこっちが原因かもしれません