RSSフィードとトレント

トレントファイルのRSSフィードにより、古き良きファイルエコー会議Fidoを置き換えることができました。 彼らによると、事前に選択されたトピックの新しいファイルは「自分でやってきた」、つまり サイトのレビューからではなく、到着したファイルを分析することで、新製品について知ることができました。



この便利さを説明することは困難です。 同じYouTubeを考えますが、実際のFullHD(YouTubeがHDと呼ぶのではなくFullHD)を独自の便利なプレーヤーで、ラグや広告なしで...自由時間に、コンピューターはすべての新しいアイテムを自分でダウンロードします。外から見るもの(そして釘付けするもの)を選択します。 インターネットの許容できない浪費、速度の増加とトラフィックの関税のほぼ普遍的な廃止によって近年になって利用可能になった贅沢。



どのように機能しますか?



トラッカーに付随するサイト(mononova、rutracker、bakabt、thepiratebay、animesuki、demonoidなど)には、 フィード(新しいトレントファイルへのリンクを含むRSS [wiki]形式のページ)を生成する機能があります。



通常、同時に正確に興味のあるものをフィルタリングすることが可能です(適切なRSSを選択する場合、サイト上で直接)。 たとえば、tokyotoshoを使用すると、関心のあるファイルタイプtokyotosho.info/rss_customize.phpを選択して正しいRSSリンクを作成できます。



良いケースでは、リンクは急流ファイルになります。 悪い-htmlページへのリンク。このページには、torrentファイルへのリンクが既に存在します。 (実装セクションでこの微妙な意地悪について説明します)。



その後、すべてが簡単です:特定のクライアント(組み込みのRSSまたは専用プログラムを備えたトレントクライアント)は、RSSを定期的にダウンロードし、そこからトレントファイルをダウンロードし、トレントのコンテンツをダウンロードします(または、ダウンロードのためにトレントクライアントに転送します)。 RSSはN分に1回(私にとっては1時間に1回)ダウンロードされ、ファイルは自動的にディスクに表示されます。





潜在的な問題







理論モデル



完全に、私はそのようなものを見たことがないので、「真空中の球体モデル」と考えることができます。



  1. RSSサーバーは、ユーザーごとにすべてのフィードを個別にダウンロードします。 フィードはダウンロードクライアントに渡されます。
  2. ダウンロードクライアントはトレントファイルをダウンロードします。
  3. クライアントは、繰り返しの不快感に基づいてフィルタリングするために、ダウンロードしたトレントファイルを送信します
  4. フィルタリング後、トレントファイルはサーバーモードでトレントクライアントに転送されます。サーバーモードは、ユーザーの複数のキューをサポートし、異なるユーザーから「同一の」ものを見つけて2回ダウンロードしないようにします。
  5. ダウンロードの最後に、ハードリンクのあるファイルがユーザーの受信ボックスに配置され、コピーがサイディングの終わりまでトレントクライアントの個人用のギブレットに保存されます。
  6. トレントクライアントは、各ユーザーにWebフェイスまたはリッチアプリケーションインターフェイス(より良い両方)を提供します




実用的な実装



(Linuxの場合)



私の現在の実装は、望ましい実装からはほど遠いものであり、ワークロード、機能、および利便性の点で妥協であるとすぐに言わなければなりません。



最初はRSSです。 このためにrsstailパッケージと-N1lスイッチを使用します(RSSテールを印刷するだけです)。 次に、「htmlリンク」の問題を解決します。wgetで、リンクからすべてを再帰的にダウンロードできます(ネストの深さは1なので、リンクが急流の場合、遠くに行かず、再帰はありません)。 また、トレントをファイルとしてではなく、Content-Dispositionヘッダーで動的に形成することによってnyaatorrentが作成するという1つの愚かな問題も解決します。



一般的な行は次のようになります。



 rsstail -u http://www.nyaatorrents.org/?page=rss\&catid=1\&subcat=37 -N1l | grep http | wget -i--r -l 1 -nd --content-disposition -Aトレント> / dev / null 2> / dev / null


自然な怠lazのため、フィード処理のリストを書くのは面倒でした。 それは必要ですが。 そのため、スクリプトでは、すべてのトラッカーに対して同じタイプの行があり、アドレスのみが異なります。



私は(可能な限り)プライベートトラッカーを使用せず、マシン上に複数のユーザー(少なくともトレントユーザー)がないため、この機能で十分です。



すべてのトレントは/ srv / unsorted-torrentsにダウンロードされます。 ここから、それらは「余分なものを取り除く」方法でフィルタリングされます(非常に原始的な検索フィルタリングがあります)。 そして運ぶ。



繰り返しをキャッチするプロセスは、もう少し興味深いものです。 私は、自分で作成したsinglemvプログラムを使用します。このプログラムは、そのようなファイルが以前に存在したかどうかにかかわらず、非常にコンパクトな形式に見えます。 また、ファイルが存在しないという条件でのみ転送します(各転送後に、反復データベースが更新されます)。



その後、/ srv / unsorted-torrentsで余分なものはすべて打ち破られます。



トレントは/ srv / torrents-queueディレクトリに転送されます。このディレクトリは、トレントクライアントのピックアップフォルダに割り当てられます。 私の場合、これは大洪水ですが、原則として、このスキームはどのトレントクライアントでも動作するはずです。



今後の計画



すでにC lstorrentで記述されていますが、正しいバインディングはありませんが(Pythonバージョンと比較すると、3倍のメモリ節約と10倍の速度)、トレントのコンテンツを表示できます。



遠い将来、gattaiプロジェクト(アルファ版の状態に到達することはありません)は、作品の名前が同じである異なるリリース/翻訳者のファイルを決定し、自動的にそれらの中から最高の品質を選択します。



顔の質問は完全に解決されていません。 一方では、本格的なダウンロードサーバーが必要です。他方では、完全に楽しい洪水の顔を失いたくありません。



なぜこれらすべての困難なのですか?



1日を失ってから1時間で飛行する方が良いでしょう。



私の地域でこのシステムを2月の1月頃に作成し終えた後、ほぼ半年間、システムは問題も苦情もなく動作しており、新しいアイテムをきちんと折りたたんで受け入れています。 さらに、何らかの理由で大洪水で問題が発生した場合(たとえば、数週間ダウンロードできない低速のトレントのパックによるプラグ)、トレントファイルは引き続き収集されます。 「フィード」の損失は発生しません。 (これが、このようなスキームがトレントクライアントに組み込まれたフィード自動エンコーダーよりも興味深い理由です)。



UPD:最も重要なこと、singlemvスクリプトを忘れました:



#!/usr/bin/python import sys,os, cPickle #minimalistic command line: #1st argument - memory file #2nd - pre-last - files to be moved #last - destignation (where to be moved) def singlemv(memory,from_list,to): #return new memory mode to_move=frozenset(from_list) - memory errors=set() for f in to_move: try: os.rename(f, os.path.join(to,os.path.basename(f))) except: print "error move %s to %s", f, to errors.add(f) return memory|(to_move-errors) def __main__(): if len(sys.argv)<4: print "Usage: singlemv.py memory_file from to" exit(-1) try: memory_file=file(sys.argv[1],"r") memory=cPickle.load(memory_file) memory_file.close() if type(memory) != type (frozenset()): print "bad memory file" exit(1) except IOError, OSError: memory=frozenset() newmem=singlemv(memory,sys.argv[2:-1],sys.argv[-1]) memory_file=file(sys.argv[1],"w") cPickle.dump(newmem,memory_file) memory_file.close() __main__()
      
      





プログラムの魅力は、行to_move=frozenset(from_list) - memory



(セットの違い)にあります。



All Articles