11import logging
22from datetime import date
33from enum import Enum
4+ from io import BytesIO
45from pathlib import Path
56from platform import python_version
67from typing import Annotated
1415from perdoo .comic .archives import ArchiveSession
1516from perdoo .comic .errors import ComicArchiveError , ComicMetadataError
1617from perdoo .comic .metadata import ComicInfo , MetronInfo
18+ from perdoo .comic .metadata .comic_info import Page , PageType
1719from perdoo .comic .metadata .metron_info import Id , InformationSource
1820from perdoo .console import CONSOLE
1921from 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+
186219def 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 ())
0 commit comments