mirror of
https://github.com/SickGear/SickGear.git
synced 2024-11-15 01:15:05 +00:00
Add to config/media-process/File Handling, "Rename TBA" and "Rename any".
Change exclude Trakt notifier from redundant library updates when renaming files. Change filename checker regex to be less strict. Change remove naming pattern code duplication.
This commit is contained in:
parent
a323eed822
commit
1eec1e7492
8 changed files with 88 additions and 72 deletions
|
@ -16,6 +16,7 @@
|
||||||
* Change remove redundant py2 import futures
|
* Change remove redundant py2 import futures
|
||||||
* Change add jobs to centralise scheduler activities
|
* Change add jobs to centralise scheduler activities
|
||||||
* Change refactor scene_exceptions
|
* Change refactor scene_exceptions
|
||||||
|
* Add to config/media-process/File Handling, "Rename TBA" and "Rename any"
|
||||||
* Add config to change media process log message if there is no media to process
|
* Add config to change media process log message if there is no media to process
|
||||||
* Change view-show text "invalid timeformat" to "time unknown"
|
* Change view-show text "invalid timeformat" to "time unknown"
|
||||||
|
|
||||||
|
|
|
@ -242,10 +242,30 @@
|
||||||
|
|
||||||
<div class="field-pair">
|
<div class="field-pair">
|
||||||
<label for="rename_episodes">
|
<label for="rename_episodes">
|
||||||
<span class="component-title">Rename episodes</span>
|
<span class="component-title">Rename episode files</span>
|
||||||
<span class="component-desc">
|
<span class="component-desc">
|
||||||
<input type="checkbox" name="rename_episodes" id="rename_episodes" #if $sickgear.RENAME_EPISODES == True then $checked else ''#>
|
<input type="checkbox" name="rename_episodes" id="rename_episodes" #if $sickgear.RENAME_EPISODES == True then $checked else ''#>
|
||||||
<p>rename episodes using the Episode Naming settings</p>
|
<p>using the Episode Naming settings</p>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field-pair">
|
||||||
|
<label for="rename_tba_episodes">
|
||||||
|
<span class="component-title">Rename "TBA" named files</span>
|
||||||
|
<span class="component-desc">
|
||||||
|
<input type="checkbox" name="rename_tba_episodes" id="rename_tba_episodes" #if $sickgear.RENAME_TBA_EPISODES == True then $checked else ''#>
|
||||||
|
<p>if the TV info episode name changes</p>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field-pair">
|
||||||
|
<label for="rename_name_changed_episodes">
|
||||||
|
<span class="component-title">Rename any named file</span>
|
||||||
|
<span class="component-desc">
|
||||||
|
<input type="checkbox" name="rename_name_changed_episodes" id="rename_name_changed_episodes" #if $sickgear.RENAME_NAME_CHANGED_EPISODES == True then $checked else ''#>
|
||||||
|
<p>if the TV info episode name changes</p>
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -719,9 +719,9 @@ def init_stage_1(console_logging):
|
||||||
global TV_DOWNLOAD_DIR, PROCESS_METHOD, PROCESS_AUTOMATICALLY, MEDIAPROCESS_INTERVAL, \
|
global TV_DOWNLOAD_DIR, PROCESS_METHOD, PROCESS_AUTOMATICALLY, MEDIAPROCESS_INTERVAL, \
|
||||||
POSTPONE_IF_SYNC_FILES, PROCESS_POSITIVE_LOG, EXTRA_SCRIPTS, SG_EXTRA_SCRIPTS, \
|
POSTPONE_IF_SYNC_FILES, PROCESS_POSITIVE_LOG, EXTRA_SCRIPTS, SG_EXTRA_SCRIPTS, \
|
||||||
DEFAULT_MEDIAPROCESS_INTERVAL, MIN_MEDIAPROCESS_INTERVAL, \
|
DEFAULT_MEDIAPROCESS_INTERVAL, MIN_MEDIAPROCESS_INTERVAL, \
|
||||||
UNPACK, SKIP_REMOVED_FILES, MOVE_ASSOCIATED_FILES, NFO_RENAME, RENAME_EPISODES, RENAME_TBA_EPISODES, \
|
UNPACK, SKIP_REMOVED_FILES, MOVE_ASSOCIATED_FILES, NFO_RENAME, \
|
||||||
RENAME_NAME_CHANGED_EPISODES, AIRDATE_EPISODES, \
|
RENAME_EPISODES, RENAME_TBA_EPISODES, RENAME_NAME_CHANGED_EPISODES, \
|
||||||
USE_FAILED_DOWNLOADS, DELETE_FAILED
|
AIRDATE_EPISODES, USE_FAILED_DOWNLOADS, DELETE_FAILED
|
||||||
# Media Process/Episode Naming
|
# Media Process/Episode Naming
|
||||||
global NAMING_PATTERN, NAMING_MULTI_EP, NAMING_STRIP_YEAR, NAMING_CUSTOM_ABD, NAMING_ABD_PATTERN, \
|
global NAMING_PATTERN, NAMING_MULTI_EP, NAMING_STRIP_YEAR, NAMING_CUSTOM_ABD, NAMING_ABD_PATTERN, \
|
||||||
NAMING_CUSTOM_SPORTS, NAMING_SPORTS_PATTERN, \
|
NAMING_CUSTOM_SPORTS, NAMING_SPORTS_PATTERN, \
|
||||||
|
|
|
@ -132,7 +132,7 @@ def notify_git_update(new_version=''):
|
||||||
n.notify_git_update(new_version)
|
n.notify_git_update(new_version)
|
||||||
|
|
||||||
|
|
||||||
def notify_update_library(ep_obj, flush_q=False):
|
def notify_update_library(ep_obj, flush_q=False, include_online=True):
|
||||||
|
|
||||||
if not flush_q or sickgear.QUEUE_UPDATE_LIBRARY:
|
if not flush_q or sickgear.QUEUE_UPDATE_LIBRARY:
|
||||||
|
|
||||||
|
@ -160,7 +160,8 @@ def notify_update_library(ep_obj, flush_q=False):
|
||||||
|
|
||||||
elif not flush_q:
|
elif not flush_q:
|
||||||
|
|
||||||
n.update_library(show_obj=ep_obj.show_obj, show_name=ep_obj.show_obj.name, ep_obj=ep_obj)
|
n.update_library(show_obj=ep_obj.show_obj, show_name=ep_obj.show_obj.name, ep_obj=ep_obj,
|
||||||
|
include_online=include_online)
|
||||||
|
|
||||||
if flush_q:
|
if flush_q:
|
||||||
sickgear.QUEUE_UPDATE_LIBRARY = []
|
sickgear.QUEUE_UPDATE_LIBRARY = []
|
||||||
|
|
|
@ -91,9 +91,13 @@ class BaseNotifier(object):
|
||||||
def notify_git_update(self, *args, **kwargs):
|
def notify_git_update(self, *args, **kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def update_library(self, **kwargs):
|
def update_library(self, include_online=True, **kwargs):
|
||||||
"""
|
"""
|
||||||
note: nmj_notifier fires its library update when the notify_download is issued (inside notifiers)
|
note: nmj_notifier fires its library update when the notify_download is issued (inside notifiers)
|
||||||
|
|
||||||
|
:param include_online: Set False if to exclude derived notifiers from library updates.
|
||||||
|
For example, Trakt doesn't need to be updated when renaming the episode name part of a filename,
|
||||||
|
therefore, this is set False for that specific notification use case update.
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,9 @@ class TraktNotifier(BaseNotifier):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def update_library(self, ep_obj=None, **kwargs):
|
def update_library(self, ep_obj=None, include_online=True, **kwargs):
|
||||||
|
|
||||||
|
if include_online:
|
||||||
self._update_collection(ep_obj)
|
self._update_collection(ep_obj)
|
||||||
|
|
||||||
def _update_collection(self, ep_obj):
|
def _update_collection(self, ep_obj):
|
||||||
|
|
|
@ -78,9 +78,9 @@ if coreid_warnings:
|
||||||
tz_p = du_parser()
|
tz_p = du_parser()
|
||||||
invalid_date_limit = datetime.date(1900, 1, 1)
|
invalid_date_limit = datetime.date(1900, 1, 1)
|
||||||
|
|
||||||
tba_ep_name = re.compile(r'^(episode \d+|tba)$', flags=re.I)
|
tba_tvinfo_name = re.compile(r'^(episode \d+|tba)$', flags=re.I)
|
||||||
tba_ep_filename = re.compile(r'\b(episode \d+|tba)\b', flags=re.I)
|
tba_file_name = re.compile(r'\b(episode.\d+|tba)\b', flags=re.I)
|
||||||
ep_name_regex = re.compile(r'%E[._]?N', flags=re.I)
|
pattern_ep_name = re.compile(r'%E[._]?N', flags=re.I)
|
||||||
|
|
||||||
# status codes for switching tv show source
|
# status codes for switching tv show source
|
||||||
TVSWITCH_DUPLICATE_SHOW = 0
|
TVSWITCH_DUPLICATE_SHOW = 0
|
||||||
|
@ -4470,20 +4470,20 @@ class TVEpisode(TVEpisodeBase):
|
||||||
|
|
||||||
if sickgear.RENAME_EPISODES and self.with_ep_name():
|
if sickgear.RENAME_EPISODES and self.with_ep_name():
|
||||||
ep_filename = os.path.basename(self._location or '')
|
ep_filename = os.path.basename(self._location or '')
|
||||||
ep_basename, ep_ext = os.path.splitext(ep_filename)
|
ep_basename, _ = os.path.splitext(ep_filename)
|
||||||
ep_name_changed = (bool(self._location) and old_name != self._name) or \
|
ep_name_changed = (bool(self._location) and old_name != self._name) or \
|
||||||
(sickgear.RENAME_NAME_CHANGED_EPISODES and bool(ep_basename)
|
(sickgear.RENAME_NAME_CHANGED_EPISODES and bool(ep_basename)
|
||||||
and ep_basename != os.path.basename(self.proper_path()))
|
and ep_basename != os.path.basename(self.proper_path()))
|
||||||
ep_name_tba_changed = (ep_name_changed and bool(tba_ep_name.search(old_name))) or \
|
ep_name_tba_changed = (ep_name_changed and bool(tba_tvinfo_name.search(old_name))) or \
|
||||||
(not bool(tba_ep_name.search(self._name or ''))
|
(not bool(tba_tvinfo_name.search(self._name or ''))
|
||||||
and bool(tba_ep_filename.search(ep_filename or '')))
|
and bool(tba_file_name.search(ep_filename or '')))
|
||||||
if ((ep_name_tba_changed and sickgear.RENAME_TBA_EPISODES)
|
if ((ep_name_tba_changed and sickgear.RENAME_TBA_EPISODES)
|
||||||
or (ep_name_changed and sickgear.RENAME_NAME_CHANGED_EPISODES)):
|
or (ep_name_changed and sickgear.RENAME_NAME_CHANGED_EPISODES)):
|
||||||
if (re_res := self.rename()):
|
# noinspection PySimplifyBooleanCheck
|
||||||
notifiers.notify_update_library(self)
|
if re_res := self.rename():
|
||||||
|
notifiers.notify_update_library(self, include_online=False)
|
||||||
elif False == re_res:
|
elif False == re_res:
|
||||||
# rename failed
|
logger.debug('Failed to rename files to TV info episode name')
|
||||||
logger.debug('Failed to change changed episode name based filename')
|
|
||||||
|
|
||||||
# shouldn't get here probably
|
# shouldn't get here probably
|
||||||
else:
|
else:
|
||||||
|
@ -5144,17 +5144,8 @@ class TVEpisode(TVEpisodeBase):
|
||||||
"""
|
"""
|
||||||
Just the folder name of the episode
|
Just the folder name of the episode
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if None is pattern:
|
if None is pattern:
|
||||||
# we only use ABD if it's enabled, this is an ABD show, AND this is not a multi-ep
|
pattern = self.naming_pattern()
|
||||||
if self._show_obj.air_by_date and sickgear.NAMING_CUSTOM_ABD and not self.related_ep_obj:
|
|
||||||
pattern = sickgear.NAMING_ABD_PATTERN
|
|
||||||
elif self._show_obj.sports and sickgear.NAMING_CUSTOM_SPORTS and not self.related_ep_obj:
|
|
||||||
pattern = sickgear.NAMING_SPORTS_PATTERN
|
|
||||||
elif self._show_obj.anime and sickgear.NAMING_CUSTOM_ANIME:
|
|
||||||
pattern = sickgear.NAMING_ANIME_PATTERN
|
|
||||||
else:
|
|
||||||
pattern = sickgear.NAMING_PATTERN
|
|
||||||
|
|
||||||
# split off the dirs only, if they exist
|
# split off the dirs only, if they exist
|
||||||
name_groups = re.split(r'[\\/]', pattern)
|
name_groups = re.split(r'[\\/]', pattern)
|
||||||
|
@ -5164,41 +5155,37 @@ class TVEpisode(TVEpisodeBase):
|
||||||
return ''
|
return ''
|
||||||
return self._format_pattern(os.sep.join(name_groups[:-1]), multi)
|
return self._format_pattern(os.sep.join(name_groups[:-1]), multi)
|
||||||
|
|
||||||
def with_ep_name(self):
|
|
||||||
"""
|
|
||||||
returns if the episode naming contain the episode name
|
|
||||||
"""
|
|
||||||
# type: (...) -> bool
|
|
||||||
if self._show_obj.air_by_date and sickgear.NAMING_CUSTOM_ABD and not self.related_ep_obj:
|
|
||||||
return bool(ep_name_regex.search(sickgear.NAMING_ABD_PATTERN))
|
|
||||||
elif self._show_obj.sports and sickgear.NAMING_CUSTOM_SPORTS and not self.related_ep_obj:
|
|
||||||
return bool(ep_name_regex.search(sickgear.NAMING_SPORTS_PATTERN))
|
|
||||||
elif self._show_obj.anime and sickgear.NAMING_CUSTOM_ANIME:
|
|
||||||
return bool(ep_name_regex.search(sickgear.NAMING_ANIME_PATTERN))
|
|
||||||
else:
|
|
||||||
return bool(ep_name_regex.search(sickgear.NAMING_PATTERN))
|
|
||||||
|
|
||||||
def formatted_filename(self, pattern=None, multi=None, anime_type=None):
|
def formatted_filename(self, pattern=None, multi=None, anime_type=None):
|
||||||
"""
|
"""
|
||||||
Just the filename of the episode, formatted based on the naming settings
|
Just the filename of the episode, formatted based on the naming settings
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if None is pattern:
|
|
||||||
# we only use ABD if it's enabled, this is an ABD show, AND this is not a multi-ep
|
|
||||||
if self._show_obj.air_by_date and sickgear.NAMING_CUSTOM_ABD and not self.related_ep_obj:
|
|
||||||
pattern = sickgear.NAMING_ABD_PATTERN
|
|
||||||
elif self._show_obj.sports and sickgear.NAMING_CUSTOM_SPORTS and not self.related_ep_obj:
|
|
||||||
pattern = sickgear.NAMING_SPORTS_PATTERN
|
|
||||||
elif self._show_obj.anime and sickgear.NAMING_CUSTOM_ANIME:
|
|
||||||
pattern = sickgear.NAMING_ANIME_PATTERN
|
|
||||||
else:
|
|
||||||
pattern = sickgear.NAMING_PATTERN
|
|
||||||
|
|
||||||
# split off the dirs only, if they exist
|
# split off the dirs only, if they exist
|
||||||
name_groups = re.split(r'[\\/]', pattern)
|
name_groups = re.split(r'[\\/]', pattern or self.naming_pattern())
|
||||||
|
|
||||||
return self._format_pattern(name_groups[-1], multi, anime_type)
|
return self._format_pattern(name_groups[-1], multi, anime_type)
|
||||||
|
|
||||||
|
def with_ep_name(self):
|
||||||
|
# type: (...) -> bool
|
||||||
|
"""
|
||||||
|
returns if the episode naming contain the episode name
|
||||||
|
"""
|
||||||
|
return bool(pattern_ep_name.search(self.naming_pattern()))
|
||||||
|
|
||||||
|
def naming_pattern(self):
|
||||||
|
# type: (...) -> AnyStr
|
||||||
|
"""
|
||||||
|
return a naming pattern for this show
|
||||||
|
"""
|
||||||
|
# we only use ABD if it's enabled, this is an ABD show, AND this is not a multi-ep
|
||||||
|
if self._show_obj.air_by_date and sickgear.NAMING_CUSTOM_ABD and not self.related_ep_obj:
|
||||||
|
return sickgear.NAMING_ABD_PATTERN
|
||||||
|
if self._show_obj.sports and sickgear.NAMING_CUSTOM_SPORTS and not self.related_ep_obj:
|
||||||
|
return sickgear.NAMING_SPORTS_PATTERN
|
||||||
|
if self._show_obj.anime and sickgear.NAMING_CUSTOM_ANIME:
|
||||||
|
return sickgear.NAMING_ANIME_PATTERN
|
||||||
|
|
||||||
|
return sickgear.NAMING_PATTERN
|
||||||
|
|
||||||
def rename(self):
|
def rename(self):
|
||||||
# type: (...) -> Optional[bool]
|
# type: (...) -> Optional[bool]
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -8498,19 +8498,19 @@ class ConfigMediaProcess(Config):
|
||||||
t.submenu = self.config_menu('Processing')
|
t.submenu = self.config_menu('Processing')
|
||||||
return t.respond()
|
return t.respond()
|
||||||
|
|
||||||
def save_post_processing(self, tv_download_dir=None, process_automatically=None, mediaprocess_interval=None,
|
def save_post_processing(
|
||||||
unpack=None, keep_processed_dir=None, process_method=None,
|
self, tv_download_dir=None, process_method=None, process_automatically=None, mediaprocess_interval=None,
|
||||||
extra_scripts='', sg_extra_scripts='',
|
postpone_if_sync_files=None, process_positive_log=None, extra_scripts='', sg_extra_scripts='',
|
||||||
rename_episodes=None, airdate_episodes=None,
|
unpack=None, skip_removed_files=None, move_associated_files=None, nfo_rename=None,
|
||||||
move_associated_files=None, postpone_if_sync_files=None, process_positive_log=None,
|
rename_episodes=None, rename_tba_episodes=None, rename_name_changed_episodes=None,
|
||||||
naming_custom_abd=None, naming_custom_sports=None, naming_custom_anime=None,
|
airdate_episodes=None, use_failed_downloads=None, delete_failed=None,
|
||||||
naming_strip_year=None, use_failed_downloads=None, delete_failed=None,
|
naming_pattern=None, naming_multi_ep=None, naming_strip_year=None,
|
||||||
skip_removed_files=None, nfo_rename=None,
|
naming_custom_abd=None, naming_abd_pattern=None,
|
||||||
xbmc_data=None, xbmc_12plus_data=None, mediabrowser_data=None, sony_ps3_data=None,
|
naming_custom_sports=None, naming_sports_pattern=None,
|
||||||
wdtv_data=None, tivo_data=None, mede8er_data=None, kodi_data=None,
|
naming_custom_anime=None, naming_anime_pattern=None,naming_anime_multi_ep=None, naming_anime=None,
|
||||||
naming_pattern=None, naming_multi_ep=None,
|
kodi_data=None, mede8er_data=None, xbmc_data=None, mediabrowser_data=None,
|
||||||
naming_anime=None, naming_anime_pattern=None, naming_anime_multi_ep=None,
|
sony_ps3_data=None, tivo_data=None, wdtv_data=None, xbmc_12plus_data=None,
|
||||||
naming_abd_pattern=None, naming_sports_pattern=None,
|
keep_processed_dir=None,
|
||||||
**kwargs): # kwargs picks up deprecated vars sent from legacy UIs
|
**kwargs): # kwargs picks up deprecated vars sent from legacy UIs
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
|
@ -8536,6 +8536,8 @@ class ConfigMediaProcess(Config):
|
||||||
sickgear.EXTRA_SCRIPTS = [x.strip() for x in extra_scripts.split('|') if x.strip()]
|
sickgear.EXTRA_SCRIPTS = [x.strip() for x in extra_scripts.split('|') if x.strip()]
|
||||||
sickgear.SG_EXTRA_SCRIPTS = [x.strip() for x in sg_extra_scripts.split('|') if x.strip()]
|
sickgear.SG_EXTRA_SCRIPTS = [x.strip() for x in sg_extra_scripts.split('|') if x.strip()]
|
||||||
sickgear.RENAME_EPISODES = config.checkbox_to_value(rename_episodes)
|
sickgear.RENAME_EPISODES = config.checkbox_to_value(rename_episodes)
|
||||||
|
sickgear.RENAME_TBA_EPISODES = config.checkbox_to_value(rename_tba_episodes)
|
||||||
|
sickgear.RENAME_NAME_CHANGED_EPISODES = config.checkbox_to_value(rename_name_changed_episodes)
|
||||||
sickgear.AIRDATE_EPISODES = config.checkbox_to_value(airdate_episodes)
|
sickgear.AIRDATE_EPISODES = config.checkbox_to_value(airdate_episodes)
|
||||||
sickgear.MOVE_ASSOCIATED_FILES = config.checkbox_to_value(move_associated_files)
|
sickgear.MOVE_ASSOCIATED_FILES = config.checkbox_to_value(move_associated_files)
|
||||||
sickgear.POSTPONE_IF_SYNC_FILES = config.checkbox_to_value(postpone_if_sync_files)
|
sickgear.POSTPONE_IF_SYNC_FILES = config.checkbox_to_value(postpone_if_sync_files)
|
||||||
|
|
Loading…
Reference in a new issue