def _comic_scan(existing_files, mime_cache): files_in_db = set(asfsunicode(x) for x in Comic.objects.values_list('filename', flat=True)) to_add = existing_files.difference(files_in_db) to_remove = files_in_db.difference(existing_files) # Add files not yet in DB scan_message("Adding comics...") for filename in to_add: ok = (filename.endswith('.cbz') or filename.endswith('.zip') or filename.endswith('.rar')) if not ok: continue try: pages = ImagePack(filename) except (IOError, ValueError): continue if len(pages) == 0: # Doesn't contain any images continue title = os.path.splitext(os.path.basename(filename))[0] path = os.path.basename(os.path.dirname(filename)) scan_message("Adding comic: %r" % (filename,)) comic = Comic(filename=filename, title=title, path=path) comic.save() # Remove non-existent entries scan_message("Cleaning up non-existing comics...") for filename in to_remove: Comic.objects.filter(filename=filename).delete()
def _video_scanner(existing_files, mime_cache): files_in_db = set(asfsunicode(x) for x in VideoFile.objects.values_list('filename', flat=True)) to_add = existing_files.difference(files_in_db) to_remove = files_in_db.difference(existing_files) # Add files not yet in DB scan_message("Adding videos...") for filename in to_add: basename = os.path.basename(filename) # Check that the extension and mime type # are indicative of a video file for file_pattern, mime_pattern, replacement_mimetype in \ settings.MEDIASNAKEFILES_ACCEPTED_FILE_TYPES: if (fnmatch.fnmatch(basename, file_pattern) and fnmatch.fnmatch(mime_cache.get(filename), mime_pattern)): if replacement_mimetype is not None: mimetype = replacement_mimetype else: mimetype = mime_cache.get(filename) break else: continue scan_message("Adding video: %r" % (filename,)) video_file = VideoFile(filename=filename, mimetype=mimetype) video_file.save() # Remove non-existent entries scan_message("Cleaning up non-existing videos...") for filename in to_remove: VideoFile.objects.filter(filename=filename).delete() # Create thumbnails, if missing scan_message("Processing video thumbnails...") objects = VideoFile.objects.all() for video_file in objects: if video_file.create_thumbnail(): scan_message("Creating thumbnails: %r" % (video_file.filename,))
def _book_scan(existing_files, mime_cache): files_in_db = set(asfsunicode(x) for x in Ebook.objects.values_list('filename', flat=True)) to_add = existing_files.difference(files_in_db) to_remove = files_in_db.difference(existing_files) # Add files not yet in DB scan_message("Adding books...") for filename in to_add: ok = (filename.endswith('.epub') or filename.endswith('.txt') or filename.endswith('.txt.gz') or filename.endswith('.txt.bz2')) if not ok: continue title = os.path.splitext(os.path.basename(filename))[0] author = None try: pub = open_epub(filename) title = pub.title[:128] author = pub.author[:128] except: # Failed to parse scan_message("Failed to open Epub file %r" % (filename,)) continue scan_message("Adding book: %r" % (filename,)) ebook = Ebook(filename=filename, title=title, author=author) ebook.save() # Remove non-existent entries scan_message("Cleaning up non-existing books...") for filename in to_remove: Ebook.objects.filter(filename=filename).delete()