◆ 通常のダウンロードと同じもの
  ◆ 拡張機能用の新しいものではない
◆ フォルダ階層指定したダウンロードできるのが便利
◆ 今ダウンロード済みサイズと残り時間を定期的に取得すればプログレスバーが作れる

拡張機能の API を見てると downloads というのがあります
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"
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"
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"

だいたい見たままです

incognito は incognitoモード(シークレットモード)でダウンロードしたかのフラグです
error はエラーがあったときだけ理由が入ってます
byExtensionId と byExtensionName は拡張機能からのダウンロードだと拡張機能の id と名前が入っています
これで検索できればいいのですが検索条件にはできないみたい

download

ダウンロードします
chrome.downloads.download({
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"))
var did = 100
chrome.downloads.resume(did, () => console.log("download resumed"))
var did = 100
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))

コールバック関数で受け取れる URL は base64 の文字列でした
そのまま img タグの src に設定して使えます

showDefaultFolder

ブラウザで設定しているダウンロードフォルダを開きます
chrome.downloads.showDefaultFolder()

show

ダウンロードID を指定してそのファイルのダウンロード先フォルダを開きます
ダウンロードしたファイルが選択状態になっているので ファイルがいっぱいあってもすぐにどれかわかります
ダウンロード先がフォルダ階層設定していると 上の showDefaultFolder で開くフォルダと違うフォルダになります
var did = 100
chrome.downloads.show(did)

open

ダウンロードID を指定してそのファイルを開きます
普段ダウンロードした時に下に出てくるバーでファイルをクリックするのと一緒です
var did = 100
chrome.downloads.open(did)

ファイルを直接開くのでもうひとつ "downloads.open" という permission が必要になります
manifest.json に追加してください

erase

ダウンロードリストから消します
ダウンロードしたファイルは残ります

search と同じ条件で検索してヒットしたものをまとめて削除します
コールバック関数が受け取るのは 削除したもののダウンロードID の配列です
var did = 100
chrome.downloads.erase({id: did}, e => console.log(e))

removeFile

ダウンロードしたファイルを削除します
erase と違ってファイルを削除です

こっちは 指定したダウンロードID で 1 つずつです
var did = 100
chrome.downloads.removeFile(did, e => console.log(e))

また 消すのはファイルだけでダウンロードリストには残ります
ダウンロードするときにフォルダを作成していたらこの削除でフォルダが空になってもフォルダは残ります

drag

使わないほうがいいかもしれません
var did = 100
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

ダウンロード完了したとき
endTime: Object { }
  current: "2016-01-27T08:48:59.805Z"
id: 835
state: Object { }
  current: "complete"
  previous: "in_progress"

削除した時
exists: Object { }
  current: false
  previous: true
id: 230

残り時間やダウンロード済みサイズが変わってもこのイベントは起きないです
残り時間や進行状況を表示するなら自分で setInterval などで定期的に調べに行くしかなさそうです
search で取得したダウンロードアイテムのオブジェクトはダウンロードが進んでも変更されないので search で検索することを毎回する必要があります

まとめ

意外と機能は多めだったのでほとんど書いてますがすべての機能を書いてるわけじゃないです
全機能をみたいなら最初にあるリンク先を見てください