2015-02-21 18:30:32 -08:00
|
|
|
"""Functions for renaming files based on metadata"""
|
2012-12-14 21:54:12 -08:00
|
|
|
|
2015-02-21 18:30:32 -08:00
|
|
|
# Copyright 2012-2014 Anthony Beville
|
2012-12-14 21:54:12 -08:00
|
|
|
|
2015-02-21 18:30:32 -08:00
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
2012-12-14 21:54:12 -08:00
|
|
|
|
2015-02-21 18:30:32 -08:00
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
2012-12-14 21:54:12 -08:00
|
|
|
|
2015-02-21 18:30:32 -08:00
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
2012-12-14 21:54:12 -08:00
|
|
|
|
2022-04-18 18:59:17 -07:00
|
|
|
import calendar
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
import datetime
|
2022-04-04 18:59:26 -07:00
|
|
|
import logging
|
2012-12-14 21:54:12 -08:00
|
|
|
import os
|
2022-04-18 18:59:17 -07:00
|
|
|
import re
|
2022-04-18 18:44:20 -07:00
|
|
|
import string
|
|
|
|
|
|
|
|
from pathvalidate import sanitize_filepath
|
2015-02-13 15:08:07 -08:00
|
|
|
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
from comicapi.genericmetadata import GenericMetadata
|
|
|
|
from comicapi.issuestring import IssueString
|
2012-12-14 21:54:12 -08:00
|
|
|
|
2022-04-04 18:59:26 -07:00
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2015-02-13 15:08:07 -08:00
|
|
|
|
2022-04-18 18:59:17 -07:00
|
|
|
class FileRenamer:
|
|
|
|
def __init__(self, metadata):
|
|
|
|
self.template = "%series% v%volume% #%issue% (of %issuecount%) (%year%)"
|
|
|
|
self.smart_cleanup = True
|
|
|
|
self.issue_zero_padding = 3
|
|
|
|
self.metadata = metadata
|
|
|
|
|
|
|
|
def set_metadata(self, metadata: GenericMetadata):
|
|
|
|
self.metadata = metadata
|
|
|
|
|
|
|
|
def set_issue_zero_padding(self, count):
|
|
|
|
self.issue_zero_padding = count
|
|
|
|
|
|
|
|
def set_smart_cleanup(self, on):
|
|
|
|
self.smart_cleanup = on
|
|
|
|
|
|
|
|
def set_template(self, template: str):
|
|
|
|
self.template = template
|
|
|
|
|
|
|
|
def replace_token(self, text, value, token):
|
|
|
|
# helper func
|
|
|
|
def is_token(word):
|
|
|
|
return word[0] == "%" and word[-1:] == "%"
|
|
|
|
|
|
|
|
if value is not None:
|
|
|
|
return text.replace(token, str(value))
|
|
|
|
|
|
|
|
if self.smart_cleanup:
|
|
|
|
# smart cleanup means we want to remove anything appended to token if it's empty (e.g "#%issue%" or "v%volume%")
|
|
|
|
# (TODO: This could fail if there is more than one token appended together, I guess)
|
|
|
|
text_list = text.split()
|
|
|
|
|
|
|
|
# special case for issuecount, remove preceding non-token word,
|
|
|
|
# as in "...(of %issuecount%)..."
|
|
|
|
if token == "%issuecount%":
|
|
|
|
for idx, word in enumerate(text_list):
|
|
|
|
if token in word and not is_token(text_list[idx - 1]):
|
|
|
|
text_list[idx - 1] = ""
|
|
|
|
|
|
|
|
text_list = [x for x in text_list if token not in x]
|
|
|
|
return " ".join(text_list)
|
|
|
|
|
|
|
|
return text.replace(token, "")
|
|
|
|
|
|
|
|
def determine_name(self, ext):
|
|
|
|
|
|
|
|
md = self.metadata
|
|
|
|
new_name = self.template
|
|
|
|
|
|
|
|
new_name = self.replace_token(new_name, md.series, "%series%")
|
|
|
|
new_name = self.replace_token(new_name, md.volume, "%volume%")
|
|
|
|
|
|
|
|
if md.issue is not None:
|
|
|
|
issue_str = IssueString(md.issue).as_string(pad=self.issue_zero_padding)
|
|
|
|
else:
|
|
|
|
issue_str = None
|
|
|
|
new_name = self.replace_token(new_name, issue_str, "%issue%")
|
|
|
|
|
|
|
|
new_name = self.replace_token(new_name, md.issue_count, "%issuecount%")
|
|
|
|
new_name = self.replace_token(new_name, md.year, "%year%")
|
|
|
|
new_name = self.replace_token(new_name, md.publisher, "%publisher%")
|
|
|
|
new_name = self.replace_token(new_name, md.title, "%title%")
|
|
|
|
new_name = self.replace_token(new_name, md.month, "%month%")
|
|
|
|
month_name = None
|
|
|
|
if md.month is not None:
|
|
|
|
if (isinstance(md.month, str) and md.month.isdigit()) or isinstance(md.month, int):
|
|
|
|
if int(md.month) in range(1, 13):
|
|
|
|
dt = datetime.datetime(1970, int(md.month), 1, 0, 0)
|
|
|
|
month_name = dt.strftime("%B")
|
|
|
|
new_name = self.replace_token(new_name, month_name, "%month_name%")
|
|
|
|
|
|
|
|
new_name = self.replace_token(new_name, md.genre, "%genre%")
|
|
|
|
new_name = self.replace_token(new_name, md.language, "%language_code%")
|
|
|
|
new_name = self.replace_token(new_name, md.critical_rating, "%criticalrating%")
|
|
|
|
new_name = self.replace_token(new_name, md.alternate_series, "%alternateseries%")
|
|
|
|
new_name = self.replace_token(new_name, md.alternate_number, "%alternatenumber%")
|
|
|
|
new_name = self.replace_token(new_name, md.alternate_count, "%alternatecount%")
|
|
|
|
new_name = self.replace_token(new_name, md.imprint, "%imprint%")
|
|
|
|
new_name = self.replace_token(new_name, md.format, "%format%")
|
|
|
|
new_name = self.replace_token(new_name, md.maturity_rating, "%maturityrating%")
|
|
|
|
new_name = self.replace_token(new_name, md.story_arc, "%storyarc%")
|
|
|
|
new_name = self.replace_token(new_name, md.series_group, "%seriesgroup%")
|
|
|
|
new_name = self.replace_token(new_name, md.scan_info, "%scaninfo%")
|
|
|
|
|
|
|
|
if self.smart_cleanup:
|
|
|
|
# remove empty braces,brackets, parentheses
|
|
|
|
new_name = re.sub(r"\(\s*[-:]*\s*\)", "", new_name)
|
|
|
|
new_name = re.sub(r"\[\s*[-:]*\s*]", "", new_name)
|
|
|
|
new_name = re.sub(r"{\s*[-:]*\s*}", "", new_name)
|
|
|
|
|
|
|
|
# remove duplicate spaces
|
|
|
|
new_name = " ".join(new_name.split())
|
|
|
|
|
|
|
|
# remove remove duplicate -, _,
|
|
|
|
new_name = re.sub(r"[-_]{2,}\s+", "-- ", new_name)
|
|
|
|
new_name = re.sub(r"(\s--)+", " --", new_name)
|
|
|
|
new_name = re.sub(r"(\s-)+", " -", new_name)
|
|
|
|
|
|
|
|
# remove dash or double dash at end of line
|
|
|
|
new_name = re.sub(r"[-]{1,2}\s*$", "", new_name)
|
|
|
|
|
|
|
|
# remove duplicate spaces (again!)
|
|
|
|
new_name = " ".join(new_name.split())
|
|
|
|
|
|
|
|
new_name += ext
|
|
|
|
|
|
|
|
# some tweaks to keep various filesystems happy
|
|
|
|
new_name = new_name.replace("/", "-")
|
|
|
|
new_name = new_name.replace(" :", " -")
|
|
|
|
new_name = new_name.replace(": ", " - ")
|
|
|
|
new_name = new_name.replace(":", "-")
|
|
|
|
new_name = new_name.replace("?", "")
|
|
|
|
|
|
|
|
return new_name
|
|
|
|
|
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
class MetadataFormatter(string.Formatter):
|
|
|
|
def __init__(self, smart_cleanup=False):
|
|
|
|
super().__init__()
|
|
|
|
self.smart_cleanup = smart_cleanup
|
|
|
|
|
|
|
|
def format_field(self, value, format_spec):
|
|
|
|
if value is None or value == "":
|
|
|
|
return ""
|
|
|
|
return super().format_field(value, format_spec)
|
|
|
|
|
|
|
|
def _vformat(self, format_string, args, kwargs, used_args, recursion_depth, auto_arg_index=0):
|
|
|
|
if recursion_depth < 0:
|
|
|
|
raise ValueError("Max string recursion exceeded")
|
|
|
|
result = []
|
|
|
|
lstrip = False
|
|
|
|
for literal_text, field_name, format_spec, conversion in self.parse(format_string):
|
|
|
|
|
|
|
|
# output the literal text
|
|
|
|
if literal_text:
|
|
|
|
if lstrip:
|
|
|
|
result.append(literal_text.lstrip("-_)}]#"))
|
|
|
|
else:
|
|
|
|
result.append(literal_text)
|
|
|
|
lstrip = False
|
|
|
|
# if there's a field, output it
|
|
|
|
if field_name is not None:
|
2022-04-18 18:59:17 -07:00
|
|
|
field_name = field_name.lower()
|
2022-04-18 18:44:20 -07:00
|
|
|
# this is some markup, find the object and do
|
|
|
|
# the formatting
|
|
|
|
|
|
|
|
# handle arg indexing when empty field_names are given.
|
|
|
|
if field_name == "":
|
|
|
|
if auto_arg_index is False:
|
|
|
|
raise ValueError(
|
|
|
|
"cannot switch from manual field " "specification to automatic field " "numbering"
|
|
|
|
)
|
|
|
|
field_name = str(auto_arg_index)
|
|
|
|
auto_arg_index += 1
|
|
|
|
elif field_name.isdigit():
|
|
|
|
if auto_arg_index:
|
|
|
|
raise ValueError(
|
|
|
|
"cannot switch from manual field " "specification to automatic field " "numbering"
|
|
|
|
)
|
|
|
|
# disable auto arg incrementing, if it gets
|
|
|
|
# used later on, then an exception will be raised
|
|
|
|
auto_arg_index = False
|
|
|
|
|
|
|
|
# given the field_name, find the object it references
|
|
|
|
# and the argument it came from
|
|
|
|
obj, arg_used = self.get_field(field_name, args, kwargs)
|
|
|
|
used_args.add(arg_used)
|
|
|
|
|
|
|
|
# do any conversion on the resulting object
|
|
|
|
obj = self.convert_field(obj, conversion)
|
|
|
|
|
|
|
|
# expand the format spec, if needed
|
|
|
|
format_spec, auto_arg_index = self._vformat(
|
|
|
|
format_spec, args, kwargs, used_args, recursion_depth - 1, auto_arg_index=auto_arg_index
|
|
|
|
)
|
|
|
|
|
|
|
|
# format the object and append to the result
|
|
|
|
fmt_obj = self.format_field(obj, format_spec)
|
|
|
|
if fmt_obj == "" and len(result) > 0 and self.smart_cleanup:
|
|
|
|
lstrip = True
|
|
|
|
result.pop()
|
|
|
|
result.append(fmt_obj)
|
|
|
|
|
|
|
|
return "".join(result), auto_arg_index
|
|
|
|
|
|
|
|
|
2022-04-18 18:59:17 -07:00
|
|
|
class FileRenamer2:
|
2015-02-13 15:08:07 -08:00
|
|
|
def __init__(self, metadata):
|
2022-04-18 18:59:17 -07:00
|
|
|
self.template = "{publisher}/{series}/{series} v{volume} #{issue} (of {issue_count}) ({year})"
|
2015-02-12 14:57:46 -08:00
|
|
|
self.smart_cleanup = True
|
|
|
|
self.issue_zero_padding = 3
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
self.metadata = metadata
|
2022-04-18 18:44:20 -07:00
|
|
|
self.move = False
|
2015-02-12 14:57:46 -08:00
|
|
|
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
def set_metadata(self, metadata: GenericMetadata):
|
|
|
|
self.metadata = metadata
|
2015-02-12 14:57:46 -08:00
|
|
|
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
def set_issue_zero_padding(self, count):
|
2015-02-12 14:57:46 -08:00
|
|
|
self.issue_zero_padding = count
|
|
|
|
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
def set_smart_cleanup(self, on):
|
2015-02-12 14:57:46 -08:00
|
|
|
self.smart_cleanup = on
|
|
|
|
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
def set_template(self, template: str):
|
2015-02-12 14:57:46 -08:00
|
|
|
self.template = template
|
|
|
|
|
2022-04-18 18:59:17 -07:00
|
|
|
def determine_name(self, ext):
|
2022-04-18 18:44:20 -07:00
|
|
|
class Default(dict):
|
|
|
|
def __missing__(self, key):
|
|
|
|
return "{" + key + "}"
|
2015-02-12 14:57:46 -08:00
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
md = self.metadata
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
# padding for issue
|
|
|
|
md.issue = IssueString(md.issue).as_string(pad=self.issue_zero_padding)
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
template = self.template
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
path_components = template.split(os.sep)
|
|
|
|
new_name = ""
|
Code cleanup
Remove no longer used google scripts
Remove convenience files from comicataggerlib and import comicapi directly
Add type-hints to facilitate auto-complete tools
Make PyQt5 code more compatible with PyQt6
Implement automatic tooling
isort and black for code formatting
Line length has been set to 120
flake8 for code standards with exceptions:
E203 - Whitespace before ':' - format compatiblity with black
E501 - Line too long - flake8 line limit cannot be set
E722 - Do not use bare except - fixing bare except statements is a
lot of overhead and there are already
many in the codebase
These changes, along with some manual fixes creates much more readable code.
See examples below:
diff --git a/comicapi/comet.py b/comicapi/comet.py
index d1741c5..52dc195 100644
--- a/comicapi/comet.py
+++ b/comicapi/comet.py
@@ -166,7 +166,2 @@ class CoMet:
- if credit['role'].lower() in set(self.editor_synonyms):
- ET.SubElement(
- root,
- 'editor').text = "{0}".format(
- credit['person'])
@@ -174,2 +169,4 @@ class CoMet:
self.indent(root)
+ if credit["role"].lower() in set(self.editor_synonyms):
+ ET.SubElement(root, "editor").text = str(credit["person"])
diff --git a/comictaggerlib/autotagmatchwindow.py b/comictaggerlib/autotagmatchwindow.py
index 4338176..9219f01 100644
--- a/comictaggerlib/autotagmatchwindow.py
+++ b/comictaggerlib/autotagmatchwindow.py
@@ -63,4 +63,3 @@ class AutoTagMatchWindow(QtWidgets.QDialog):
self.skipButton, QtWidgets.QDialogButtonBox.ActionRole)
- self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setText(
- "Accept and Write Tags")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText("Accept and Write Tags")
diff --git a/comictaggerlib/cli.py b/comictaggerlib/cli.py
index 688907d..dbd0c2e 100644
--- a/comictaggerlib/cli.py
+++ b/comictaggerlib/cli.py
@@ -293,7 +293,3 @@ def process_file_cli(filename, opts, settings, match_results):
if opts.raw:
- print((
- "{0}".format(
- str(
- ca.readRawCIX(),
- errors='ignore'))))
+ print(ca.read_raw_cix())
else:
2022-04-01 16:50:46 -07:00
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
fmt = MetadataFormatter(self.smart_cleanup)
|
2022-04-18 18:59:17 -07:00
|
|
|
md_dict = vars(md)
|
|
|
|
for role in ["writer", "penciller", "inker", "colorist", "letterer", "cover artist", "editor"]:
|
|
|
|
md_dict[role] = md.get_primary_credit(role)
|
|
|
|
|
|
|
|
if (isinstance(md.month, int) or isinstance(md.month, str) and md.month.isdigit()) and 0 < int(md.month) < 13:
|
|
|
|
md_dict["month_name"] = calendar.month_name[int(md.month)]
|
|
|
|
md_dict["month_abbr"] = calendar.month_abbr[int(md.month)]
|
|
|
|
else:
|
|
|
|
print(md.month)
|
|
|
|
md_dict["month_name"] = ""
|
|
|
|
md_dict["month_abbr"] = ""
|
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
for Component in path_components:
|
|
|
|
new_name = os.path.join(
|
2022-04-18 18:59:17 -07:00
|
|
|
new_name, fmt.vformat(Component, args=[], kwargs=Default(md_dict)).replace("/", "-")
|
2022-04-18 18:44:20 -07:00
|
|
|
)
|
2015-02-12 14:57:46 -08:00
|
|
|
|
|
|
|
new_name += ext
|
|
|
|
|
2022-04-18 18:59:17 -07:00
|
|
|
# # some tweaks to keep various filesystems happy
|
|
|
|
# new_name = new_name.replace(": ", " - ")
|
|
|
|
# new_name = new_name.replace(":", "-")
|
2015-02-12 14:57:46 -08:00
|
|
|
|
2022-04-18 18:44:20 -07:00
|
|
|
# remove padding
|
|
|
|
md.issue = IssueString(md.issue).as_string()
|
|
|
|
if self.move:
|
|
|
|
return sanitize_filepath(new_name.strip())
|
|
|
|
else:
|
|
|
|
return os.path.basename(sanitize_filepath(new_name.strip()))
|