about summary refs log tree commit diff
path: root/kindlecomicconverter/metadata.py
diff options
context:
space:
mode:
Diffstat (limited to 'kindlecomicconverter/metadata.py')
-rw-r--r--kindlecomicconverter/metadata.py89
1 files changed, 18 insertions, 71 deletions
diff --git a/kindlecomicconverter/metadata.py b/kindlecomicconverter/metadata.py
index da16718..b431be1 100644
--- a/kindlecomicconverter/metadata.py
+++ b/kindlecomicconverter/metadata.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (c) 2013-2018 Pawel Jastrzebski <[email protected]>
+# Copyright (c) 2013-2019 Pawel Jastrzebski <[email protected]>
 #
 # Permission to use, copy, modify, and/or distribute this software for
 # any purpose with or without fee is hereby granted, provided that the
@@ -18,14 +18,9 @@
 
 import os
 from xml.dom.minidom import parse, Document
-from re import compile
-from zipfile import is_zipfile, ZipFile, ZIP_DEFLATED
-from subprocess import STDOUT, PIPE
-from psutil import Popen
 from tempfile import mkdtemp
 from shutil import rmtree
-from .shared import removeFromZIP, check7ZFile as is_7zfile
-from . import rarfile
+from . import comicarchive
 
 
 class MetadataParser:
@@ -39,50 +34,20 @@ class MetadataParser:
                      'Inkers': [],
                      'Colorists': [],
                      'Summary': '',
-                     'MUid': '',
                      'Bookmarks': []}
         self.rawdata = None
-        self.compressor = None
+        self.format = None
         if self.source.endswith('.xml') and os.path.exists(self.source):
             self.rawdata = parse(self.source)
-            self.parseXML()
         elif not self.source.endswith('.xml'):
-            if is_zipfile(self.source):
-                self.compressor = 'zip'
-                with ZipFile(self.source) as zip_file:
-                    for member in zip_file.namelist():
-                        if member != 'ComicInfo.xml':
-                            continue
-                        with zip_file.open(member) as xml_file:
-                            self.rawdata = parse(xml_file)
-            elif rarfile.is_rarfile(self.source):
-                self.compressor = 'rar'
-                with rarfile.RarFile(self.source) as rar_file:
-                    for member in rar_file.namelist():
-                        if member != 'ComicInfo.xml':
-                            continue
-                        with rar_file.open(member) as xml_file:
-                            self.rawdata = parse(xml_file)
-            elif is_7zfile(self.source):
-                self.compressor = '7z'
-                workdir = mkdtemp('', 'KCC-')
-                tmpXML = os.path.join(workdir, 'ComicInfo.xml')
-                output = Popen('7za e "' + self.source + '" ComicInfo.xml -o"' + workdir + '"',
-                               stdout=PIPE, stderr=STDOUT, stdin=PIPE, shell=True)
-                extracted = False
-                for line in output.stdout:
-                    if b"Everything is Ok" in line or b"No files to process" in line:
-                        extracted = True
-                if not extracted:
-                    rmtree(workdir)
-                    raise OSError('Failed to extract 7ZIP file.')
-                if os.path.isfile(tmpXML):
-                    self.rawdata = parse(tmpXML)
-                rmtree(workdir)
-            else:
-                raise OSError('Failed to detect archive format.')
-            if self.rawdata:
-                self.parseXML()
+            try:
+                cbx = comicarchive.ComicArchive(self.source)
+                self.rawdata = cbx.extractMetadata()
+                self.format = cbx.type
+            except OSError as e:
+                raise UserWarning(e.strerror)
+        if self.rawdata:
+            self.parseXML()
 
     def parseXML(self):
         if len(self.rawdata.getElementsByTagName('Series')) != 0:
@@ -99,11 +64,6 @@ class MetadataParser:
                     self.data[field + 's'].append(person)
             self.data[field + 's'] = list(set(self.data[field + 's']))
             self.data[field + 's'].sort()
-        if len(self.rawdata.getElementsByTagName('ScanInformation')) != 0:
-            coverId = compile('(MCD\\()(\\d+)(\\))')\
-                .search(self.rawdata.getElementsByTagName('ScanInformation')[0].firstChild.nodeValue)
-            if coverId:
-                self.data['MUid'] = coverId.group(2)
         if len(self.rawdata.getElementsByTagName('Page')) != 0:
             for page in self.rawdata.getElementsByTagName('Page'):
                 if 'Bookmark' in page.attributes and 'Image' in page.attributes:
@@ -116,8 +76,7 @@ class MetadataParser:
             for row in (['Series', self.data['Series']], ['Volume', self.data['Volume']],
                         ['Number', self.data['Number']], ['Writer', ', '.join(self.data['Writers'])],
                         ['Penciller', ', '.join(self.data['Pencillers'])], ['Inker', ', '.join(self.data['Inkers'])],
-                        ['Colorist', ', '.join(self.data['Colorists'])], ['Summary', self.data['Summary']],
-                        ['ScanInformation', 'MCD(' + self.data['MUid'] + ')' if self.data['MUid'] else '']):
+                        ['Colorist', ', '.join(self.data['Colorists'])], ['Summary', self.data['Summary']]):
                 if self.rawdata.getElementsByTagName(row[0]):
                     node = self.rawdata.getElementsByTagName(row[0])[0]
                     if row[1]:
@@ -138,8 +97,7 @@ class MetadataParser:
             for row in (['Series', self.data['Series']], ['Volume', self.data['Volume']],
                         ['Number', self.data['Number']], ['Writer', ', '.join(self.data['Writers'])],
                         ['Penciller', ', '.join(self.data['Pencillers'])], ['Inker', ', '.join(self.data['Inkers'])],
-                        ['Colorist', ', '.join(self.data['Colorists'])], ['Summary', self.data['Summary']],
-                        ['ScanInformation', 'MCD(' + self.data['MUid'] + ')' if self.data['MUid'] else '']):
+                        ['Colorist', ', '.join(self.data['Colorists'])], ['Summary', self.data['Summary']]):
                 if row[1]:
                     main = doc.createElement(row[0])
                     root.appendChild(main)
@@ -154,20 +112,9 @@ class MetadataParser:
             tmpXML = os.path.join(workdir, 'ComicInfo.xml')
             with open(tmpXML, 'w', encoding='utf-8') as f:
                 self.rawdata.writexml(f, encoding='utf-8')
-            if is_zipfile(self.source):
-                removeFromZIP(self.source, 'ComicInfo.xml')
-                with ZipFile(self.source, mode='a', compression=ZIP_DEFLATED) as zip_file:
-                    zip_file.write(tmpXML, arcname=tmpXML.split(os.sep)[-1])
-            elif rarfile.is_rarfile(self.source):
-                raise NotImplementedError
-            elif is_7zfile(self.source):
-                output = Popen('7za a "' + self.source + '" "' + tmpXML + '"',
-                               stdout=PIPE, stderr=STDOUT, stdin=PIPE, shell=True)
-                extracted = False
-                for line in output.stdout:
-                    if b"Everything is Ok" in line:
-                        extracted = True
-                if not extracted:
-                    rmtree(workdir)
-                    raise OSError('Failed to modify 7ZIP file.')
+            try:
+                cbx = comicarchive.ComicArchive(self.source)
+                cbx.addFile(tmpXML)
+            except OSError as e:
+                raise UserWarning(e.strerror)
             rmtree(workdir)