|
@ -21,10 +21,6 @@ log = CPLog(__name__) |
|
|
|
|
|
|
|
|
class Scanner(Plugin): |
|
|
class Scanner(Plugin): |
|
|
|
|
|
|
|
|
minimal_filesize = { |
|
|
|
|
|
'media': 314572800, # 300MB |
|
|
|
|
|
'trailer': 1048576, # 1MB |
|
|
|
|
|
} |
|
|
|
|
|
ignored_in_path = [os.path.sep + 'extracted' + os.path.sep, 'extracting', '_unpack', '_failed_', '_unknown_', '_exists_', '_failed_remove_', |
|
|
ignored_in_path = [os.path.sep + 'extracted' + os.path.sep, 'extracting', '_unpack', '_failed_', '_unknown_', '_exists_', '_failed_remove_', |
|
|
'_failed_rename_', '.appledouble', '.appledb', '.appledesktop', os.path.sep + '._', '.ds_store', 'cp.cpnfo', |
|
|
'_failed_rename_', '.appledouble', '.appledb', '.appledesktop', os.path.sep + '._', '.ds_store', 'cp.cpnfo', |
|
|
'thumbs.db', 'ehthumbs.db', 'desktop.ini'] #unpacking, smb-crap, hidden files |
|
|
'thumbs.db', 'ehthumbs.db', 'desktop.ini'] #unpacking, smb-crap, hidden files |
|
@ -52,6 +48,12 @@ class Scanner(Plugin): |
|
|
'leftover': ('leftover', 'leftover'), |
|
|
'leftover': ('leftover', 'leftover'), |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
file_sizes = { # in MB |
|
|
|
|
|
'movie': {'min': 300}, |
|
|
|
|
|
'trailer': {'min': 2, 'max': 250}, |
|
|
|
|
|
'backdrop': {'min': 0, 'max': 5}, |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
codecs = { |
|
|
codecs = { |
|
|
'audio': ['dts', 'ac3', 'ac3d', 'mp3'], |
|
|
'audio': ['dts', 'ac3', 'ac3d', 'mp3'], |
|
|
'video': ['x264', 'h264', 'divx', 'xvid'] |
|
|
'video': ['x264', 'h264', 'divx', 'xvid'] |
|
@ -148,7 +150,7 @@ class Scanner(Plugin): |
|
|
continue |
|
|
continue |
|
|
|
|
|
|
|
|
is_dvd_file = self.isDVDFile(file_path) |
|
|
is_dvd_file = self.isDVDFile(file_path) |
|
|
if os.path.getsize(file_path) > self.minimal_filesize['media'] or is_dvd_file: # Minimal 300MB files or is DVD file |
|
|
if self.filesizeBetween(file_path, self.file_sizes['movie']) or is_dvd_file: # Minimal 300MB files or is DVD file |
|
|
|
|
|
|
|
|
# Normal identifier |
|
|
# Normal identifier |
|
|
identifier = self.createStringIdentifier(file_path, folder, exclude_filename = is_dvd_file) |
|
|
identifier = self.createStringIdentifier(file_path, folder, exclude_filename = is_dvd_file) |
|
@ -182,7 +184,6 @@ class Scanner(Plugin): |
|
|
# files will be grouped first. |
|
|
# files will be grouped first. |
|
|
leftovers = set(sorted(leftovers, reverse = True)) |
|
|
leftovers = set(sorted(leftovers, reverse = True)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Group files minus extension |
|
|
# Group files minus extension |
|
|
ignored_identifiers = [] |
|
|
ignored_identifiers = [] |
|
|
for identifier, group in movie_files.iteritems(): |
|
|
for identifier, group in movie_files.iteritems(): |
|
@ -191,7 +192,7 @@ class Scanner(Plugin): |
|
|
log.debug('Grouping files: %s', identifier) |
|
|
log.debug('Grouping files: %s', identifier) |
|
|
|
|
|
|
|
|
has_ignored = 0 |
|
|
has_ignored = 0 |
|
|
for file_path in group['unsorted_files']: |
|
|
for file_path in list(group['unsorted_files']): |
|
|
ext = getExt(file_path) |
|
|
ext = getExt(file_path) |
|
|
wo_ext = file_path[:-(len(ext) + 1)] |
|
|
wo_ext = file_path[:-(len(ext) + 1)] |
|
|
found_files = set([i for i in leftovers if wo_ext in i]) |
|
|
found_files = set([i for i in leftovers if wo_ext in i]) |
|
@ -262,6 +263,10 @@ class Scanner(Plugin): |
|
|
if self.shuttingDown(): |
|
|
if self.shuttingDown(): |
|
|
break |
|
|
break |
|
|
|
|
|
|
|
|
|
|
|
# leftovers should be empty |
|
|
|
|
|
if leftovers: |
|
|
|
|
|
log.debug('Some files are still left over: %s', leftovers) |
|
|
|
|
|
|
|
|
# Cleaning up used |
|
|
# Cleaning up used |
|
|
for identifier in delete_identifiers: |
|
|
for identifier in delete_identifiers: |
|
|
if path_identifiers.get(identifier): |
|
|
if path_identifiers.get(identifier): |
|
@ -434,7 +439,7 @@ class Scanner(Plugin): |
|
|
files = list(group['files']['movie']) |
|
|
files = list(group['files']['movie']) |
|
|
|
|
|
|
|
|
for cur_file in files: |
|
|
for cur_file in files: |
|
|
if os.path.getsize(cur_file) < self.minimal_filesize['media']: continue # Ignore smaller files |
|
|
if not self.filesizeBetween(cur_file, self.file_sizes['movie']): continue # Ignore smaller files |
|
|
|
|
|
|
|
|
meta = self.getMeta(cur_file) |
|
|
meta = self.getMeta(cur_file) |
|
|
|
|
|
|
|
@ -644,7 +649,7 @@ class Scanner(Plugin): |
|
|
def getMediaFiles(self, files): |
|
|
def getMediaFiles(self, files): |
|
|
|
|
|
|
|
|
def test(s): |
|
|
def test(s): |
|
|
return self.filesizeBetween(s, 300, 100000) and getExt(s.lower()) in self.extensions['movie'] and not self.isSampleFile(s) |
|
|
return self.filesizeBetween(s, self.file_sizes['movie']) and getExt(s.lower()) in self.extensions['movie'] and not self.isSampleFile(s) |
|
|
|
|
|
|
|
|
return set(filter(test, files)) |
|
|
return set(filter(test, files)) |
|
|
|
|
|
|
|
@ -669,7 +674,7 @@ class Scanner(Plugin): |
|
|
def getTrailers(self, files): |
|
|
def getTrailers(self, files): |
|
|
|
|
|
|
|
|
def test(s): |
|
|
def test(s): |
|
|
return re.search('(^|[\W_])trailer\d*[\W_]', s.lower()) and self.filesizeBetween(s, 2, 250) |
|
|
return re.search('(^|[\W_])trailer\d*[\W_]', s.lower()) and self.filesizeBetween(s, self.file_sizes['trailer']) |
|
|
|
|
|
|
|
|
return set(filter(test, files)) |
|
|
return set(filter(test, files)) |
|
|
|
|
|
|
|
@ -680,7 +685,7 @@ class Scanner(Plugin): |
|
|
files = set(filter(test, files)) |
|
|
files = set(filter(test, files)) |
|
|
|
|
|
|
|
|
images = { |
|
|
images = { |
|
|
'backdrop': set(filter(lambda s: re.search('(^|[\W_])fanart|backdrop\d*[\W_]', s.lower()) and self.filesizeBetween(s, 0, 5), files)) |
|
|
'backdrop': set(filter(lambda s: re.search('(^|[\W_])fanart|backdrop\d*[\W_]', s.lower()) and self.filesizeBetween(s, self.file_sizes['backdrop']), files)) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
# Rest |
|
|
# Rest |
|
@ -708,16 +713,6 @@ class Scanner(Plugin): |
|
|
log.debug('Ignored "%s" contains "%s".', (filename, i)) |
|
|
log.debug('Ignored "%s" contains "%s".', (filename, i)) |
|
|
return False |
|
|
return False |
|
|
|
|
|
|
|
|
# Sample file |
|
|
|
|
|
if self.isSampleFile(filename): |
|
|
|
|
|
log.debug('Is sample file "%s".', filename) |
|
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
|
|
# Minimal size |
|
|
|
|
|
if self.filesizeBetween(filename, self.minimal_filesize['media']): |
|
|
|
|
|
log.debug('File to small: %s', filename) |
|
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
|
|
# All is OK |
|
|
# All is OK |
|
|
return True |
|
|
return True |
|
|
|
|
|
|
|
@ -726,9 +721,9 @@ class Scanner(Plugin): |
|
|
if is_sample: log.debug('Is sample file: %s', filename) |
|
|
if is_sample: log.debug('Is sample file: %s', filename) |
|
|
return is_sample |
|
|
return is_sample |
|
|
|
|
|
|
|
|
def filesizeBetween(self, file, min = 0, max = 100000): |
|
|
def filesizeBetween(self, file, file_size = []): |
|
|
try: |
|
|
try: |
|
|
return (min * 1048576) < os.path.getsize(file) < (max * 1048576) |
|
|
return (file_size.get('min', 0) * 1048576) < os.path.getsize(file) < (file_size.get('max', 100000) * 1048576) |
|
|
except: |
|
|
except: |
|
|
log.error('Couldn\'t get filesize of %s.', file) |
|
|
log.error('Couldn\'t get filesize of %s.', file) |
|
|
|
|
|
|
|
|