diff options
Diffstat (limited to 'bin/torrentSort.py')
-rw-r--r-- | bin/torrentSort.py | 220 |
1 files changed, 0 insertions, 220 deletions
diff --git a/bin/torrentSort.py b/bin/torrentSort.py deleted file mode 100644 index e284a88..0000000 --- a/bin/torrentSort.py +++ /dev/null @@ -1,220 +0,0 @@ -#! /usr/bin/python -# simple python script to sort torrents -# modifications by xkonni -# - added folder sorting -# - added htdigest authorisation -# - fixed some minor glitches -# -# original version by jonassw from -# http://forum.xbmc.org/showthread.php?t=60749 - -# << DOCUMENTATION -# -# i) lighttpd configuration for htdigest -# server.modules += ( "mod_auth" ) -# auth.backend = "htdigest" -# auth.backend.htdigest.userfile = "/etc/lighttpd/auth" -# auth.debug = 2 -# auth.require = ( "/RPC2" => -# ( -# "method" => "digest", -# "realm" => "REALM", -# "require" => "valid-user" -# ) -# ) -# ii) i recommend starting this with a basic cron job you may find other -# suggestions like when rtorrent finishes hashing, but for me this caused -# lockups when starting rtorrent (as all downloads return hash_ok) -# -# */5 * * * * for i in /mnt/torrent/tv/*; do torrentSort.py $i > /dev/null; done -# -# DOCUMENTATION >> - - -import xmlrpclib, os, sys, re, shutil - - -class HTTPSDigestTransport(xmlrpclib.SafeTransport): - """ -Transport that uses urllib2 so that we can do Digest authentication. -Based upon code at http://bytes.com/topic/python/answers/509382-solution-xml-rpc-over-proxy -""" - - def __init__(self, username, pw, realm, verbose = None, use_datetime=0): - self.__username = username - self.__pw = pw - self.__realm = realm - self.verbose = verbose - self._use_datetime = use_datetime - - def request(self, host, handler, request_body, verbose): - import urllib2 - - url='https://'+host+handler - if verbose or self.verbose: - print "ProxyTransport URL: [%s]"%url - - request = urllib2.Request(url) - request.add_data(request_body) - # Note: 'Host' and 'Content-Length' are added automatically - request.add_header("User-Agent", self.user_agent) - request.add_header("Content-Type", "text/xml") # Important - - # setup digest authentication - authhandler = urllib2.HTTPDigestAuthHandler() - authhandler.add_password(self.__realm, url, self.__username, self.__pw) - opener = urllib2.build_opener(authhandler) - - #proxy_handler=urllib2.ProxyHandler() - #opener=urllib2.build_opener(proxy_handler) - f=opener.open(request) - return(self.parse_response(f)) - - -def adoptionCandidates(basedir, filename): - dirs = filter(lambda x : os.path.isdir(os.path.join(basedir, x)), os.listdir(basedir)) - - #set filename to lowercase for string comparisons - filename=filename.lower() - - ignoredPhrases = ['-','_'] - - candidates = [] - for dir in dirs: - dirParts = dir.split() - score = 0 - requiredScore = 0 - - for part in dirParts: - if ignoredPhrases.count(part) > 0: - continue - requiredScore = requiredScore + 1 - - #force lower case for string comparison. - part=part.lower() - # replace "'" with "" and add word to list - repPart = part.replace('\'','') - if repPart != part: - dirParts.append(repPart) - requiredScore -= 1 - if filename.find(part) >= 0: - score = score + 1 - if score == requiredScore: - candidates.append( (os.path.join(basedir, dir), score) ) - - return candidates - -def getSeasonNumber(filename): - patterns = [ - '.*S(\d+)E(\d+).*', - '.*S(\d+)(\.)?E(\d+).*', # hopefully matches series.s01.e05.avi - '(\d+)x(\d+).*', - '(\d+)(\d+)(\d+).*' - # commented out regex thought below Season was '4' not 14. Def better way of doing that - #top_gear.14x04.720p_hdtv_x264-fov.mkv - #'.*(\d+)x(\d+).*' - ] - - for pattern in patterns: - p = re.compile(pattern, re.I) - g = p.findall(orphanFile) - if len(g) > 0: - season = int(g[0][0]) - return season - return None - - -def getRtorrentId(filename): - downloads = rtorrent.download_list('') - for dl in downloads: - rfile = rtorrent.d.get_base_filename(dl) - if rfile == filename: - return dl - -# << CONFIGURATION -# i) FOLDER SETTINGS -showLocations = ['/mnt/media/tv'] -allowedSourceLocation = '/mnt/media/torrent/complete/tv' - -# ii) CONNECTION SETTINGS -# - using htdigest authorisation -digestTransport = HTTPSDigestTransport("username", "password", "realm") -rtorrent = xmlrpclib.ServerProxy('http://localhost',transport=digestTransport) -# - not using authorisation -# rtorrent = xmlrpclib.ServerProxy('http://localhost') - -# CONFIGURATION >> - -print '--------------- BEGIN ---------------' -orphanFile = sys.argv[1] -if os.path.isdir(orphanFile): - (fpath, fname) = os.path.split(orphanFile) - fname = os.path.relpath(orphanFile, allowedSourceLocation) - -else: - (fpath, fname) = os.path.split(orphanFile) -print 'File path: %s' % fpath -print 'File name: %s' % fname - -candidates = [] - -if not orphanFile.startswith(allowedSourceLocation): - print 'STOP! This file is not located in %s' % allowedSourceLocation - exit() - -print 'Attempting to find a home for file %s' % orphanFile - -for location in showLocations: - candidates.extend(adoptionCandidates(location, fname)) - -candidates.sort(lambda (da, sa), (db, sb): sb-sa) - -if len(candidates) <= 0: - print 'No one wanted this file :(' - exit() - -for (dir, score) in candidates: - print 'Candidate: %s with score %i' % (dir, score) - -print 'Winner is %s with score %i' % candidates[0] - -if os.path.isdir(orphanFile): - finaldir = candidates[0][0] - -else: - # Determine Season and Episode number - season = getSeasonNumber(fname) - if not season: - print 'STOP! Season could not be determined.' - exit() - - print 'Season was determined to be %i' % season - finaldir = os.path.join(candidates[0][0], 'Season %s' % season) - - # Check if season folder is present - if not os.path.isdir(finaldir): - print 'Season dir doesn\'t exist. Creating now' - os.mkdir(finaldir) - - if os.path.isfile(os.path.join(finaldir, fname)): - print 'error: file already exists, exiting' - sys.exit(1) - - print 'Will move file to %s' % finaldir - - -print 'Requesting id from rtorrent' -rid = getRtorrentId(fname) -print '%s was resolved to rtorrent id: %s' % (fname, rid) - -print 'Pausing rtorrent' -rtorrent.d.pause(rid) - -print 'Updating rtorrent' -rtorrent.d.set_directory(rid, finaldir) - -print 'Moving file' -shutil.move(orphanFile, finaldir) - -print 'Resuming rtorrent' -rtorrent.d.resume(rid) |