Adds supports for ComicInfo.xml files
This commit is contained in:
@@ -33,6 +33,7 @@ from pathlib import Path
|
|||||||
from tempfile import NamedTemporaryFile
|
from tempfile import NamedTemporaryFile
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
from PIL import Image, ImageDraw, ImageFont
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
def file_safe_string(string):
|
def file_safe_string(string):
|
||||||
@@ -537,6 +538,64 @@ class ComicStrip(ImageRepo, ABC):
|
|||||||
"""
|
"""
|
||||||
self.transformed_images = self.images
|
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):
|
def package_data(self, base_path: Path):
|
||||||
"""
|
"""
|
||||||
Compresses all the data into a cbz file.
|
Compresses all the data into a cbz file.
|
||||||
@@ -569,6 +628,11 @@ class ComicStrip(ImageRepo, ABC):
|
|||||||
logging.info("Packaging %s" % image_path.suffix)
|
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:
|
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())
|
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.
|
# Delete the base images, as they are no longer needed.
|
||||||
# We cannot touch the transformed images, since some
|
# We cannot touch the transformed images, since some
|
||||||
# of them may come directly from the base comic, and
|
# of them may come directly from the base comic, and
|
||||||
|
|||||||
Reference in New Issue
Block a user