テクノロジー · 実用ガイド

qBittorrentのContentファイル一覧をCSVにする:ダウンロード設定は変更しない

1つのトレントのファイル応答を保存し、索引、ダウンロード除外項目、進捗の比率を保って表で確認します。

トレント概要、ファイル別API応答、ローカル一覧を比較するオリジナルのイラスト
オリジナルのイラスト:この手順のファイル別レコードはfiles応答から得ます。 Watch at Ease

トレント名の一覧は、そのトレント内部のファイル一覧とは違います。大きなContentツリーを表で検索し、「ダウンロードしない」項目も含めたい場合は、未取得ファイルが抜けるディレクトリー一覧ではなくファイル別の応答を使います。

以下は設定済みで通常の認証に成功しているローカルWebUIから既存トレントを読み、保存したJSONコピーをオフラインで変換する方法です。トレント追加、優先度変更、コンテンツ取得、ディスク上のファイル検証はしません。

対象トレントの正しい応答を保存する

自分のqBittorrent 5と、すでにログインできるローカルWebUIだけを対象にします。通常の認証と保護を維持してください。同じPCのアドレスが http://127.0.0.1:8080 ならそこへ通常どおりログインします。実際のポートに置き換え、未設定ならこの方法を中止します。サービスを公開したり認証を無効化したりしません。

同じログイン済みブラウザーで http://127.0.0.1:8080/api/v2/torrents/info を開き、対象の名前を探してhashフィールドをコピーします。同名があるなら正しいレコードを確認します。次に http://127.0.0.1:8080/api/v2/torrents/files?hash=YOUR_HASH のYOUR_HASHをその値に置き換えて開きます。ログイン時と同じホストとポートを使い、indexesを付けて一部だけに絞りません。

完全なJSON応答をfiles.jsonとしてローカル保存するか、元の応答全体をUTF-8のプレーンテキストにコピーします。必要なのはファイルオブジェクトの配列で、ログインページ、HTML表示用マークアップ、トレント概要配列ではありません。対象の識別情報と取得時刻を別途記録します。空配列はメタデータ未取得の場合もあり、対象不在や認証失敗を有効な空一覧と扱いません。

保存済みのファイルレコードを変換する

Python 3が導入済みならそのフォルダーで端末を開き、Windowsではpython3をpy -3に替えます。コマンドを半角の直線引用符を保った1行でコピーし、新しいCSV名を選びます。Pythonの-Oオプションは使いません。検証は出力を開く前に終わり、既存の出力は排他的作成で拒否します。

python3 -c "import csv,json,math,sys; r=json.load(open(sys.argv[1],encoding='utf-8-sig')); ok=lambda b:isinstance(b,dict) and type(b.get('index')) is int and b['index']>=0 and isinstance(b.get('name'),str) and type(b.get('size')) is int and b['size']>=0 and type(b.get('progress')) in (int,float) and math.isfinite(b['progress']) and 0<=b['progress']<=1 and type(b.get('priority')) is int and b['priority'] in (0,1,6,7); assert isinstance(r,list) and r and all(ok(b) for b in r) and len({b['index'] for b in r})==len(r), 'Expected nonempty unfiltered files array with unique indexes'; f=open(sys.argv[2],'x',encoding='utf-8-sig',newline=''); w=csv.writer(f); w.writerow(['index','name','size_bytes','progress_fraction','priority']); w.writerows([[b[k] for k in ('index','name','size','progress','priority')] for b in r]); f.close(); print(len(r),'file records exported')" "files.json" "content-files.csv"

5列はindex、name、size_bytes、progress_fraction、priorityです。indexは元のファイル索引で、新しい行番号ではありません。並べ替えても振り直さないでください。nameには相対パスが含まれます。進捗0.25は25%で、0.25%ではありません。優先度0は取得しない、1は通常、6は高、7は最高です。除外ファイル、0バイト、同じ基本ファイル名も含め、返された全項目を残します。

文字列として取り込みレコードを比べる

LibreOffice Calcでファイル > 開くとテキストCSVを選び、UTF-8、コンマ区切り、半角の二重引用符を文字列区切りに指定します。区切りの結合、空白の除去、数式の評価をオフにし、プレビューの5列をすべてテキストにします。画面が省略されるなら開く際にフィルター設定の編集を有効にします。=で始まる名前も数式にせず保持します。

表示された件数をヘッダーを除くCSVデータ行数と比較します。引用内のファイル名に改行があるため、物理的なテキスト行数を数えません。フィルターなしのContent表示と複数の完全な相対パス・元索引を比べ、除外項目も確認します。図の索引0と1は仮想例です。索引0は最初のファイルで、CSVのヘッダーや新しい表の行番号ではありません。並べ替えや抽出の前に未変更のマスターCSVを保管します。

エラーと範囲を正しく理解する

検証エラーは空・不正な入力、索引の重複、必要な名前・サイズ・進捗・優先度の欠落や不適合を示します。正しいfiles応答とメタデータ取得を確認し、検証を削って強制出力しません。既存出力のエラーには新しい名前を選びます。ディスクや書き込みの失敗では部分CSVが残る場合があり、正常な再実行と解析後の行数確認まで使いません。

これは取得時点のクライアントメタデータで、実ファイルの存在、バイトの完全性、ピアの可用性、復元できる再開バックアップを証明しません。項目と進捗は後から変わり、相対名は単独の絶対ディスクパスではありません。Unicode、コンマ、引用符、複数行、非連続索引、重複、ゼロ値、不正入力、上書き拒否の13件の人工データ検証を実行しました。実際のqBittorrentやブラウザー・Calc画面は試していません。JSONと取得メモを保管し、開示するつもりのメタデータだけを共有してください。

2つの元索引と優先度0をCSVに残すオリジナルのイラスト
オリジナルのイラスト:仮想索引0と1は変更せず、除外項目も残します。 Watch at Ease