Files
cbwebreader/comic/management/commands/scan_comics.py

95 lines
3.7 KiB
Python

import os
from os.path import isdir
from pathlib import Path
from loguru import logger
from django.core.management.base import BaseCommand
from django.conf import settings
from comic.models import ComicBook, Directory, ComicStatus
class Command(BaseCommand):
help = "Scan directories to Update Comic DB"
def __init__(self):
super().__init__()
def add_arguments(self, parser):
parser.add_argument(
'--out',
action='store_true',
help='Output to console',
)
def handle(self, *args, **options):
self.OUTPUT = True if options['out'] else False
self.scan_directory()
def scan_directory(self, directory=False):
"""
:type directory: Directory
"""
if not directory:
comic_dir = settings.COMIC_BOOK_VOLUME
else:
comic_dir = Path(settings.COMIC_BOOK_VOLUME, directory.path)
if directory:
books = ComicBook.objects.filter(directory=directory)
else:
books = ComicBook.objects.filter(directory__isnull=True)
for book in books:
Path(comic_dir, book.file_name).is_file()
if not Path(comic_dir, book.file_name).is_file():
book.delete()
for file in sorted(comic_dir.glob('*')):
if file.is_dir():
if self.OUTPUT:
logger.info(f"Scanning Directory {file}")
try:
if directory:
next_directory, created = Directory.objects.get_or_create(name=file.name, parent=directory)
else:
next_directory, created = Directory.objects.get_or_create(name=file.name, parent__isnull=True)
except Directory.MultipleObjectsReturned:
if directory:
next_directories = Directory.objects.filter(name=file.name, parent=directory)
else:
next_directories = Directory.objects.filter(name=file.name, parent__isnull=True)
next_directories = next_directories.order_by('id')
next_directory = next_directories.first()
next_directories.exclude(id=next_directory.id).delete()
logger.error(f'Duplicate Directory {file}')
created = False
if created:
next_directory.save()
self.scan_directory(next_directory)
else:
if self.OUTPUT:
logger.info(f"Scanning File {file}")
try:
if directory:
try:
book = ComicBook.objects.get(file_name=file.name, directory=directory)
except ComicBook.MultipleObjectsReturned:
logger.error(f'Duplicate Comic {file}')
books = ComicBook.objects.filter(file_name=file.name, directory=directory).order_by('id')
book = books.first()
extra_books = books.exclude(id=book.id)
extra_books.delete()
if book.version == 0:
book.version = 1
book.save()
else:
book = ComicBook.objects.get(file_name=file.name, directory__isnull=True)
if book.version == 0:
if directory:
book.directory = directory
book.version = 1
book.save()
except ComicBook.DoesNotExist:
ComicBook.process_comic_book(file, directory)