fix scan_comics job to use pathlib.

This commit is contained in:
2021-04-21 09:40:00 +01:00
parent 9fb2a1c15c
commit 5b0a1c7c14

View File

@@ -1,10 +1,13 @@
import os import os
from os.path import isdir from os.path import isdir
from pathlib import Path
from loguru import logger from loguru import logger
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.conf import settings
from comic.models import ComicBook, Directory, Setting, ComicStatus from comic.models import ComicBook, Directory, ComicStatus
class Command(BaseCommand): class Command(BaseCommand):
@@ -12,7 +15,6 @@ class Command(BaseCommand):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.base_dir = Setting.objects.get(name="BASE_DIR").value
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument( parser.add_argument(
@@ -32,30 +34,31 @@ class Command(BaseCommand):
:type directory: Directory :type directory: Directory
""" """
if not directory: if not directory:
comic_dir = self.base_dir comic_dir = settings.COMIC_BOOK_VOLUME
else: else:
comic_dir = os.path.join(self.base_dir, directory.path) comic_dir = Path(settings.COMIC_BOOK_VOLUME, directory.path)
if directory: if directory:
books = ComicBook.objects.filter(directory=directory) books = ComicBook.objects.filter(directory=directory)
else: else:
books = ComicBook.objects.filter(directory__isnull=True) books = ComicBook.objects.filter(directory__isnull=True)
for book in books: for book in books:
if not os.path.isfile(os.path.join(comic_dir, book.file_name)): Path(comic_dir, book.file_name).is_file()
if not Path(comic_dir, book.file_name).is_file():
book.delete() book.delete()
for file in sorted(os.listdir(comic_dir)): for file in sorted(comic_dir.glob('*')):
if isdir(os.path.join(comic_dir, file)): if file.is_dir():
if self.OUTPUT: if self.OUTPUT:
logger.info(f"Scanning Directory {file}") logger.info(f"Scanning Directory {file}")
try: try:
if directory: if directory:
next_directory, created = Directory.objects.get_or_create(name=file, parent=directory) next_directory, created = Directory.objects.get_or_create(name=file.name, parent=directory)
else: else:
next_directory, created = Directory.objects.get_or_create(name=file, parent__isnull=True) next_directory, created = Directory.objects.get_or_create(name=file.name, parent__isnull=True)
except Directory.MultipleObjectsReturned: except Directory.MultipleObjectsReturned:
if directory: if directory:
next_directories = Directory.objects.filter(name=file, parent=directory) next_directories = Directory.objects.filter(name=file.name, parent=directory)
else: else:
next_directories = Directory.objects.filter(name=file, parent__isnull=True) next_directories = Directory.objects.filter(name=file.name, parent__isnull=True)
next_directories = next_directories.order_by('id') next_directories = next_directories.order_by('id')
next_directory = next_directories.first() next_directory = next_directories.first()
next_directories.exclude(id=next_directory.id).delete() next_directories.exclude(id=next_directory.id).delete()
@@ -70,10 +73,10 @@ class Command(BaseCommand):
try: try:
if directory: if directory:
try: try:
book = ComicBook.objects.get(file_name=file, directory=directory) book = ComicBook.objects.get(file_name=file.name, directory=directory)
except ComicBook.MultipleObjectsReturned: except ComicBook.MultipleObjectsReturned:
logger.error(f'Duplicate Comic {file}') logger.error(f'Duplicate Comic {file}')
books = ComicBook.objects.filter(file_name=file, directory=directory).order_by('id') books = ComicBook.objects.filter(file_name=file.name, directory=directory).order_by('id')
book = books.first() book = books.first()
extra_books = books.exclude(id=book.id) extra_books = books.exclude(id=book.id)
extra_books.delete() extra_books.delete()
@@ -81,7 +84,7 @@ class Command(BaseCommand):
book.version = 1 book.version = 1
book.save() book.save()
else: else:
book = ComicBook.objects.get(file_name=file, directory__isnull=True) book = ComicBook.objects.get(file_name=file.name, directory__isnull=True)
if book.version == 0: if book.version == 0:
if directory: if directory:
book.directory = directory book.directory = directory