Skip to content

Commit 926e0ea

Browse files
Readd handling comicinfo pages
1 parent d6f7925 commit 926e0ea

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ File will be created on first run.
136136
[output]
137137
folder = "~/.local/share/perdoo"
138138
format = "cbz"
139+
image_extensions = [".png", ".jpg", ".jpeg", ".webp", ".jxl"]
139140

140141
[output.comic_info]
141142
create = true
@@ -180,6 +181,10 @@ password = "<Metron Password>"
180181
Defaults to `cbz`.
181182
Options are `cbz`, `cbt` or `cb7`
182183

184+
- `output.image_extensions`
185+
The list of extensions perdoo determines to be images as part of the cleanup step.
186+
Defaults to `[".png", ".jpg", ".jpeg", ".webp", ".jxl"]`
187+
183188
- `output.comic_info.create`
184189
Whether to create a ComicInfo.xml file in the output archive.
185190
Defaults to `true`.

perdoo/cli/process.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
from datetime import date
33
from enum import Enum
4+
from io import BytesIO
45
from pathlib import Path
56
from platform import python_version
67
from typing import Annotated
@@ -14,6 +15,7 @@
1415
from perdoo.comic.archives import ArchiveSession
1516
from perdoo.comic.errors import ComicArchiveError, ComicMetadataError
1617
from perdoo.comic.metadata import ComicInfo, MetronInfo
18+
from perdoo.comic.metadata.comic_info import Page, PageType
1719
from perdoo.comic.metadata.metron_info import Id, InformationSource
1820
from perdoo.console import CONSOLE
1921
from perdoo.services import BaseService, Comicvine, Metron
@@ -183,6 +185,37 @@ def generate_naming(metron_info: MetronInfo | None, comic_info: ComicInfo | None
183185
return filepath.lstrip("/") if filepath else None
184186

185187

188+
def load_page_info(entry: Comic, session: ArchiveSession, comic_info: ComicInfo) -> None:
189+
from PIL import Image # noqa: PLC0415
190+
191+
pages = set()
192+
image_files = entry.list_images(image_extensions=SETTINGS.output.image_extensions)
193+
for idx, file in enumerate(image_files):
194+
page = next((x for x in comic_info.pages if x.image == idx), None)
195+
if page:
196+
page_type = page.type
197+
elif idx == 0:
198+
page_type = PageType.FRONT_COVER
199+
elif idx == len(image_files) - 1:
200+
page_type = PageType.BACK_COVER
201+
else:
202+
page_type = PageType.STORY
203+
if not page:
204+
page = Page(image=idx)
205+
page.type = page_type
206+
page_bytes = entry.read_file(session=session, filename=file.name)
207+
if not page_bytes:
208+
continue
209+
page.image_size = len(page_bytes)
210+
with Image.open(BytesIO(page_bytes)) as page_data:
211+
width, height = page_data.size
212+
page.double_page = width >= height
213+
page.image_height = height
214+
page.image_width = width
215+
pages.add(page)
216+
comic_info.pages = sorted(pages)
217+
218+
186219
def apply_changes(
187220
entry: Comic,
188221
session: ArchiveSession,
@@ -198,6 +231,8 @@ def apply_changes(
198231
else:
199232
session.delete(filename=MetronInfo.FILENAME)
200233

234+
if comic_info and SETTINGS.output.comic_info.handle_pages:
235+
load_page_info(entry=entry, session=session, comic_info=comic_info)
201236
if local_comic_info != comic_info:
202237
if comic_info:
203238
session.write(filename=ComicInfo.FILENAME, data=comic_info.to_bytes())

perdoo/comic/comic.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ def read_metadata(self, session: ArchiveSession) -> tuple[MetronInfo | None, Com
4444
comic_info = ComicInfo.from_bytes(content=session.read(filename=ComicInfo.FILENAME))
4545
return metron_info, comic_info
4646

47+
def read_file(self, session: ArchiveSession, filename: str) -> bytes | None:
48+
if session.contains(filename=filename):
49+
return session.read(filename=filename)
50+
return None
51+
4752
def list_images(self, image_extensions: tuple[str, ...]) -> list[Path]:
4853
return humansorted(
4954
[

0 commit comments

Comments
 (0)