diff --git a/2checkTvEps.py b/2checkTvEps.py new file mode 100755 index 0000000..68fbc7d --- /dev/null +++ b/2checkTvEps.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +#encoding:utf-8 +import os,re,sys + +def colour(text,colour="red"): + nocolour=False + if nocolour: # Colour no supported, return plain text + return text + #end if + + c = {'red':'[31m', + 'green':'[32m', + 'blue':'[34m', + } + CLR=chr(27)+'[0m' + if not colour in c.keys(): + raise ValueError("Invalid colour") + else: + return chr(27)+c[colour] + text + CLR + #end if +#end colour + +def getError(invalid,errorno): + """Gets all invalid files with supplied error number""" + ret = [] + for cur in invalid: + if cur['errorno'] == errorno: + ret.append(cur) + return ret +#end searchError + +################################### +# Name regexs +################################### +# Valid filenames, with episode name +# Should return 4 groups: +# Series name. +# Season number. +# Episode number# +# Episode name. (can be empty) +# Ignore filetype extension +# +# Show name - [01x01-02] - The Episode Name (Part 1) +# Show name - [01x23] - The Episode Name (Part 1) +# Show name - [01x23] - The Episode Name +r_with_ep_name = [ + re.compile("([-\w\d ]+) - \[(\d{2})x\d{2}\] - ([\w\(\) ]+)"), + re.compile("([-\w\d ]+) - \[(\d{2})x(\d{2}-\d{2})\] - ([\w\(\) ]+)"), + re.compile("([-\w\d ]+) - \[(\d{2})xSpecial\d{1,2}\] - ([\w\(\) ]+)"), + re.compile("([-\w\d ]+) - \[(\d{2})xExtra\d{1,2}\] - ([\w\(\) ]+)"), + re.compile("([-\w\d ]+) - \[(\d{2})] - ([\w\(\) ]+)"), +] + +################################### +# Valid filenames, but missing episode name +# +# Show name - [04x01] +r_missing_ep_name = [ + re.compile("([-\w\d ]+) - \[(\d{2})x\d{2}\]"), + re.compile("([-\w\d ]+) - \[(\d{2})x(\d{2}-\d{2})\]"), + re.compile("([-\w\d ]+) - \[(\d{2})xSpecial\d{1,2}\]"), + re.compile("([-\w\d ]+) - \[(\d{2})xExtra\d{1,2}\]"), +] + +# Valid path names +r_valid_path = [ + re.compile("/(.+?)/season (\d{1,2})$"), + re.compile("/(.+?)/season (\d{1,2})/extras$"), + re.compile(".+?/Misc") +] + +################################### +# Regex to match valid, but not-to-be-processed files (dot-files, folder.jpg artwork) +################################### +decrappify = [ + re.compile("(?=^[.]{1}.*)"), + re.compile("folder.jpg"), +] + +# Location to process +loc = "." # Runs from the current path + +################################### +# Find all valid files +################################### +allfiles=[] +for (path,dirs,files) in os.walk(loc): + for file in files: + filename = os.path.join(path,file) + allfiles.append( str(filename) ) +#end for f + +files = [x for x in allfiles if os.path.isfile(x)] # only get files, not folders + +# Strip out dotfiles/folder.jpg +for current_file in allfiles: + current_file_path,current_file_name = os.path.split(current_file) + for cur_decrap in decrappify: + if cur_decrap.match(current_file_name): + files.remove(current_file) +#end for file + +files = [os.path.join(loc,x) for x in files] # append path to file name + +# Warn if no files are found, then exit +if files.__len__() == 0: + print colour('No files found','red') + sys.exit(0) + + +errors = { + 1:'malformed name', + 2:'missing epsiode name', + 3:'path is incorrect' +} +################################### +# Validate filenames +################################### + +valid = [] +invalid = [] + +for cur in files: + cpath,cfile = os.path.split(cur) + cfile,cext = os.path.splitext(cfile) + + for cur_checker in r_valid_path: + # Check if path is valid + check = cur_checker.findall(cpath) + if check: + break + else: + print "invalid path",cpath + invalid.append({'errorno':3, 'path':cpath,'filename':cfile, + 'cext':cext}) + #end for cur_checker + + for cur_checker in r_with_ep_name: + # Check if filename is valid (with ep name) + check = cur_checker.findall(cfile) + if check: + # Valid file name + valid.append({'path':cpath,'filename':cfile, + 'cext':cext}) + break # Found valid episode, skip to the next one + #end if + else: + for cur_checker in r_missing_ep_name: + # Check for valid name with missing episode name + check = cur_checker.findall(cfile) + if check: + invalid.append({'errorno':2, 'path':cpath,'filename':cfile, + 'cext':cext}) + break + #end if check + else: + # Doesn't match valid-name or missing-ep-name regexs, it's invalid + invalid.append({'errorno':1, 'path':cpath,'filename':cfile, + 'cext':cext}) + #end for cur_checker + #end for cur_checker +#end for + +################################### +# Show invalid names +################################### +for errorno,errordescr in errors.items(): + print errorno,errordescr,":" + print "*"*20 + for c in getError(invalid,errorno): + print c['filename']