mirror of
https://github.com/ajurna/cbwebreader.git
synced 2025-12-06 06:17:17 +00:00
Merge pull request #77
* added timestamp to comicstatus. * added timestamp to comicstatus.
This commit is contained in:
@@ -1,17 +1,19 @@
|
||||
import mimetypes
|
||||
import zipfile
|
||||
from itertools import chain
|
||||
from pathlib import Path
|
||||
from typing import NamedTuple, List
|
||||
from typing import NamedTuple, List, Optional, Union
|
||||
|
||||
import rarfile
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.db.models import Count, Q, F, Case, When, PositiveSmallIntegerField
|
||||
from django.db.models import Count, Q, F, Case, When, PositiveSmallIntegerField, QuerySet
|
||||
|
||||
from comic import models
|
||||
from comic.errors import NotCompatibleArchive
|
||||
|
||||
|
||||
def generate_directory(user: User, directory=None):
|
||||
def generate_directory(user: User, directory: Optional[models.Directory] = None) -> List[QuerySet]:
|
||||
dir_path = Path(settings.COMIC_BOOK_VOLUME, directory.path) if directory else settings.COMIC_BOOK_VOLUME
|
||||
files = []
|
||||
|
||||
@@ -37,7 +39,6 @@ def generate_directory(user: User, directory=None):
|
||||
models.ComicStatus.objects.bulk_create(new_status)
|
||||
|
||||
file_db_query = file_db_query.annotate(
|
||||
total=Count('comicpage', distinct=True),
|
||||
progress=F('comicstatus__last_read_page') + 1,
|
||||
finished=F('comicstatus__finished'),
|
||||
unread=F('comicstatus__unread'),
|
||||
@@ -60,7 +61,7 @@ def generate_directory(user: User, directory=None):
|
||||
return files
|
||||
|
||||
|
||||
def clean_directories(directories, dir_path, directory=None):
|
||||
def clean_directories(directories: QuerySet, dir_path: Path, directory: Optional[models.Directory] = None) -> None:
|
||||
dir_db_set = set(Path(settings.COMIC_BOOK_VOLUME, x.path) for x in directories)
|
||||
dir_list = set(x for x in sorted(dir_path.glob('*')) if x.is_dir())
|
||||
# Create new directories db instances
|
||||
@@ -72,7 +73,7 @@ def clean_directories(directories, dir_path, directory=None):
|
||||
models.Directory.objects.get(name=stale_directory.name, parent=directory).delete()
|
||||
|
||||
|
||||
def clean_files(files, user, dir_path, directory=None):
|
||||
def clean_files(files: QuerySet, user: User, dir_path: Path, directory: Optional[models.Directory] = None) -> None:
|
||||
file_list = set(x for x in sorted(dir_path.glob('*')) if x.is_file())
|
||||
files_db_set = set(Path(dir_path, x.file_name) for x in files)
|
||||
|
||||
@@ -80,34 +81,23 @@ def clean_files(files, user, dir_path, directory=None):
|
||||
books_to_add = []
|
||||
for new_comic in file_list - files_db_set:
|
||||
if new_comic.suffix.lower() in settings.SUPPORTED_FILES:
|
||||
books_to_add.append(
|
||||
models.ComicBook(file_name=new_comic.name, directory=directory)
|
||||
)
|
||||
new_book = models.ComicBook(file_name=new_comic.name, directory=directory)
|
||||
archive, archive_type = new_book.get_archive()
|
||||
try:
|
||||
if archive_type == 'archive':
|
||||
new_book.page_count = len(get_archive_files(archive))
|
||||
elif archive_type == 'pdf':
|
||||
new_book.page_count = archive.page_count
|
||||
except NotCompatibleArchive:
|
||||
pass
|
||||
books_to_add.append(new_book)
|
||||
models.ComicBook.objects.bulk_create(books_to_add)
|
||||
|
||||
pages_to_add = []
|
||||
status_to_add = []
|
||||
for book in books_to_add:
|
||||
status_to_add.append(models.ComicStatus(user=user, comic=book))
|
||||
try:
|
||||
archive, archive_type = book.get_archive()
|
||||
if archive_type == 'archive':
|
||||
pages_to_add.extend([
|
||||
models.ComicPage(
|
||||
Comic=book, index=idx, page_file_name=page.file_name, content_type=page.mime_type
|
||||
) for idx, page in enumerate(get_archive_files(archive))
|
||||
])
|
||||
elif archive_type == 'pdf':
|
||||
pages_to_add.extend([
|
||||
models.ComicPage(
|
||||
Comic=book, index=idx, page_file_name=idx + 1, content_type='application/pdf'
|
||||
) for idx in range(archive.page_count)
|
||||
])
|
||||
except NotCompatibleArchive:
|
||||
pass
|
||||
|
||||
models.ComicStatus.objects.bulk_create(status_to_add)
|
||||
models.ComicPage.objects.bulk_create(pages_to_add)
|
||||
|
||||
# Remove stale comic instances
|
||||
for stale_comic in files_db_set - file_list:
|
||||
@@ -119,7 +109,7 @@ class ArchiveFile(NamedTuple):
|
||||
mime_type: str
|
||||
|
||||
|
||||
def get_archive_files(archive) -> List[ArchiveFile]:
|
||||
def get_archive_files(archive: Union[zipfile.ZipFile, rarfile.RarFile]) -> List[ArchiveFile]:
|
||||
return [
|
||||
ArchiveFile(x, mimetypes.guess_type(x)[0]) for x in sorted(archive.namelist())
|
||||
if not x.endswith('/') and mimetypes.guess_type(x)[0]
|
||||
|
||||
Reference in New Issue
Block a user