# newest that works with pyReScene: https://bitbucket.org/Gfy/pyrescene/
# original: http://rescene.wikidot.com/downloads#awescript
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# MADE BY GUBER - REMOVE THIS TO MAKE YOUR FIRST BORN MY LUNCH
# Copyright (c) 2009 guber
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
import os
import sys
import glob
import re
import fileinput
import subprocess
from optparse import OptionParser
"""
Installation guide for Linux
----------------------------
Install the following software:
- Mono (mono-runtime)
- Python3
Create a folder /home/user/bin
to create your own bin dir for executable files: (this step is not needed for all distros)
* Create the dir:
mkdir ~/bin
* To add a directory to your PATH, add
#my own executable files
PATH=$PATH:$HOME/bin
to your .bashrc file
Put the files awescript.py, srr.exe and srs.exe in ~/bin
http://pastebin.com/JMWKZqTt (version that always stores paths in the srr)
Create a file "awescript" with the following content:
#!/bin/sh
/usr/bin/python3.2 ~/bin/awescript.py "$1"
Do "whereis python" in the terminal to find out the path of you python installation if needed.
Do "chmod u+x awescript" to change the permissions.
In awescript.py change this:
path_to_srs = "mono /usr/local/bin/srs.exe"
path_to_srr = "mono /usr/local/bin/srr.exe"
to this:
path_to_srs = "mono /home/user/bin/srs.exe"
path_to_srr = "mono /home/user/bin/srr.exe"
Type "awescript --help" in any path in your terminal.
awescript -R . --srr-dir=~/srrs
"""
#TODO: ask for updated version/what features are requested
# This version always creates a .srr file with the -p option: paths will be stored.
#better handling of srs-dir and srr-dir - i.e. remove meta=DIREECTORY and just os.path.normalize it
#allow rarfix to be srr'd, skip unrar
#allow multiple main_files and loop each (for sfv's with multiple rar sets)
# will have to delete sfv files after unrar is done for all
# ------ currently works for subs sfv's with multiple rar sets... will screw up if non-scene sfv has 2+ sets that aren't subs
#add option to never unrar compressed subtyp files
#add option to unrar/delete subs
#add error logging to a file
#add sfv check option
#parse existing srs/srr files and see if need to make new ones or use/rename existing!
# srs -l
# - look for .avi .mkv .divx
# srr -l
# - look for .srs .nfo .sfv and main rar sets
# only delete srs in the filelist, bypassing DeleteFiles hardcoded
#need to make sure there's enough space to extract?
#replace unrar lb code with rar header detection code - avoid external programs at all times :)
#if sfv found and no rar - do a recursive check from that dir.
#if unrar runs and is okay, move subs/sample/etc to unrar_dir
#add support to ignore *.1.par2/sfv/rar files that par2 or alt.binz doesn't delete
# - could cause alt.binz to execute before subs/sample downloaded though
#CJ| is gay
if(os.name == "nt"):
path_to_srs = "srs"
path_to_srr = "srr"
else:
path_to_srs = "mono /usr/local/bin/srs.exe"
path_to_srr = "mono /usr/local/bin/srr.exe"
path_to_unrar = "unrar"
overwrite_existing_subs = 1
overwrite_existing_samples = 1
def get_files(path, cwdsolo):
sfvList = []
fileList = []
fileMainList = []
blackList = []
sets_in_main = 0
fileList = glob.glob("*.*")
#for file in fileList:
# print(file)
#exit()
for root,dirs,files in os.walk(path):
base = os.path.relpath(root) + slash
if base == "."+slash: base = ""
for d in dirs:
fileList += glob.glob(base + d + slash + "*.*")
fileList.sort()
#move sfv files to top of list
for file in fileList:
if re.search("\.sfv$", file, re.IGNORECASE):
sfvList.append(file)
fileList.remove(file)
fileList = sfvList + fileList
for file in fileList:
add = True
folder = ""
main_file = ""
main_files = []
sfv = ""
fset = []
typ = ""
subtyp = ""
dest = ""
sr_dir = "" #dir to store path for srs or srr that was created for fileset
part_fix = False
(folder,filename) = os.path.split(file)
if folder: folder += slash
if not re.search("\.(avi|mkv|divx|ogm|mpg|part0?0?1\.rar|00[0-1]|vob|m2ts|sfv|srs|srr)$", filename, re.IGNORECASE):
if not (re.search("\.rar$", filename, re.IGNORECASE) and not re.search("\.part\d{2,3}\.rar$", filename, re.IGNORECASE)):
continue
if re.search("\.part[2-9]\.rar$", filename, re.IGNORECASE):
basename = filename.split(".rar",1)[0]
if not os.path.exists(folder + basename + ".r00"):
continue
part_fix = True
#SFV Detection
if re.search("\.sfv$", filename, re.IGNORECASE):
sfv = filename
missingList = []
for line in fileinput.input([folder+filename]):
line = line.strip()
if not len(line) < 10 and not line[0:1] == ";":
f = line[:-9]
if not os.path.exists(folder + f):
if re.search("\.(rar|[rs0-9][0-9][0-9])$", f, re.IGNORECASE):
missingList.append(f)
continue
if re.search("\.part0?0?1\.rar$", f, re.IGNORECASE) or (re.search("\.(rar|00[0-1])$", f, re.IGNORECASE) and not re.search("\.part\d{1,3}\.rar$", f, re.IGNORECASE)):
if main_file:
blackList.append(f)
else:
main_file = f
main_files.append(f)
elif re.search("\.part[2-9]\.rar$", f, re.IGNORECASE):
if os.path.exists(folder + f.split(".rar",1)[0] + ".r00"):
if main_file:
blackList.append(f)
else:
main_file = f
main_files.append(f)
if re.search("\.(rar|[rs0-9][0-9][0-9])$", f, re.IGNORECASE):
fset.append(f)
#
#multi-rar sets subs fix
#
#if len(main_files) > 1:
# for i in range(len(main_files)-1):
# blackList.append(main_files[i])
#fset.append(sfv)
if len(missingList) > 0:
cont = False
print("Files missing from " + filename + ":\n " + str(missingList)) #str(missingList) +
for miss in missingList:
if re.search("\.(avi|divx|mkv|ogm|mpg)$", miss, re.IGNORECASE):
print("SFV contains missing video file. Skipping instead of quitting.")
cont = True
break
elif re.search("\.(nfo|par2)$", miss, re.IGNORECASE):
print("SFV contains MISC files. Non-Scene SFV.")
cont = True
break
elif re.search("(sub.*|-s)\.rar", miss, re.IGNORECASE) and len(missingList) <= 2:
print("Subs files from SFV missing.")
cont = True
break
if cont: continue
if main_file: blackList.append(f)
return []
if not main_file: continue #sfv was probably corrupt
if not main_file:
main_file = filename
#Look inside RAR and get types (i.e. AVI,MKV,SUBS)
if re.search("\.(rar|00[0-1])$", main_file, re.IGNORECASE):
if blackList.count(main_file): continue
if os.path.exists(folder + main_file.split(".001",1)[0] + ".000"):
continue #split files - not RARs
for i in range(len(fileMainList)):
if fileMainList[i][1].lower() == main_file.lower():
add = False
break #RAR file added by SFV, skip
if not add: continue
if len(fset) == 0: #NO SFV!
print("no sfv for %s" % main_file)
fset = glob.glob(wildc(folder, main_file))
for i in range(len(fset)):
fset[i] = fset[i].rsplit(slash)[-1:][0] #remove path, keeping only filename
#print(fset)
if len(fset) >= 2:
#print(fset)
fset.sort() #Fixes when SFV set is out of order (i.e. RAR file at top in .r## set
if os.path.getsize(folder+fset[len(fset)-1]) == os.path.getsize(folder+fset[len(fset)-2]):
print("%s is the same size as %s. Incomplete set." % (folder+fset[len(fset)-1],folder+fset[len(fset)-2]))
#continue
return []
else: #since last 2 aren't same size, we must have last rar to check for missing!
numRARs = 0
if re.search("\.part(\d{1,3})\.rar$", fset[len(fset)-1], re.IGNORECASE):
numRARs = int(re.search("\.part(\d{1,3})\.rar$", fset[len(fset)-1], re.IGNORECASE).groups()[0])
elif re.search("\.s(\d{2})$", fset[len(fset)-2], re.IGNORECASE):
numRARs = int(re.search("\.s(\d{2})$", fset[len(fset)-2], re.IGNORECASE).groups()[0])
numRARs += 101
elif re.search("\.r(\d{2})$", fset[len(fset)-2], re.IGNORECASE):
numRARs = int(re.search("\.r(\d{2})$", fset[len(fset)-2], re.IGNORECASE).groups()[0])
numRARs += 2
elif re.search("\.(\d{3})$", fset[len(fset)-1], re.IGNORECASE):
numRARs = int(re.search("\.(\d{3})$", fset[len(fset)-1], re.IGNORECASE).groups()[0])
if re.search("\.(rar|000)$", main_file, re.IGNORECASE):
numRARs += 1
#else: return []
if numRARs != 0:
if len(fset) != numRARs:
print("Files missing from RAR set. Quitting.")
return []
#else: #check for RARs with wrong size - exit if 2+ have different size.
# fileSize = os.path.getsize(folder+fset[0])
# diffFiles = 0
# for f in fset:
# if os.path.getsize(folder+f) != fileSize:
# diffFiles += 1
# if diffFiles == 2:
# print("2 or more files in the RAR set are a different size. Set is bad. Quitting.")
# return []
output = ""
proc = subprocess.Popen("%s lb \"%s%s\"" % (path_to_unrar,folder,main_file), shell=True, stdout=subprocess.PIPE)
std = str(proc.communicate()[0]).lstrip("b'").rstrip("'")
if std:
if os.name == "nt":
output = std.split(r"\r\n")
else:
output = std.split(r"\n")
elif len(output) == 0 and re.search("\.(avi|divx|mkv|ogm|mpg)\.00[0-1]$", main_file, re.IGNORECASE):
#if os.path.exists(folder + main_file.split(".001",1)[0] + ".000"):
# main_file = main_file.split(".001",1)[0] + ".000"
print("%s is a joined file." % main_file)
typ = "Video"
subtyp = "Joined"
#wild = glob.glob(wildc(folder,main_file)).sort()
#continue
else:
print("%s could be corrupt?" % main_file)
continue
if re.search("extra", main_file, re.IGNORECASE):
subtyp = "Extras"
if not re.search("extra", cwdsolo, re.IGNORECASE):
dest = "Extras" + slash
#
#need to check if already in a folder and use that
#
for s in output: #could be multiple files in the rar
if not s: continue #for blanks at the end from splitting \r\n or \n
if re.search("\.(avi|divx|mkv|ogm|mka|dts|ac3|mpg|mp3|ogg)$", s, re.IGNORECASE):
typ = "Video"
if not folder: sets_in_main += 1 #i.e. not in CD[1-9], so may need to move
elif re.search("\.(iso|img|nrg|bin|gcm|cdi|dvd|gi)$", s, re.IGNORECASE):
typ = "ISO"
subtyp = "Compressed"
else:
#print("Unkown files in RAR %s or corrupt." % main_file)
continue
break
if not typ:
for s in output: #could be multiple files in the rar
if not s: continue #for blanks at the end from splitting \r\n or \n
if re.search("\.(srt|sub|idx|rar)$", s, re.IGNORECASE):
if re.search("vob.?sub", main_file, re.IGNORECASE):
typ = "VobSubs"
if not folder:
dest = "VobSubs"+slash
else:
typ = "Subs"
if not folder:
dest = "Subs"+slash
if subtyp == "Extras" and not re.search("extra", cwdsolo, re.IGNORECASE):
if not folder: dest = "Extras" + slash + dest
break
if not typ: typ = "Other"
#Check for Video files NOT in RAR files - i.e. samples or previously extracted video
elif re.search("\.(avi|mkv|vob|m2ts)$", main_file, re.IGNORECASE):
if re.search("extra", main_file, re.IGNORECASE):
subtyp = "Extras"
#check if sample
if re.search("sample", folder, re.IGNORECASE) or is_sample(folder + main_file):
if re.search("\.vob$", main_file, re.IGNORECASE):
typ = "VobSample"
if not folder:
dest = "VobSample"+slash
elif re.search("\.m2ts$", main_file, re.IGNORECASE):
typ = "m2tsSample"
if not folder:
dest = "Sample"+slash
else:
typ = "Sample"
if not folder:
dest = "Sample"+slash
if subtyp == "Extras" and not re.search("extra", cwdsolo, re.IGNORECASE):
if not folder:
dest = "Extras" + slash + dest
else:
#not a sample, add as extracted video
typ = "Video"
subtyp = "Extracted"
if not folder: sets_in_main += 1 #i.e. not in CD[1-9], so may need to move
#continue
elif re.search("\.nfo$", main_file, re.IGNORECASE):
typ = "Other"
subtyp = "NFO"
elif re.search("\.srs$", main_file, re.IGNORECASE):
if re.search("extra", main_file, re.IGNORECASE):
subtyp = "Extras_SRS"
if not folder:
dest = "Extras"+slash + "Sample"+slash
else:
subtyp = "SRS"
if not folder:
dest = "Sample"+slash
typ = "Sample"
elif re.search("\.srr$", main_file, re.IGNORECASE):
typ = "Other"
subtyp = "SRR"
if len(fset) == 0: fset.append(main_file)
#if dest and options.unrar_dir: dest = options.unrar_dir.rstrip(slash) + slash + dest
fileMainList.append([folder,main_file,sfv,fset,typ,subtyp,dest,sr_dir])
#Detect CD folders - skip if folder has TV tags
if sets_in_main >= 2 and not re.search("([\._\s]s?\d{1,3}[\._\s]?[ex]\d{1,3}|s\d{1,3})", cwdsolo, re.IGNORECASE): #2 or more CDs possible
fileMainList = get_cds(fileMainList)
return fileMainList
def is_sample(video):
max_size = 50000000
if re.search("\.mkv$", video, re.IGNORECASE):
max_size = 250000000
if re.search("^.*?([\.\-_\w]?sa?mp).*?\.(?:avi|mkv|m2ts|vob)$", video, re.IGNORECASE):
if os.path.getsize(video) < max_size: return True
else: #no s?mp in filename - reduce filesize limits manually
if re.search("\.(avi|mkv|vob|m2ts)$", video, re.IGNORECASE) and os.path.getsize(video) < max_size / 2:
return True
return False
def only_samples(files):
sample = False
for file in files:
if file[4] == "Video":
return False
elif file[4] == "Sample":
sample = True
return sample
def get_cds(fileMainList):
global slash
#folder,main_file,sfv,fset,typ,dest
fileList = fileMainList
fileListNew = []
position = False
for i in range(len(fileList)):
if fileList[i][4] != "Video": continue
fileListTemp = []
file = fileList[i][1]
posTemp = 0
if re.search("(s\d{1,3}[\._]?e\d{1,3})", file, re.IGNORECASE): continue #TV Test (file) - MAKE THIS FOR DIR
for j in range(len(fileList)):
if i == j: continue # i <= j ? since they've already been compared once?
if fileList[j][4] != "Video": continue
file2 = fileList[j][1]
if re.search("(s\d{1,3}[\._]?e\d{1,3})", file2, re.IGNORECASE): continue #TV Test (file2)
if len(file) == len(file2):
diff = 0
for k in range(len(file)):
if file[k] != file2[k]:
diff += 1
if diff > 1: break
if posTemp:
if k != posTemp:
#Can't compute differences for CDs. Skipping.
continue
posTemp = k
#print(file)
if diff == 1: fileListTemp.append(j)
if len(fileListTemp) > len(fileListNew):
fileListNew = fileListTemp
fileListNew.append(i)
position = posTemp
fileListNew.sort()
if len(fileListNew) <= 1: return fileMainList
print("CDs: Detected!")
diff = 99
for i in fileListNew:
file = fileMainList[i][1]
char = file[position]
if re.match("^([1-9])$", char):
cd = char
elif re.match("^([A-Fa-f])$", char):
if char == "a": cd = "1"
elif char == "b": cd = "2"
elif char == "c": cd = "3"
elif char == "d": cd = "4"
elif char == "e": cd = "5"
elif char == "f": cd = "6"
else:
print(file + " is NOT a cd, subs?")
continue
#fix for releases with only parts 3/4 but pre as CD1/CD2 (separate release with 1/2)
if diff == 99:
if int(cd) == 1:
diff = 0
else: #assume it's sorted and just didn't start at 1
diff = int(cd) - 1
cd = str(int(cd) - diff)
print(file + " is CD" + cd)
#get/make directory
fileMainList[i][6] = "CD" + cd + slash
if re.search("\.(rar|00[0-1])$", file, re.IGNORECASE):
fileMainList[i][5] = "CD"
else:
fileMainList[i][5] = "Extracted_CD"
return fileMainList
def wildc(folder,file):
global slash
if not os.path.exists(folder+file): return False
basename = False
wildcard = False
if re.search("\.(part01\.rar)$", file, re.IGNORECASE):
ext = re.search("\.(part01\.rar)$", file, re.IGNORECASE).groups()[0]
wildcard = ".[Pp][Aa][Rr][Tt][0-9][0-9].[Rr][Aa][Rr]"
elif re.search("\.(part001\.rar)$", file, re.IGNORECASE):
ext = re.search("\.(part001\.rar)$", file, re.IGNORECASE).groups()[0]
wildcard = ".[Pp][Aa][Rr][Tt][0-9][0-9][0-9].[Rr][Aa][Rr]"
elif re.search("\.(rar)$", file, re.IGNORECASE):
if re.search("\.(part1\.rar)$", file, re.IGNORECASE):
filename = folder + file.split(".rar",1)[0]+".r00".replace("[", "[[]")
if os.path.exists(filename):
ext = re.search("\.(part1\.rar)$", file, re.IGNORECASE).groups()[0]
wildcard = ".[Pp][Aa][Rr][Tt]1.[Rr]??"
else:
ext = re.search("\.(part1\.rar)$", file, re.IGNORECASE).groups()[0]
wildcard = ".[Pp][Aa][Rr][Tt][0-9].[Rr][Aa][Rr]"
else:
ext = re.search("\.(rar)$", file, re.IGNORECASE).groups()[0]
wildcard = ".[Rr]??"
elif re.search(".(00[0-1])$", file, re.IGNORECASE):
ext = re.search("\.(00[0-1])$", file, re.IGNORECASE).groups()[0]
wildcard = ".[0-9][0-9][0-9]"
else: return False
basename = file.split("."+ext,1)[0].replace("[", "[[]")
return folder + basename + wildcard
def move_files(files, options, cwdsolo):
global slash
if options.move_subs:
files = move(files, "Subs", "", True, options.debug)
files = move(files, "VobSubs", "", True, options.debug)
if options.move_extras:
files = move(files, "Subs", "Extras", True, options.debug)
files = move(files, "VobSubs", "Extras", True, options.debug)
if options.move_samples and not (options.delete_samples and options.delete_srs_after_srr):
if not only_samples(files):
files = move(files, "Sample", "", True, options.debug)
if not options.srs_dir:
files = move(files, "Sample", "SRS", True, options.debug)
if options.move_extras:
files = move(files, "Sample", "Extras", True, options.debug)
if not options.srs_dir:
files = move(files, "Sample", "Extras_SRS", True, options.debug)
else:
print("Only samples found, not moving.")
if options.move_samples:
files = move(files, "VobSample", "", True, options.debug)
files = move(files, "m2tsSample", "", True, options.debug)
if options.move_extras:
files = move(files, "VobSample", "Extras", True, options.debug)
files = move(files, "m2tsSample", "Extras", True, options.debug)
if options.move_cds and not options.delete_rars:
#print("Moving RAR sets to CD1-N folders.")
files = move(files, "Video", "CD", True, options.debug)
if options.move_cds_extracted:
print("Moving previously extracted video files to CD1-N folders.")
files = move(files, "Video", "Extracted_CD", True, options.debug)
if options.move_extras:
files = move(files, "Video", "Extras", True, options.debug)
files = move(files, "Other", "Extras", True, options.debug)
return files
def move(files, typ, subtyp, overwrite, debug):
global slash
for i in range(len(files)):
if files[i][4] != typ or files[i][5] != subtyp or not files[i][6]: continue
file = files[i]
ok = True
fset = file[3]
dest = file[6]
if not os.path.isdir(dest):
if debug:
print("mkdir %s" % dest)
else:
os.makedirs(dest)
#directory = ""
#for d in dest.rstrip(slash).split(slash):
# directory += d + slash
# if not os.path.isdir(directory):
# os.mkdir(directory)
if file[2]:#sfv
fset.append(file[2])
for f in fset:
if not os.path.isfile(f): continue
try:
if os.path.isfile(dest+f):
if overwrite:
if debug:
print("remove %s%s to overwrite." % (dest,f))
else:
os.remove(dest+f)
else:
if os.path.isfile(dest+"copy.of."+f):
if debug:
print("remove %scopy.of.%s to make new copy." %(dest,f))
else:
os.remove(dest+"copy.of."+f)
if debug:
print("rename %s%s to %scopy.of.%s" (dest,f,dest,f))
else:
os.rename(dest+f,dest+"copy.of."+f)
if debug:
print("rename %s to %s%s" % (f,dest,f))
else:
os.rename(f, dest+f)
except OSError:
ok = False
if ok:
file[0] = dest #folder = dest
file[6] = "" #unrar_dir.rstrip(slash) + slash
files[i] = file
return files
#move full directories post-extraction if unrar_dir set?
def move_dir(file):
global slash
return file
def srs_srr(files, options, cwdsolo):
global slash
code = 0
if options.create_srs:
code, files = srs(files, options, cwdsolo) #create srs
if options.create_srr: #if srs fails, so be it?
code, files = srr(files, options, cwdsolo, False) #False to not ignore Extras. if fail, ignore Extras and try again
if code == 0 and options.create_srr and (options.delete_srs_after_srr and options.include_srs_in_srr):
if options.debug:
print("remove *.srs")
else:
deleteFiles(["*.srs","*[Ss][Aa][Mm][Pp][Ll][Ee]*/*.srs"], "Re-Sample (SRS)", None, False) #delete *.srs
return code, files
def srs(files, options, cwdsolo):
global slash, path_to_srs
code = -1
filesToAdd = []
onlySamples = only_samples(files)
for i in range(len(files)):
if files[i][4] != "Sample" or files[i][5] == "SRS" or files[i][5] == "Extras_SRS": continue
cmd = path_to_srs
folder = files[i][0]
file = files[i][1]
srs_file = file[:-3]+"srs"
if options.srs_namep:
srs_file = cwdsolo+".srs"
try:
cmd += " \"" + folder+file + "\""
#cmd += opts
cmd += " -o \""
if options.srs_dir:
if os.path.exists(options.srs_dir):
folder = options.srs_dir.rstrip(slash) + slash
else: #create srs_dir
if os.makedirs(options.srs_dir):
folder = options.srs_dir.rstrip(slash) + slash
print("SRS directory %s created." % options.srs_dir)
else:
print("SRS directory %s could not be created. SRS will default to release directory." % options.srs_dir)
if os.path.isfile(folder+srs_file) and os.path.getsize(folder+srs_file) > 0:
print("SRS file exists, skipping %s" % srs_file)
code = 0
continue
cmd += folder+srs_file + "\""
print(cmd)
if options.debug:
code = 0
else:
code = os.system(cmd)
if code == 2:
print("SRS: Sample file \"%s\" is bad." % file)
code = -1
elif code == 0:
files[i][7] = srs_file
if files[i][5] == "Extras":
subtyp = "Extras_SRS"
else:
subtyp = "SRS"
filesToAdd.append([folder, srs_file, "", [srs_file], "Sample", subtyp, ""])
if options.delete_samples and not onlySamples:
if options.debug:
print("delete %s%s" % (folder,file))
else:
deleteFiles([folder+file], "AVI Sample", None, False)
else:
print("Error with SRS.")
code = -1
except OSError:
print("SRS: Error running SRS.")
return -1, files
files += filesToAdd
return code, files
def srr(files, options, cwdsolo, ignore_extras):
global slash, path_to_srr
cmd = path_to_srr
code = -1
srrNum = 0
dest = ""
srr_file = cwdsolo+".srr"
joined = False
extras = False
if options.srr_dir:
if os.path.exists(options.srr_dir):
dest = options.srr_dir
else: #create srr_dir
if os.makedirs(options.srr_dir):
dest = options.srr_dir
print("SRR directory %s created." % options.srr_dir)
else:
print("SRR directory %s could not be created. SRR will default to release directory." % options.srr_dir)
elif options.unrar_dir:
if not os.path.exists(options.unrar_dir):
if options.debug:
print("mkdir %s" % options.unrar_dir)
dest = options.unrar_dir
elif os.makedirs(options.unrar_dir):
dest = options.unrar_dir
else:
dest = options.unrar_dir
for file in files:
if file[4] != "Video" or file[5] == "Extracted" or file[5] == "Extracted_CD" or file[5] == "Compressed": continue
if file[5] == "Joined":
joined = True
continue
if file[5] == "Extras":
extras = True
#if subtyp and file[5] != subtyp: continue
folder = file[0]
if file[2]: file = file[2] #sfv
elif file[1]: file = file[1] #rar
else: continue
cmd += " \"" + folder+file + "\""
srrNum += 1
if joined and srrNum == 0: return 1, files
elif srrNum == 0: return 1, files
cmd += " -s" #-s include files below (at least *.nfo)
if options.include_srs_in_srr:
for file in files:
if file[4] == "Sample" and (file[5] == "SRS" or file[5] == "Extras_SRS"):
cmd += " \"%s%s\"" % (file[0],file[1])
cmd += " *.nfo"
if dest and os.path.isdir(dest):
cmd += " -o \"%s%s%s\"" % (dest.rstrip(slash),slash,srr_file)
else:
cmd += " -o \"%s\"" % srr_file
# we will always do paths when creating the srr file
cmd += " -p"
try:
print(cmd)
if options.debug:
code = 0
else:
code = os.system(cmd)
print(code)
if code == 3 or code == 768: #3 for windows, 768 for linux ; compressed RARs
if extras == True and ignore_extras == False:
print("SRR: RARs are compressed. Re-Trying without Extras.")
code, files = srr(files, options, cwdsolo, True)
else:
print("SRR: RARs are compressed. Continuing like normal, ignoring srs deletion")
return code, files
elif code != 0:
print("SRR: Re-Scene failed. Skipping the rest.")
return -1, files
else:
return 0, files
except OSError:
print("SRR: Error running SRR.")
return -1, files
return -1, files
def unrar(files, options, code):
global slash, path_to_unrar
#options.unrar_dir, options.extract_to_main_dir, options.delete_rars, options.delete_sfv
#[folder,main_file,sfv,fset,typ,subtyp,dest]
if not options.extract_rars or code == -1:
return code, files
maincmd = "%s x -o+ -p-" % path_to_unrar
if(os.name == "nt"):
joincmd = "copy /b"
else:
joincmd = "cat"
for fileset in files:
if (fileset[4] != "Video" and fileset[4] != "ISO") or fileset[5] == "Extracted": continue #typ
folder = fileset[0]
file = fileset[1] #name.rar
sfv = fileset[2]
fset = fileset[3]
if folder and (not options.extract_to_main_dir or fileset[5] == "Extras"):
if options.unrar_dir:
dest = options.unrar_dir.rstrip(slash) + slash + folder
else:
dest = folder
else:
if options.unrar_dir:
dest = options.unrar_dir.rstrip(slash) + slash
else:
dest = "."+slash
try:
#input file
if fileset[5] != "Joined":
cmd = maincmd
cmd += " \"" + folder+file + "\""
else:
cmd = joincmd+" "
for i in range(len(fset)):
cmd += "\"%s\"" % fset[i]
if i+1 != len(fset):
if(os.name == "nt"):
cmd += "+"
else:
cmd += " "
if(os.name != "nt"):
cmd += " >"
dest = dest+file[:-4]
cmd += " \"" + dest + "\""
print(cmd)
if options.debug:
code = 0
else:
code = os.system(cmd)
if code != 0:
print("UnRAR failed. Skipping the rest.")
return -1, files
elif options.delete_rars:
for f in fset:
try:
if options.debug:
print("remove %s%s" % (folder,f))
else:
os.remove(folder+f)
except OSError:
print("Error trying to remove %s%s" % (folder,f))
print("UnRAR: %s RAR files that were processed have been removed." % folder)
if options.delete_sfv and sfv:
try:
if options.debug:
print("remove %s%s" % (folder,sfv))
else:
os.remove(folder+sfv)
print("UnRAR: %s%s removed." % (folder,sfv))
except OSError:
print("UnRAR: Error trying to remove %s%s" % (folder,sfv))
except OSError:
print("Error trying to unrar.")
return -1, files
except KeyboardInterrupt:
print("\nUnRAR was interrupted by user. Exiting")
sys.exit()
return code, files
def cleanup(files, options, code):
global slash
if options.delete_par2 and not (code != 0 and options.extract_rars):
deleteFiles(["*.[Pp][Aa][Rr]2"], "PAR2", None, options.debug)
deleteFiles(["*.[Nn][Zz][Bb]"], "NZB", None, options.debug)
#need to delete empty folders
deleteDirectories(["*[Cc][Dd][1-9]*/","*[Ss][Aa][Mm][Pp][Ll][Ee]*/"], options.debug)
return
def deleteFiles(wildcards, word, ignoreList, debug):
fileList = []
for wc in wildcards:
fileList += glob.glob(wc)
if len(fileList) == 0:
print("No %s files to delete." % word)
return 0
for file in fileList:
cont = True
if ignoreList:
for ignore in ignoreList:
if file == ignore:
ignoreList.remove(ignore)
cont = False
break
if cont:
try:
if debug:
print("remove %s" % file)
else:
os.remove(file)
print("%s deleted." % file)
except OSError:
print("Error trying to remove %s" % file)
return -1
return 0
def deleteDirectories(wildcards, debug):
dirs = []
for wc in wildcards:
dirs += glob.glob(wc)
for directory in dirs:
if not os.listdir(directory):
try:
if debug:
print("rmdir %s" % directory)
else:
os.rmdir(directory)
print("%s was empty and removed." % directory)
except OSError:
print("%s was empty but could not be removed." % directory)
return
def main(options, path):
global origcwd, cwd, slash
if options.exit_if_par2_exists: #altbinz mode - fix for altbinz sending lowercase dirname
for p in glob.glob(os.path.normpath(os.path.join(path, '..'))+slash+"*"):
if path.lower() == p.lower() or path.lower() == p.lower()[2:]:
os.chdir(p)
break
else:
os.chdir(path)
cwd = os.getcwd()
cwdsolo = os.path.split(cwd)[-1]
if options.exit_if_par2_exists:
if len(glob.glob("*.par2")) > 0:
print("PAR2 files exist. Exiting...")
sys.exit()
if re.search("(subpack|sub.?fix|subs\.)", cwdsolo, re.IGNORECASE):
print("SUBS directory detected. Not processing.")
return
elif re.search("(sync.?fix)", cwdsolo, re.IGNORECASE):
print("SYNCFiX directory detected. Not processing.")
return
elif re.search("(sample.?fix)", cwdsolo, re.IGNORECASE):
print("SAMPLEFiX directory detected. Not processing.")
return
print("\nProcessing: %s\n" % cwd)
files = get_files(cwd, cwdsolo)
if len(files) == 0:
#print("No files to process.")
return
#debug
if options.debug: #or options.verbose
print("\nFiles:\n[folder, filename, sfv, file_list, type, subtype, destination_dir, rescene_dir]\n")
for i in range(len(files)):
print(str(i+1) + ": " + str(files[i]) + "\n")
print("")
code = 1
files = move_files(files, options, cwdsolo)
code, files = srs_srr(files, options, cwdsolo)
code, files = unrar(files, options, code)
cleanup(files, options, code)
return
if __name__ == '__main__':
usage = "usage: %prog -