|
|
@ -44,6 +44,7 @@ from sickbeard.name_parser.parser import NameParser, InvalidNameException, Inval |
|
|
|
|
|
|
|
from lib import adba |
|
|
|
|
|
|
|
|
|
|
|
class PostProcessor(object): |
|
|
|
""" |
|
|
|
A class which will process a media file according to the post processing settings in the config. |
|
|
@ -56,10 +57,6 @@ class PostProcessor(object): |
|
|
|
|
|
|
|
IGNORED_FILESTRINGS = ["/.AppleDouble/", ".DS_Store"] |
|
|
|
|
|
|
|
NZB_NAME = 1 |
|
|
|
FOLDER_NAME = 2 |
|
|
|
FILE_NAME = 3 |
|
|
|
|
|
|
|
def __init__(self, file_path, nzb_name=None, process_method=None, is_priority=None): |
|
|
|
""" |
|
|
|
Creates a new post processor with the given file path and optionally an NZB name. |
|
|
@ -85,19 +82,17 @@ class PostProcessor(object): |
|
|
|
self.process_method = process_method if process_method else sickbeard.PROCESS_METHOD |
|
|
|
|
|
|
|
self.in_history = False |
|
|
|
|
|
|
|
self.release_group = None |
|
|
|
|
|
|
|
self.release_name = None |
|
|
|
|
|
|
|
self.is_proper = False |
|
|
|
self.is_priority = is_priority |
|
|
|
|
|
|
|
self.good_results = {self.NZB_NAME: False, |
|
|
|
self.FOLDER_NAME: False, |
|
|
|
self.FILE_NAME: False} |
|
|
|
self.is_priority = is_priority |
|
|
|
|
|
|
|
self.log = '' |
|
|
|
|
|
|
|
def __del__(self): |
|
|
|
pass |
|
|
|
|
|
|
|
def _log(self, message, level=logger.MESSAGE): |
|
|
|
""" |
|
|
|
A wrapper for the internal logger which also keeps track of messages and saves them to a string for later. |
|
|
@ -442,25 +437,21 @@ class PostProcessor(object): |
|
|
|
self.is_proper = re.search('(^|[\. _-])(proper|repack)([\. _-]|$)', parse_result.extra_info, re.I) != None |
|
|
|
|
|
|
|
# if the result is complete then remember that for later |
|
|
|
if parse_result.series_name and parse_result.season_number != None and parse_result.episode_numbers and parse_result.release_group: |
|
|
|
test_name = helpers.remove_extension(ek.ek(os.path.basename, parse_result.original_name)) |
|
|
|
|
|
|
|
if test_name == self.nzb_name: |
|
|
|
self.good_results[self.NZB_NAME] = True |
|
|
|
elif test_name == self.folder_name: |
|
|
|
self.good_results[self.FOLDER_NAME] = True |
|
|
|
elif test_name == self.file_name: |
|
|
|
self.good_results[self.FILE_NAME] = True |
|
|
|
else: |
|
|
|
logger.log(u"Nothing was good, found " + repr(test_name) + " and wanted either " + repr( |
|
|
|
self.nzb_name) + ", " + repr(self.folder_name) + ", or " + repr(self.file_name)) |
|
|
|
# if the result is complete then set release name |
|
|
|
if parse_result.series_name and ((parse_result.season_number is not None and parse_result.episode_numbers) |
|
|
|
or parse_result.air_date) and parse_result.release_group: |
|
|
|
|
|
|
|
if not self.release_name: |
|
|
|
self.release_name = helpers.remove_extension(ek.ek(os.path.basename, parse_result.original_name)) |
|
|
|
|
|
|
|
else: |
|
|
|
logger.log(u"Parse result not sufficient(all following have to be set). Will not save release name", |
|
|
|
logger.log(u"Parse result not sufficient (all following have to be set). will not save release name", |
|
|
|
logger.DEBUG) |
|
|
|
logger.log("Parse result(series_name): " + str(parse_result.series_name), logger.DEBUG) |
|
|
|
logger.log("Parse result(season_number): " + str(parse_result.season_number), logger.DEBUG) |
|
|
|
logger.log("Parse result(episode_numbers): " + str(parse_result.episode_numbers), logger.DEBUG) |
|
|
|
logger.log("Parse result(release_group): " + str(parse_result.release_group), logger.DEBUG) |
|
|
|
logger.log(u"Parse result(series_name): " + str(parse_result.series_name), logger.DEBUG) |
|
|
|
logger.log(u"Parse result(season_number): " + str(parse_result.season_number), logger.DEBUG) |
|
|
|
logger.log(u"Parse result(episode_numbers): " + str(parse_result.episode_numbers), logger.DEBUG) |
|
|
|
logger.log(u" or Parse result(air_date): " + str(parse_result.air_date), logger.DEBUG) |
|
|
|
logger.log(u"Parse result(release_group): " + str(parse_result.release_group), logger.DEBUG) |
|
|
|
|
|
|
|
def _analyze_name(self, name, file=True): |
|
|
|
""" |
|
|
@ -621,11 +612,13 @@ class PostProcessor(object): |
|
|
|
|
|
|
|
# for air-by-date shows we need to look up the season/episode from database |
|
|
|
if season == -1 and show and episodes: |
|
|
|
self._log(u"Looks like this is an air-by-date or sports show, attempting to convert the date to season/episode", |
|
|
|
self._log( |
|
|
|
u"Looks like this is an air-by-date or sports show, attempting to convert the date to season/episode", |
|
|
|
logger.DEBUG) |
|
|
|
airdate = episodes[0].toordinal() |
|
|
|
myDB = db.DBConnection() |
|
|
|
sql_result = myDB.select("SELECT season, episode FROM tv_episodes WHERE showid = ? and indexer = ? and airdate = ?", |
|
|
|
sql_result = myDB.select( |
|
|
|
"SELECT season, episode FROM tv_episodes WHERE showid = ? and indexer = ? and airdate = ?", |
|
|
|
[show.indexerid, show.indexer, airdate]) |
|
|
|
|
|
|
|
if sql_result: |
|
|
@ -733,7 +726,9 @@ class PostProcessor(object): |
|
|
|
if ep_obj.status in common.Quality.SNATCHED + common.Quality.SNATCHED_PROPER: |
|
|
|
oldStatus, ep_quality = common.Quality.splitCompositeStatus(ep_obj.status) # @UnusedVariable |
|
|
|
if ep_quality != common.Quality.UNKNOWN: |
|
|
|
self._log(u"The old status had a quality in it, using that: " + common.Quality.qualityStrings[ep_quality], logger.DEBUG) |
|
|
|
self._log( |
|
|
|
u"The old status had a quality in it, using that: " + common.Quality.qualityStrings[ep_quality], |
|
|
|
logger.DEBUG) |
|
|
|
return ep_quality |
|
|
|
|
|
|
|
# Try guessing quality from the file name |
|
|
@ -853,7 +848,8 @@ class PostProcessor(object): |
|
|
|
|
|
|
|
# get the quality of the episode we're processing |
|
|
|
if quality: |
|
|
|
self._log(u"Snatch history had a quality in it, using that: " + common.Quality.qualityStrings[quality], logger.DEBUG) |
|
|
|
self._log(u"Snatch history had a quality in it, using that: " + common.Quality.qualityStrings[quality], |
|
|
|
logger.DEBUG) |
|
|
|
new_ep_quality = quality |
|
|
|
else: |
|
|
|
new_ep_quality = self._get_quality(ep_obj) |
|
|
@ -873,7 +869,9 @@ class PostProcessor(object): |
|
|
|
# if there's an existing file that we don't want to replace stop here |
|
|
|
if existing_file_status == PostProcessor.EXISTS_LARGER: |
|
|
|
if self.is_proper: |
|
|
|
self._log(u"File exists and new file is smaller, new file is a proper/repack, marking it safe to replace", logger.DEBUG) |
|
|
|
self._log( |
|
|
|
u"File exists and new file is smaller, new file is a proper/repack, marking it safe to replace", |
|
|
|
logger.DEBUG) |
|
|
|
return True |
|
|
|
|
|
|
|
else: |
|
|
@ -922,21 +920,12 @@ class PostProcessor(object): |
|
|
|
sql_l = [] |
|
|
|
for cur_ep in [ep_obj] + ep_obj.relatedEps: |
|
|
|
with cur_ep.lock: |
|
|
|
cur_release_name = None |
|
|
|
|
|
|
|
# use the best possible representation of the release name |
|
|
|
if self.good_results[self.NZB_NAME]: |
|
|
|
cur_release_name = self.nzb_name |
|
|
|
elif self.good_results[self.FOLDER_NAME]: |
|
|
|
cur_release_name = self.folder_name |
|
|
|
elif self.good_results[self.FILE_NAME]: |
|
|
|
cur_release_name = self.file_name |
|
|
|
|
|
|
|
if cur_release_name: |
|
|
|
self._log("Found release name " + cur_release_name, logger.DEBUG) |
|
|
|
cur_ep.release_name = cur_release_name |
|
|
|
|
|
|
|
if self.release_name: |
|
|
|
self._log("Found release name " + self.release_name, logger.DEBUG) |
|
|
|
cur_ep.release_name = self.release_name |
|
|
|
else: |
|
|
|
logger.log("good results: " + repr(self.good_results), logger.DEBUG) |
|
|
|
cur_ep.release_name = "" |
|
|
|
|
|
|
|
if ep_obj.status in common.Quality.SNATCHED_BEST: |
|
|
|
cur_ep.status = common.Quality.compositeStatus(common.ARCHIVED, new_ep_quality) |
|
|
|