PulsedMediaの共有シードボックスにシードされていないトレントをリストする方法
rtorrentは非常に人気のある Torrent アプリであり、Web UI である rutorrent とともに使用されることが多いです。
しかし、rtorrent/rutorrentは時代遅れになりつつあります。PulsedMediaのスタッフの一人が私に言ったように、「rTorrentは残念ながらここ8年ほどほとんど放置された状態です。勢いがあるからこそ、生き残っているのです。」
rutorrent の残念な問題の一つは、シードボックスがビジー状態の場合(場合によってはそうでない場合でも)、rutorrent でトレントを削除するコマンドを発行しても、rtorrent(トレントを管理する実際のエンジン)が削除に失敗することです。これは特に、クリーンアップに数百、数千のファイルが含まれる大規模なトレントの場合に顕著で、ほぼ確実に失敗します。
このような場合、時間の経過とともにファイルが蓄積され、ギガバイトまたはテラバイトのデッドスペースが発生する可能性があります。
これを解決するのに役立つツールがいくつかあります。その一つがautotorrent2で、シードされていないファイルをリストアップしてクリーンアップできます。ただし、このツールはソケットポート経由でrtorrentにアクセスする必要がありますが、 PulsedMediaはソケットファイルを使用するため、このポートはサポートされていません。
シードされていないトレントをリストアップする簡単なスクリプトを作成しました。完璧ではありませんが、目的は達成できます。rtorrent API と通信する代わりに、rtorrent セッションディレクトリを調べます。
こんにちは!ちょっと休憩して、 PulsedMediaについてお話しましょう!この投稿はPulsedMediaのスポンサーではありませんし、彼らからレビューを受けたわけでも、プロモーションの依頼を受けたわけでもありません。私は何年もPulsedMediaのサービスを利用している、ただの満足している顧客です。多くのVPSや専用サーバーでトレントは利用できますが、私はI/Oとネットワーク負荷に慣れている専用のシードボックスプロバイダーを好みます。PMは私にとって素晴らしい仕事をしてくれました。月額3.99ユーロという低価格で始めることができます。しかも、25230では頻繁に特別オファーを実施しています。
さて、シードボックスに戻りましょう。
セッションディレクトリには、アクティブにシードされたファイルごとに .torrent ファイルがあります。rtorrent はこれらのファイルのクリーンアップをはるかに効率的に実行します。削除はシステムコール 1 回だけで済み、ディレクトリツリーをたどる必要もありません。数百ものトレントを追加・削除した後でも、私のトレントは rutorrent と完全に同期していました。このディレクトリを調べてシードされたファイルの一覧を取得し、データディレクトリの内容を確認して比較することができます。
各ソースのパスを比較しているので完璧ではないと言いましたが、同じパスを持つ 2 つのトレントが存在する可能性があります。
.torrent ファイルの実際の読み取りには、 torrent-parser を活用します。
セットアップするには、仮想環境を作成します。
python3 -m venv トレントパーサー cd ~/torrent-parser ./pip torrent_parser をインストール
スクリプトはこちらです。もちろん、先頭のシェバン(#!)行とディレクトリの場所はアカウントに合わせて調整してください。最小限の修正で、どのプロバイダのrtorrent環境でも動作するはずです。
#!/home/raindog308/torrent-parser/bin/python osをインポートし、再 torrent_parserをtpとしてインポートする torrent_dir = "/home/raindog308/session" data_dir = "/home/raindog308/data" データエントリ = {} os.listdir(data_dir) 内の data_entry の場合: data_entries[データエントリ] = True os.listdir(torrent_dir) 内の torrent_file の場合: re.search('\.torrent$',torrent_file) の場合: full_file = "{}/{}".format(torrent_dir,torrent_file) データ = tp.parse_torrent_file(full_file) 名前 = データ['情報']['名前'] 試す: del data_entries[名前] を除外する: print ("重複する可能性のあるトレントパス: {}".format(name)) sorted(data_entries.keys()) 内の data_entry の場合: 印刷(データ入力)
真のPython 専門家なら、おそらくこれをもっと短い構文で書き直すことができるでしょうが、それでも動作します。