2023-01-12 01:04:47 +00:00
|
|
|
# Author: Tyler Fenby <tylerfenby@gmail.com>
|
|
|
|
#
|
|
|
|
# This file is part of SickGear.
|
|
|
|
#
|
|
|
|
# SickGear is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# SickGear is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
|
|
|
|
from __future__ import with_statement
|
|
|
|
|
|
|
|
import exceptions_helper
|
|
|
|
|
|
|
|
import sickgear
|
|
|
|
from . import logger, search_queue, show_name_helpers
|
|
|
|
from ._legacy_classes import LegacyFailedProcessor
|
|
|
|
from .name_parser.parser import NameParser, InvalidNameException, InvalidShowException
|
|
|
|
|
|
|
|
# noinspection PyUnreachableCode
|
|
|
|
if False:
|
|
|
|
from typing import AnyStr
|
|
|
|
|
|
|
|
|
|
|
|
class FailedProcessor(LegacyFailedProcessor):
|
|
|
|
"""Take appropriate action when a download fails to complete"""
|
|
|
|
|
|
|
|
def __init__(self, dir_name, nzb_name, show_obj=None):
|
|
|
|
"""
|
|
|
|
:param dir_name: Full path to the folder of the failed download
|
|
|
|
:type dir_name: AnyStr
|
|
|
|
:param nzb_name: Full name of the nzb file that failed
|
|
|
|
:type nzb_name: AnyStr or None
|
|
|
|
:param show_obj: show object
|
|
|
|
:type show_obj: sickgear.tv.TVShow or None
|
|
|
|
"""
|
|
|
|
self.dir_name = dir_name # type: AnyStr
|
|
|
|
self.nzb_name = nzb_name # type: AnyStr or None
|
|
|
|
self._show_obj = show_obj # type: sickgear.tv.TVShow or None
|
|
|
|
|
|
|
|
self.log = '' # type: AnyStr
|
|
|
|
|
|
|
|
@property
|
|
|
|
def show_obj(self):
|
|
|
|
"""
|
|
|
|
:rtype: sickgear.tv.TVShow or None
|
|
|
|
"""
|
|
|
|
return self._show_obj
|
|
|
|
|
|
|
|
@show_obj.setter
|
|
|
|
def show_obj(self, val):
|
|
|
|
"""
|
|
|
|
:param val: show object or None
|
|
|
|
:type val: sickgear.tv.TVShow or None
|
|
|
|
"""
|
|
|
|
self._show_obj = val
|
|
|
|
|
|
|
|
def process(self):
|
|
|
|
"""
|
|
|
|
|
|
|
|
:return: success
|
|
|
|
:type: bool or None
|
|
|
|
"""
|
2023-03-08 13:44:20 +00:00
|
|
|
self._log(f'Failed download detected: ({self.nzb_name}, {self.dir_name})')
|
2023-01-12 01:04:47 +00:00
|
|
|
|
2023-02-13 21:00:11 +00:00
|
|
|
release_name = show_name_helpers.determine_release_name(self.dir_name, self.nzb_name)
|
|
|
|
if None is release_name:
|
2023-03-08 13:44:20 +00:00
|
|
|
self._log('Warning: unable to find a valid release name.', logger.WARNING)
|
2023-01-12 01:04:47 +00:00
|
|
|
raise exceptions_helper.FailedProcessingFailed()
|
|
|
|
|
|
|
|
try:
|
|
|
|
parser = NameParser(False, show_obj=self.show_obj, convert=True)
|
2023-02-13 21:00:11 +00:00
|
|
|
parsed = parser.parse(release_name)
|
2023-01-12 01:04:47 +00:00
|
|
|
except InvalidNameException:
|
2023-03-08 13:44:20 +00:00
|
|
|
self._log(f'Error: release name is invalid: {release_name}', logger.DEBUG)
|
2023-01-12 01:04:47 +00:00
|
|
|
raise exceptions_helper.FailedProcessingFailed()
|
|
|
|
except InvalidShowException:
|
2023-03-08 13:44:20 +00:00
|
|
|
self._log(f'Error: unable to parse release name {release_name} into a valid show', logger.DEBUG)
|
2023-01-12 01:04:47 +00:00
|
|
|
raise exceptions_helper.FailedProcessingFailed()
|
|
|
|
|
2023-03-08 13:44:20 +00:00
|
|
|
for cur_msg in (
|
|
|
|
'name_parser info: ',
|
|
|
|
f' - {parsed.series_name}',
|
|
|
|
f' - {parsed.season_number}',
|
|
|
|
f' - {parsed.episode_numbers}',
|
|
|
|
f' - {parsed.extra_info}',
|
|
|
|
f' - {parsed.release_group}',
|
|
|
|
f' - {parsed.air_date}'
|
|
|
|
):
|
|
|
|
logger.debug(cur_msg)
|
2023-01-12 01:04:47 +00:00
|
|
|
|
|
|
|
for episode in parsed.episode_numbers:
|
|
|
|
segment = parsed.show_obj.get_episode(parsed.season_number, episode)
|
|
|
|
|
|
|
|
cur_failed_queue_item = search_queue.FailedQueueItem(parsed.show_obj, [segment])
|
|
|
|
sickgear.search_queue_scheduler.action.add_item(cur_failed_queue_item)
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
def _log(self, message, level=logger.MESSAGE):
|
|
|
|
"""Log to regular logfile and save for return for PP script log
|
|
|
|
:param message: message
|
|
|
|
:type message: AnyStr
|
|
|
|
:param level: logging level
|
|
|
|
:type level: int
|
|
|
|
"""
|
|
|
|
logger.log(message, level)
|
|
|
|
self.log += message + '\n'
|