63 lines
2 KiB
Python
63 lines
2 KiB
Python
from pathlib import Path
|
|
|
|
import xmltodict
|
|
from loguru import logger as log
|
|
|
|
|
|
def write_metadata(chapter_path: Path, metadata: dict) -> None:
|
|
if metadata["Format"] == "pdf":
|
|
log.warning("Can't add metadata for pdf format. Skipping")
|
|
return
|
|
|
|
# define metadata types
|
|
metadata_types: dict[str, type] = {
|
|
"Title": str,
|
|
"Series": str,
|
|
"Number": str,
|
|
"Count": int,
|
|
"Volume": int,
|
|
"Summary": str,
|
|
"Genre": str,
|
|
"Web": str,
|
|
"PageCount": int,
|
|
"LanguageISO": str,
|
|
"Format": str,
|
|
"ScanInformation": str,
|
|
"SeriesGroup": str,
|
|
}
|
|
|
|
try:
|
|
metadata_template = Path("mangadlp/metadata/ComicInfo.xml").read_text(
|
|
encoding="utf8"
|
|
)
|
|
metadata_empty: dict[str, dict] = xmltodict.parse(metadata_template)
|
|
except Exception as exc:
|
|
log.error("Can't open or parse xml template")
|
|
raise exc
|
|
metadata_file = chapter_path / "ComicInfo.xml"
|
|
|
|
log.info(f"Writing metadata to: '{metadata_file}'")
|
|
log.debug(f"Metadata items: {metadata}")
|
|
for key, value in metadata.items():
|
|
# check if metadata is empty
|
|
if not value:
|
|
continue
|
|
# try to match with template
|
|
try:
|
|
metadata_empty["ComicInfo"][key]
|
|
except KeyError:
|
|
continue
|
|
# check if metadata type is correct
|
|
log.debug(f"Key:{key} -> value={type(value)} -> check={metadata_types[key]}")
|
|
if not isinstance(value, metadata_types[key]): # noqa
|
|
log.warning(
|
|
f"Metadata has wrong type: {key}:{metadata_types[key]} -> {value}"
|
|
)
|
|
continue
|
|
|
|
log.debug(f"Updating metadata: '{key}' = '{value}'")
|
|
metadata_empty["ComicInfo"][key] = value
|
|
|
|
metadata_export = xmltodict.unparse(metadata_empty, pretty=True, indent=" " * 4)
|
|
metadata_file.touch(exist_ok=True)
|
|
metadata_file.write_text(metadata_export, encoding="utf8")
|