If the name is not sufficient for a valid guess a insuffienet name error is thrown which is not handled correctly for both files and folders, then returned to the user to try move it by changing input name.
This commit is contained in:
39
src/core.py
39
src/core.py
@@ -19,7 +19,7 @@ from titlecase import titlecase
|
||||
import langdetect
|
||||
|
||||
import env_variables as env
|
||||
from exceptions import InsufficientInfoError
|
||||
from exceptions import InsufficientNameError
|
||||
|
||||
from video import VIDEO_EXTENSIONS, Episode, Movie, Video
|
||||
from subtitle import SUBTITLE_EXTENSIONS, Subtitle, get_subtitle_path
|
||||
@@ -28,9 +28,9 @@ from utils import sanitize, refine
|
||||
logging.basicConfig(filename=env.logfile, level=logging.DEBUG)
|
||||
logger = logging.getLogger('seasonedParser')
|
||||
fh = logging.FileHandler(env.logfile)
|
||||
fh.setLevel(logging.DEBUG)
|
||||
fh.setLevel(logging.INFO)
|
||||
sh = logging.StreamHandler()
|
||||
sh.setLevel(logging.DEBUG)
|
||||
sh.setLevel(logging.ERROR)
|
||||
|
||||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
fh.setFormatter(formatter)
|
||||
@@ -158,6 +158,8 @@ def scan_videos(path):
|
||||
|
||||
# walk the path
|
||||
videos = []
|
||||
insufficient_name = []
|
||||
errors_path = []
|
||||
for dirpath, dirnames, filenames in os.walk(path):
|
||||
logger.debug('Walking directory %r', dirpath)
|
||||
|
||||
@@ -189,8 +191,13 @@ def scan_videos(path):
|
||||
if filename.endswith(VIDEO_EXTENSIONS): # video
|
||||
try:
|
||||
video = scan_video(filepath)
|
||||
except InsufficientInfoError as e:
|
||||
logger.info(e)
|
||||
insufficient_name.append(filepath)
|
||||
continue
|
||||
except ValueError: # pragma: no cover
|
||||
logger.exception('Error scanning video')
|
||||
errors_path.append(filepath)
|
||||
continue
|
||||
else: # pragma: no cover
|
||||
raise ValueError('Unsupported file %r' % filename)
|
||||
@@ -199,7 +206,7 @@ def scan_videos(path):
|
||||
|
||||
bar.update(1)
|
||||
|
||||
return videos
|
||||
return videos, insufficient_name, errors_path
|
||||
|
||||
|
||||
def organize_files(path):
|
||||
@@ -261,7 +268,7 @@ def save_subtitles(files, single=False, directory=None, encoding=None):
|
||||
|
||||
def scan_folder(path):
|
||||
videos = []
|
||||
insufficient_info = []
|
||||
insufficient_name = []
|
||||
errored_paths = []
|
||||
logger.debug('Collecting path %s', path)
|
||||
|
||||
@@ -280,9 +287,9 @@ def scan_folder(path):
|
||||
video = scan_video(path)
|
||||
videos.append(video)
|
||||
|
||||
except InsufficientInfoError as e:
|
||||
logger.error(e)
|
||||
insufficient_info.append(path)
|
||||
except InsufficientNameError as e:
|
||||
logger.info(e)
|
||||
insufficient_name.append(path)
|
||||
|
||||
# directories
|
||||
if os.path.isdir(path):
|
||||
@@ -290,24 +297,21 @@ def scan_folder(path):
|
||||
|
||||
scanned_videos = []
|
||||
try:
|
||||
scanned_videos = scan_videos(path)
|
||||
except InsufficientInfoError as e:
|
||||
logger.error(e)
|
||||
insufficient_info.append(path)
|
||||
videos, insufficient_name, errored_paths = scan_videos(path)
|
||||
except:
|
||||
logger.exception('Unexpected error while collecting directory path %s', path)
|
||||
errored_paths.append(path)
|
||||
|
||||
click.echo('%s video%s collected / %s file%s with insufficient info / %s error%s' % (
|
||||
click.echo('%s video%s collected / %s file%s with insufficient name / %s error%s' % (
|
||||
click.style(str(len(videos)), bold=True, fg='green' if videos else None),
|
||||
's' if len(videos) > 1 else '',
|
||||
click.style(str(len(insufficient_info)), bold=True, fg='yellow' if insufficient_info else None),
|
||||
's' if len(insufficient_info) > 1 else '',
|
||||
click.style(str(len(insufficient_name)), bold=True, fg='yellow' if insufficient_name else None),
|
||||
's' if len(insufficient_name) > 1 else '',
|
||||
click.style(str(len(errored_paths)), bold=True, fg='red' if errored_paths else None),
|
||||
's' if len(errored_paths) > 1 else '',
|
||||
))
|
||||
|
||||
return videos, insufficient_info
|
||||
return videos, insufficient_name
|
||||
|
||||
def pickforgirlscouts(video):
|
||||
if video.sufficientInfo():
|
||||
@@ -334,3 +338,6 @@ def moveHome(video):
|
||||
logger.info("Moving subtitle file from: '{}' to: '{}'".format(oldpath, newpath))
|
||||
shutil.move(oldpath, newpath)
|
||||
|
||||
# Give feedback before delete ?
|
||||
def empthDirectory(paths):
|
||||
pass
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3.6
|
||||
|
||||
class InsufficientInfoError(Exception):
|
||||
class InsufficientNameError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
22
src/video.py
22
src/video.py
@@ -12,7 +12,7 @@ from titlecase import titlecase
|
||||
import hashlib, tvdb_api
|
||||
|
||||
import env_variables as env
|
||||
from exceptions import InsufficientInfoError
|
||||
from exceptions import InsufficientNameError
|
||||
|
||||
logger = logging.getLogger('seasonedParser')
|
||||
|
||||
@@ -34,13 +34,11 @@ class Video(object):
|
||||
:param str resolution: resolution of the video stream (480p, 720p, 1080p or 1080i, 4K).
|
||||
:param str video_codec: codec of the video stream.
|
||||
:param str audio_codec: codec of the main audio stream.
|
||||
:param str move_location: location to move file to.
|
||||
:param dict name_hash: hashes of the video file by provider names.
|
||||
:param int size: size of the video file in bytes.
|
||||
:param set subtitles: existing subtitle languages.
|
||||
"""
|
||||
def __init__(self, name, hash=None, size=None, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None,
|
||||
move_location=None, subtitles=None, embeded_subtitles=None):
|
||||
subtitles=None, embeded_subtitles=None):
|
||||
#: Name or path of the video
|
||||
self.name = name
|
||||
|
||||
@@ -65,9 +63,6 @@ class Video(object):
|
||||
#: Codec of the main audio stream
|
||||
self.audio_codec = audio_codec
|
||||
|
||||
#: optimal move_location path; parent folder.
|
||||
self.move_location = move_location
|
||||
|
||||
#: Existing subtitle languages
|
||||
self.subtitles = subtitles or set()
|
||||
|
||||
@@ -157,11 +152,15 @@ class Episode(Video):
|
||||
|
||||
@classmethod
|
||||
def fromguess(cls, name, guess):
|
||||
logger.info('Guess: {}'.format(guess))
|
||||
if guess['type'] != 'episode':
|
||||
raise ValueError('The guess must be an episode guess')
|
||||
|
||||
if 'title' not in guess or 'season' not in guess or 'episode' not in guess:
|
||||
raise InsufficientInfoError('Insufficient data to process the guess')
|
||||
raise InsufficientNameError('Guess failed to have sufficient data from query: {}'.format(name))
|
||||
|
||||
if any([isinstance(x, list) for x in [guess['title'], guess['season'], guess['episode']]]):
|
||||
raise InsufficientNameError('Guess could not be parsed, list values found.')
|
||||
|
||||
return cls(name, guess['title'], guess.get('season', 1), guess['episode'], title=guess.get('episode_title'),
|
||||
year=guess.get('year'), format=guess.get('format'), original_series='year' not in guess,
|
||||
@@ -179,12 +178,9 @@ class Episode(Video):
|
||||
return os.path.join(env.SHOWBASE, grandParent, parent, os.path.basename(self.name))
|
||||
|
||||
def __repr__(self):
|
||||
if self.year is None:
|
||||
return '<%s [%r, %dx%s]>' % (self.__class__.__name__, self.series, self.season, self.episode)
|
||||
if self.subtitles is not None and len(self.subtitles) > 0:
|
||||
return '<%s [%r, %dx%s] %s>' % (self.__class__.__name__, self.series, self.season, self.episode, self.subtitles)
|
||||
|
||||
return '<%s [%r, %d, %dx%d]>' % (self.__class__.__name__, self.series, self.year, self.season, self.episode)
|
||||
return '<%s [%r, %dx%d]>' % (self.__class__.__name__, self.series, self.season, self.episode)
|
||||
|
||||
class Movie(Video):
|
||||
"""Movie :class:`Video`.
|
||||
@@ -207,7 +203,7 @@ class Movie(Video):
|
||||
raise ValueError('The guess must be a movie guess')
|
||||
|
||||
if 'title' not in guess or 'year' not in guess:
|
||||
raise InsufficientInfoError('Insufficient data to process the guess')
|
||||
raise InsufficientNameError('Guess failed to have sufficient data from query: {}'.format(name))
|
||||
|
||||
return cls(name, guess['title'], format=guess.get('format'), release_group=guess.get('release_group'),
|
||||
resolution=guess.get('screen_size'), video_codec=guess.get('video_codec'),
|
||||
|
||||
Reference in New Issue
Block a user