rclone rcdを使ってrcloneをHTTP APIで操作する
rclone rcdという機能があり、rcloneをHTTP APIサーバーとして建てて操作する機能があるのだが、基本的にRemote Control / APIで操作することが想定されているようで、使うにあたって情報が少なすぎる。自分が斜め読みしてるだけなのかもしれないが…
とりあえず使い物になりそうなところまでは持っていけたため、メモっておく
以下ではrclone rcdがhttp://127.0.0.1:5572で立ってるものとします
ヘッダーは以下のものを前提とします
code:headers
Content-Type: application/json
(もし認証する場合)
Authorization: Basic btoa(user:pass)
ジョブの状態を取得する
rcdではほとんどの操作がジョブとして処理されるので、ジョブベースで操作を扱うことになる
ジョブ一覧を取るAPIもあるが、IDしか帰ってこないし、そもそもジョブ一覧を取る操作がジョブになるため、使い所はないと思う
code:job/status
POST http://127.0.0.1:5572/job/status
code:job/status/body.json
{"jobid":1}
code:job/status/resp.json
{
"duration": 0,
"endTime": "0001-01-01T00:00:00Z",
"error": "",
"finished": false,
"group": "job/9358",
"id": 9358,
"output": null,
"startTime": "2025-05-25T15:37:02.851944+09:00",
"success": false
}
MaxTransferで終了させた場合はsuccess: falseだがfinished: trueになる
コピーを開始する
rclone copyを行う操作
APIでは非同期操作が_async: true・オプション類は基本_config: {...}・フィルタ類は_filter: {...}としておけばよい
上ページで「Copy Options」に居るものは_configで、「Filter Options」に居るものは_filterとなる。ListingとImportantはどこなんだろう…
ケースはコマンドラインで--max-transferであればMaxTransfer: XXXとする
code:sync/copy
POST http://127.0.0.1:5572/sync/copy
code:sync/copy/body.json
{
"srcFs": "src:hogehoge",
"dstFs": "dest:piyopiyo",
"_filter": {
"MinSize": "1M",
"MaxSize": "50G",
},
"_config": {
"MaxTransfer": "1T",
"CutoffMode": "cautious",
"DryRun": true,
"Transfers": 6
},
"_async": true
}
code:sync/copy/resp.json
{"jobid":1}
このjobidを使ってジョブの状態を取得する。ただ進行状況について取れる情報はかなり限られているので、下記の方法で取る
進行状況を取得する
ジョブの状態から取れればいいのだが、取れないので、別のAPIでとってやる必要がある
code:core/stats
POST http://127.0.0.1:5572/sync/stats
code:core/stats/body.json
{}
code:core/stats/resp.json
{
"bytes": 114365570784,
"checks": 364,
"deletedDirs": 0,
"deletes": 0,
"elapsedTime": 5583.356247083,
"errors": 22,
"eta": 65702,
"fatalError": false,
"lastError": "multipart upload failed to upload part: Put \"https://upload.box.com/api/2.0/files/upload_sessions/XXXX\": context canceled",
"listed": 39034,
"renames": 0,
"retryError": true,
"serverSideCopies": 0,
"serverSideCopyBytes": 0,
"serverSideMoveBytes": 0,
"serverSideMoves": 0,
"speed": 126920429.17376095,
"totalBytes": 8453311268100,
"totalChecks": 364,
"totalTransfers": 6,
"transferTime": 3421.633135293,
"transferring": [
{
"bytes": 1198489600,
"dstFs": "dest:piyopiyo",
"eta": 2894,
"group": "job/8887",
"name": "abcd.txt",
"percentage": 4,
"size": 26950754100,
"speed": 8897190.566686004,
"speedAvg": 8897191.278353374,
"srcFs": "src:hogehogehoge"
},
{
"bytes": 1168015360,
"dstFs": "dest:piyopiyo",
"eta": 2369,
"group": "job/8887",
"name": "efg.bin",
"percentage": 5,
"size": 21258700096,
"speed": 8677238.123136077,
"speedAvg": 8479491.569715241,
"srcFs": "src:hogehogehoge"
}
],
"transfers": 4
}
transferringは転送しているファイルがないとキーごと消えるため注意
bytesが転送量なので、ここの前後を比較するとどれぐらい転送したか分かる。dryrunでも加算されるので注意
groupを使ってやると転送ジョブ単位での転送量がわかりそう
あとlastErrorとpercentageめっちゃ嘘な気がする(エラー出ていないのに以前出たエラーにコロコロ変わる)
#rclone #rclone_rcd