Adds supports for ComicInfo.xml files
This commit is contained in:
@@ -33,6 +33,7 @@ from pathlib import Path
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
def file_safe_string(string):
|
||||
@@ -537,6 +538,64 @@ class ComicStrip(ImageRepo, ABC):
|
||||
"""
|
||||
self.transformed_images = self.images
|
||||
|
||||
def create_comic_info(self) -> str:
|
||||
"""
|
||||
Creates the contents of a ComicInfo.xml file.
|
||||
"""
|
||||
soup = BeautifulSoup('<?xml version="1.0" encoding="utf-8"?><ComicInfo></ComicInfo>', features="xml")
|
||||
info_tag = soup.find("ComicInfo")
|
||||
info_tag.append(soup.new_tag("Title", string=self.title))
|
||||
info_tag.append(soup.new_tag("Series", string=self.comic.title))
|
||||
number_el = soup.new_tag("Number")
|
||||
if type(self.identifier) == int:
|
||||
number_el.string = str(self.identifier)
|
||||
elif (type(self.identifier) == list or type(self.identifier) == tuple) and type(self.identifier[-1]) == int:
|
||||
number_el.string = str(self.identifier[-1])
|
||||
if number_el.string:
|
||||
info_tag.append(number_el)
|
||||
if self.date:
|
||||
info_tag.append(soup.new_tag("Year", string=str(self.date.year)))
|
||||
info_tag.append(soup.new_tag("Month", string=str(self.date.month)))
|
||||
info_tag.append(soup.new_tag("Day", string=str(self.date.day)))
|
||||
if self.comic.author:
|
||||
if type(self.comic.author) == str:
|
||||
info_tag.append(soup.new_tag("Writer", string=self.comic.author))
|
||||
elif type(self.comic.author) == list:
|
||||
authors = {}
|
||||
writer_string = ""
|
||||
for author in self.comic.author:
|
||||
author_class = None
|
||||
if type(author) == str:
|
||||
author_name = author
|
||||
author_class = "Writer"
|
||||
elif type(author) == dict:
|
||||
author_name = author["name"]
|
||||
if author["role"].lower() in ("writer", "author", "creator"):
|
||||
author_class = "Writer"
|
||||
elif author["role"].lower() in ("penciller"):
|
||||
author_class = "Penciller"
|
||||
elif author["role"].lower() in ("inker"):
|
||||
author_class = "Inker"
|
||||
elif author["role"].lower() in ("colorist"):
|
||||
author_class = "Colorist"
|
||||
elif author["role"].lower() in ("letterer"):
|
||||
author_class = "Letterer"
|
||||
elif author["role"].lower() in ("coverartist", "conver_artist"):
|
||||
author_class = "CoverArtist"
|
||||
elif author["role"].lower() in ("editor"):
|
||||
author_class = "Editor"
|
||||
elif author["role"].lower() in ("translator"):
|
||||
author_class = "Translator"
|
||||
if author_class not in authors:
|
||||
authors[author_class] = author_name
|
||||
else:
|
||||
authors[author_class] += "," + author_name
|
||||
for author_class, author_list in authors.items():
|
||||
info_tag.append(soup.new_tag(author_class, string=author_list))
|
||||
info_tag.append(soup.new_tag("Format", string="Web"))
|
||||
info_tag.append(soup.new_tag("PageCount", string=str(len(self.transformed_images))))
|
||||
return str(soup)
|
||||
|
||||
def package_data(self, base_path: Path):
|
||||
"""
|
||||
Compresses all the data into a cbz file.
|
||||
@@ -569,6 +628,11 @@ class ComicStrip(ImageRepo, ABC):
|
||||
logging.info("Packaging %s" % image_path.suffix)
|
||||
with open(image.name, 'rb') as image_stream, comic_zip.open(str(i + 1) + (image_path.suffix or '.png'), 'w') as zip_stream:
|
||||
zip_stream.write(image_stream.read())
|
||||
# Add a ComicInfo file
|
||||
comic_info = self.create_comic_info()
|
||||
if comic_info:
|
||||
with comic_zip.open("ComicInfo.xml", 'w') as zip_stream:
|
||||
zip_stream.write(comic_info.encode("utf-8"));
|
||||
# Delete the base images, as they are no longer needed.
|
||||
# We cannot touch the transformed images, since some
|
||||
# of them may come directly from the base comic, and
|
||||
|
||||
Reference in New Issue
Block a user