Exemple #1
0
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()
Exemple #2
0
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,))
Exemple #3
0
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()