rutracker.orgからダウンロードしたファイルの名前を変更する

シンプルだが非常に便利な小さなスクリプトを共有したい-ダウンロードしたファイルをグループに分けてレンダリングするので、ファイルはトレントトラッカーWebサイトのページから読みやすい名前になります。

その結果、 "God.Bless.America.2011.HDTVRiP720.mkv"



代わりに、 "God.Bless.America.2011.HDTVRiP720.mkv"



", God Bless America ( Bobcat Goldthwait) (2011) , , , , HDTVRip-AVC.mkv"



という名前のファイルを取得します", God Bless America ( Bobcat Goldthwait) (2011) , , , , HDTVRip-AVC.mkv"





トピックの続きコンピューターをきちんと片付けることはできますか?



一般に、これがスクリプトの動作です。ダウンロードディレクトリを検索し、ダウンロードしたファイルとそれに対応する.torrentファイルを検索します。 次に、.torrentファイルからrutracker.orgからページURLを取得し、このページをロードしてダウンロードの名前を取得します。 次に、受信したテキストに基づいて、スクリプトはダウンロードしたファイルの名前を変更します(名前を変更する代わりに、ファイルを別のディレクトリにコピーするか、リンクを転送または作成するかを選択できます)。



スクリプトを正常に動作させるには、Python 3と、少し調整したuTorrentクライアントが必要です。

環境設定->その他-> .torrentファイルの保存場所:

ここでは、uTorrentが.torrentファイルをコピーするディレクトリを指定する必要があります。 実際のところ、uTorrentは、.torrentファイルをこのディレクトリにコピーするときに、ダウンロードしたファイルと同じ名前を付けます。 私が実際に利用したこと。

スクリプトでは、このディレクトリはTORRENT_DIRとして指定する必要があります。



また、ダウンロードしたINPUT_DIRファイルをスクリプトが検索するディレクトリを登録する必要があります。

そして、スクリプトがファイルをコピーする(ハードリンクを転送または作成する)ディレクトリ、つまりOUTPUT_DIR。



MOVE_ALGORITHM変数を使用して、ファイル転送アルゴリズムのいずれかを指定できます。





 # -*- encoding: utf-8 -*- import os import re import urllib.request import shutil import sys import ctypes INPUT_DIR = 'D:/Downloads/uTorrent/Completed' OUTPUT_DIR = 'D:/Video/Movies' TORRENT_DIR = 'D:/Downloads/uTorrent/torrent' MOVE_ALGORITHM = 'link' def GetMoveAlgorithms(): return {'move' : MoveFile, 'copy' : CopyFile, 'link' : CreateHardLink} def Print(msg): msg = msg.encode('cp866', 'replace') msg = msg.decode('cp866') print(msg) def GetTorrentFilePath(fileName): filePath = os.path.join(TORRENT_DIR, fileName + '.torrent') if not os.path.exists(filePath): Print('Skiped, .torrent is not found: "%s' % filePath) return None return filePath def GetTrackerUrl(torrentFilePath): try: torrentFile = open(torrentFilePath, 'r', encoding='ascii', errors='replace') fileData = torrentFile.read() trackerUrlLen, trackerUrl = re.search(r'comment([0-9]{2}):(.+)', fileData).groups() trackerUrl = re.search(r'(.{' + trackerUrlLen + '})', trackerUrl).groups()[0] return trackerUrl except: Print("Error, can't extract tracker url from .torrent file %s" % torrentFilePath) return None def LoadTrackerPage(trackerUrl): try: response = urllib.request.urlopen(trackerUrl) htmlPage = response.read() except: Print("Error, Can't load tracker page '%s'" % trackerUrl) return None htmlPage = htmlPage.decode('cp1251') return htmlPage def PrepareFileName(fileName): try: #remove special symbols fileName = re.sub(r'[\\/:"\*?<>|]+', '', fileName, 0, re.UNICODE) #remove repeating spaces fileName = re.sub(r'[ ]+', ' ', fileName, 0, re.UNICODE) fileName = fileName.strip() except: Print("Error, can't prepare file name '%s'" % fileName) return None return fileName class FileInfo: pass def ParseTrackerPage(htmlPage): try: pageTitle = re.search(r'<title>(.+?) :: .+?</title>', htmlPage, re.UNICODE).groups()[0] except: Print("Error, Can't parse <title>") return None fileInfo = FileInfo() fileInfo.name = "" fileInfo.year = "" fileInfo.descr = "" try: fileInfo.name, fileInfo.year, fileInfo.descr = re.search(r'(.+?) \[([0-9]{4}).*?, (.+?)\]', pageTitle, re.UNICODE).groups() except: Print("Warning, Can't parse page title: %s" % pageTitle) try: fileInfo.name, fileInfo.year, fileInfo.descr = re.search(r'(.+?)([0-9]{4}).*?, (.+?)$', pageTitle, re.UNICODE).groups() except: Print("Warning, Can't parse page title: %s" % pageTitle) fileInfo.name = pageTitle return fileInfo def GetDataFromTorrent(fileName): torrentFilePath = GetTorrentFilePath(fileName) if not torrentFilePath: return None trackerUrl = GetTrackerUrl(torrentFilePath) if not trackerUrl: return None htmlPage = LoadTrackerPage(trackerUrl) if not htmlPage: return None return ParseTrackerPage(htmlPage) def PrepareNewFileName(fileName, fileInfo): tmp, ext = os.path.splitext(fileName) toPrepare = fileInfo.name + ' (' + fileInfo.year + ') ' + fileInfo.descr cleanName = PrepareFileName(toPrepare) newFileName = cleanName + ext return newFileName def MoveFile(src, dst): shutil.move(src, dst) def CopyFile(src, dst): if os.path.isdir(src): for fileName in os.listdir(src): if not os.path.exists(dst): os.mkdir(dst) subSrc = os.path.join(src, fileName) subDst = os.path.join(dst, fileName) CopyFile(src, dst) else: if not os.path.exists(dst): shutil.copy2(src, dst) def CreateHardLink(src, dst): CreateHardLinkW = ctypes.windll.kernel32.CreateHardLinkW CreateHardLinkW.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_void_p) CreateHardLinkW.restype = ctypes.c_int if os.path.isdir(src): for fileName in os.listdir(src): if not os.path.exists(dst): os.mkdir(dst) subSrc = os.path.join(src, fileName) subDst = os.path.join(dst, fileName) CreateHardLink(subSrc, subDst) else: if not os.path.exists(dst): if CreateHardLinkW(dst, src, 0) == 0: raise IOError def main(): Print('Hello, Find downloads in "%s" :' % INPUT_DIR) totalCount = 0 processedCount = 0 for fileName in os.listdir(INPUT_DIR): totalCount = totalCount + 1 Print('Process a file: "%s"' % fileName) fileInfo = GetDataFromTorrent(fileName) if fileInfo is None: continue sNewFileName = PrepareNewFileName(fileName, fileInfo) if sNewFileName: oldFilePath = os.path.join(INPUT_DIR, fileName) newFilePath = os.path.join(OUTPUT_DIR, sNewFileName) try: GetMoveAlgorithms()[MOVE_ALGORITHM](oldFilePath, newFilePath) processedCount = processedCount + 1 except: Print("Error, Can't move file from %s to %s" % (oldFilePath, newFilePath)) Print("%d friles were moved from %d total found files" % (processedCount, totalCount)) if __name__ == "__main__": main()
      
      





スクリプトはWindows 7 x86およびWindows 7 x64でテストされました

理論的には、スクリプトをLinuxに移植することもできます。



このスクリプトはrutracker用に設計されていますが、おそらく他のサイトでも機能します。

少なくともファイルで終了した後。



htmlページをダウンロードするには、urllib2ライブラリを使用しました。

.torrentファイルとhtmlの解析には、正規表現を使用しました。

Pythonで使用するのに非常に便利であることがわかりました。

原則として、htmlの解析にはcssセレクターを使用する方が適切ですが、現時点では機能します。



Pythonは私の主要言語ではないので、経験豊富な開発者のアドバイスを喜んでいます。



アップデート1:

ファイルGod.Bless.America.2011.HDTVRiP720.mkv



した例で納得がいかない場合は、rutrackerの上位ファイルのリストを提供します。

私に関しては、これらの名前のいずれかに隠れている映画の種類を理解するまで、あなたは目と頭を壊すことができます。

当然、AllMyMoviesやMovienizerなどのカタログ作成プログラムは、IMDBおよびKinopoiskデータベースでこれらのファイルに関する情報を自動的に見つけることはできません。



  1. Na_grani_DVDRp_ [rutracker.org]_by_Inh.avi
  2. Ohotniki za golovani.chopper887.mkv
  3. Shvatka.chopper887.mkv
  4. prizrachnyi.gonschik_2.2012.hdrip.ac3.1450mb.by.riperrr.avi
  5. Dom_grez_BDRip_dub_ [rutracker.org] _by_Scarabey.avi
  6. Lubov.zhivet.tri.goda.2011.BDRip.avi
  7. Nepricosaemie.chopper887
  8. Missiya-Fantom.chopper887.avi
  9. Njanki.2012.O.DVDRip.IRONCLUB.avi
  10. samoubyici.2012.dvdrip.ac3.1450mb.by.riperrr.avi
  11. belyi.tigr.2012.dvdrip.ac3.2050mb.by.riperrr.avi
  12. Zhila.byla.odna.baba.2011.BDRip.1.46.avi
  13. svidanie.2012.dvdrip.ac3.1450mb.by.riperrr.avi
  14. Moy.Paren.Angel.BDRip.avi
  15. Visotskiy_Spasibo_Chto_Jivoy_2011_DVDRip_1.46_Menen.avi
  16. 不適切なピープル_1.46.avi
  17. Den.vyborov.2007.avi
  18. shapito.shou_1.2010.hdrip.ac3.1450mb.by.riperrr.avi
  19. belyi.tigr.2012.dvdrip.ac3.1450mb.by.riperrr.avi
  20. 2日_1.46.avi




Update2:

コメントの提案に従って、スクリプトを更新することにしました。

  1. Python 3にアップグレードされました
  2. 分離された入力ディレクトリと出力ディレクトリ
  3. NTFS用のハードリンク作成のサポートを追加
  4. ファイルのコピーのサポートが追加されました



All Articles