Fixed saving pages in XML

This commit is contained in:
hyugogirubato
2024-07-18 22:11:24 +02:00
parent 2435ca396d
commit f52e112de9
+20 -7
View File
@@ -1,11 +1,11 @@
from __future__ import annotations from __future__ import annotations
import zipfile import zipfile
from datetime import datetime
from enum import Enum from enum import Enum
from io import BytesIO from io import BytesIO
from typing import Union from typing import Union
from functools import cache
from pathlib import Path from pathlib import Path
@@ -147,7 +147,7 @@ class ComicInfo(ComicModel):
if XML_NAME in names: if XML_NAME in names:
with zf.open(XML_NAME, 'r') as f: with zf.open(XML_NAME, 'r') as f:
comic_info = xmltodict.parse(f.read(), force_list=('Pages',)).get('ComicInfo', {}) comic_info = xmltodict.parse(f.read()).get('ComicInfo', {})
names.remove(XML_NAME) names.remove(XML_NAME)
comic = __info( comic = __info(
@@ -155,7 +155,7 @@ class ComicInfo(ComicModel):
fields=COMIC_FIELDS fields=COMIC_FIELDS
) )
pages_info = comic_info.get('Pages', []) pages_info = comic_info.get('Pages', {}).get('Page', [])
for i, name in enumerate(names): for i, name in enumerate(names):
suffix = Path(name).suffix suffix = Path(name).suffix
if suffix: if suffix:
@@ -201,16 +201,28 @@ class ComicInfo(ComicModel):
items={k: v for k, v in self.__dict__.items() if not k.startswith('_')}, items={k: v for k, v in self.__dict__.items() if not k.startswith('_')},
fields=COMIC_FIELDS) fields=COMIC_FIELDS)
comic_pages = []
comic_info['Pages'] = [] comic_info['Pages'] = []
for page in self.pages: for i, page in enumerate(self.pages):
page_info = __info( page_info = __info(
items={k: v for k, v in page.__dict__.items() if not k.startswith('_')}, items={k: v for k, v in page.__dict__.items() if not k.startswith('_')},
fields=PAGE_FIELDS) fields=PAGE_FIELDS)
comic_info['Pages'].append(page_info) page_info['@Image'] = i
comic_pages.append(dict(sorted(page_info.items())))
# https://github.com/anansi-project/rfcs/issues/3#issuecomment-671631676
utcnow = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + ''
comic_info.update({
'@xmlns:xsd': 'http://www.w3.org/2001/XMLSchema',
'@xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'FileSize': comic_info.get('FileSize', sum(p.image_size for p in self.pages)),
'FileCreationTime': comic_info.get('FileCreationTime', utcnow),
'FileModifiedTime': comic_info.get('FileModifiedTime', utcnow),
'PageCount': len(self.pages),
'Pages': {'Page': comic_pages}
})
return comic_info return comic_info
@cache
def pack(self) -> bytes: def pack(self) -> bytes:
""" """
Pack the comic information and pages into a CBZ file format. Pack the comic information and pages into a CBZ file format.
@@ -220,9 +232,10 @@ class ComicInfo(ComicModel):
""" """
zip_buffer = BytesIO() zip_buffer = BytesIO()
with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_STORED) as zf: with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_STORED) as zf:
content = xmltodict.unparse({'ComicInfo': self.get_info()}, pretty=True)
zf.writestr( zf.writestr(
XML_NAME, XML_NAME,
xmltodict.unparse({'ComicInfo': self.get_info()}, pretty=True).encode('utf-8') content.replace('></Page>', ' />').encode('utf-8')
) )
for i, page in enumerate(self.pages): for i, page in enumerate(self.pages):
zf.writestr(f'page-{i + 1:03d}{page.suffix}', page.content) zf.writestr(f'page-{i + 1:03d}{page.suffix}', page.content)