0
+# Automatic TV episode namer.
0
+# Uses data from www.thetvdb.com via tvdb_api
0
+from optparse import OptionParser
0
+from tvdb_api import tvdb
0
+config['with_ep_name'] = '%(showname)s - [%(seasno)02dx%(epno)02d] - %(epname)s.%(ext)s'
0
+config['without_ep_name'] = '%(showname)s - [%(seasno)02dx%(epno)02d].%(ext)s'
0
+config['name_parse'] = [
0
+ ''', re.IGNORECASE|re.VERBOSE ),
0
+ ''', re.IGNORECASE|re.VERBOSE ),
0
+ \D''', re.IGNORECASE|re.VERBOSE ),
0
+config['valid_filename_chars'] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@£$%^&*()_+=-[]{}\"'.,<>`~? "
0
+ for sf in os.listdir(x):
0
+ newpath = os.path.join(x,sf)
0
+ if os.path.isfile(newpath):
0
+ allfiles.append(newpath)
0
+ elif os.path.isfile(x):
0
+def processNames(names):
0
+ filepath,filename = os.path.split( f )
0
+ filename,ext = os.path.splitext( filename )
0
+ for r in config['name_parse']:
0
+ match = r.match(filename)
0
+ showname,seasno,epno = match.groups()
0
+ showname = showname.replace("."," ").strip()
0
+ seasno,epno = int(seasno), int(epno)
0
+ allEps.append({ 'showname':showname,
0
+ print "Invalid name %s"%(f)
0
+ orig_ext = cfile['ext']
0
+ cfile['ext'] = cfile['ext'].replace(".","",1)
0
+ n = config['with_ep_name'] % (cfile)
0
+ n = config['without_ep_name'] % (cfile)
0
+ cfile['ext'] = orig_ext
0
+ return ''.join( [c for c in name if c in config['valid_filename_chars']] )
0
+def renameFile(oldfile,newfile,force=False):
0
+ new_exists = os.access(newfile,os.F_OK)
0
+ sys.stderr.write("New filename already exists.. ")
0
+ sys.stderr.write("overwriting\n")
0
+ os.rename(oldfile,newfile)
0
+ sys.stderr.write("skipping\n")
0
+ os.rename(oldfile,newfile)
0
+ parser = OptionParser()
0
+ parser.add_option("-d","--debug",action="store_true",default=False,dest="debug", help="Show debugging info")
0
+ parser.add_option("-b","--batch",action="store_false",dest="interactive",help="Selects first search result, requires no human intervention once launched",default=False)
0
+ parser.add_option("-i","--interactive",action="store_true",dest="interactive",help="Interactivly prompt for show",default=True)
0
+ parser.add_option("-f","--force",action="store_true",default=False,dest="force",help="Skips checking if new filename already exists before renaming")
0
+ opts,args = parser.parse_args()
0
+ parser.error("No filenames or directories supplied")
0
+ allFiles = findFiles(args)
0
+ validFiles = processNames(allFiles)
0
+ if len(validFiles) == 0:
0
+ sys.stderr.write("No valid files found")
0
+ t = tvdb(debug = opts.debug, interactive = opts.interactive)
0
+ print "Starting processing files"
0
+ for cfile in validFiles:
0
+ epname = t[ cfile['showname'] ][ cfile['seasno'] ][ cfile['epno'] ]['name']
0
+ cfile['epname'] = epname
0
+ cfile['epname'] = None
0
+ sys.stderr.write("Episode name not found for %s" % ( cfile['fullpath']) )
0
+ newname = formatName( cfile )
0
+ newname = cleanName(newname)
0
+ oldfile = os.path.join( cfile['filepath'],cfile['filename'] + cfile['ext'] )
0
+ newfile = os.path.join( cfile['filepath'],newname )
0
+ print "Old name: %s" % ( cfile['filename'] + cfile['ext'] )
0
+ print "New name: %s" % ( newname )
0
+ rename_result = renameFile(oldfile,newname,force=opts.force)
0
+ print "..auto-renaming"
0
+ continue # next filename!
0
+ rename_result = renameFile(oldfile,newname,force=opts.force)
0
+ rename_result = renameFile(oldfile,newname,force=opts.force)
0
+if __name__ == "__main__":
Comments
No one has commented yet.