Code Monkey home page Code Monkey logo

codex's People

Contributors

ajslater avatar majora2007 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

codex's Issues

Center displayed comic page

Currently the comics are slightly left centered which gives a kind of uneasy feel to reading, perhaps center the page?

image

SQLite3 database is malformed

I've hit this twice today so I wanted to file it. I started seeing stack traces like the following:

2020-12-31 05:29:38,929 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Scanning /comics...
2020-12-31 05:29:39,029 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner ERROR database disk image is malformed
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.DatabaseError: database disk image is malformed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/codex/librarian/scanner.py", line 127, in scan_root
    scan_existing(library, Comic, force)
  File "/usr/local/lib/python3.9/site-packages/codex/librarian/scanner.py", line 73, in scan_existing
    for obj in objs:
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 287, in __iter__
    self._fetch_all()
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1308, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1156, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.DatabaseError: database disk image is malformed
2020-12-31 05:29:39,077 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Scan for /comics finished.
2020-12-31 05:29:39,031 MainProcess asyncio_0 django.request ERROR Internal Server Error: /api/v2/notify/scan
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.DatabaseError: database disk image is malformed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 339, in thread_handler
    raise exc_info[1]
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 38, in inner
    response = await get_response(request)
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 231, in _get_response_async
    response = await wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 304, in __call__
    ret = await asyncio.wait_for(future, timeout=None)
  File "/usr/local/lib/python3.9/asyncio/tasks.py", line 440, in wait_for
    return await fut
  File "/usr/local/lib/python3.9/site-packages/asgiref/current_thread_executor.py", line 23, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.9/site-packages/asgiref/sync.py", line 343, in thread_handler
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/usr/local/lib/python3.9/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/local/lib/python3.9/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/usr/local/lib/python3.9/site-packages/rest_framework/views.py", line 497, in dispatch
    self.initial(request, *args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/rest_framework/views.py", line 415, in initial
    self.check_permissions(request)
  File "/usr/local/lib/python3.9/site-packages/rest_framework/views.py", line 332, in check_permissions
    if not permission.has_permission(request, self):
  File "/usr/local/lib/python3.9/site-packages/codex/views/auth.py", line 39, in has_permission
    enu_flag = AdminFlag.objects.only("on").get(name=AdminFlag.ENABLE_NON_USERS)
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 425, in get
    num = len(clone)
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 1308, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1156, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.9/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.DatabaseError: database disk image is malformed

After #79 I also tried to do a full re-import and saw a lot of errors logged similar to these:

2020-12-31 05:49:03,729 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Archangel (2016)/Archangel 001 (2016).cbz database disk image is malformed
2020-12-31 05:49:03,796 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Archangel (2016)/Archangel 002 (2016).cbz database disk image is malformed
2020-12-31 05:49:03,870 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Archangel (2016)/Archangel 003 (2016).cbz database disk image is malformed
2020-12-31 05:49:03,936 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Archangel (2016)/Archangel 004 (2017).cbz database disk image is malformed
2020-12-31 05:49:04,019 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Archangel (2016)/Archangel 005 (2017).cbz database disk image is malformed
2020-12-31 05:49:04,084 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/The Walking Dead All Out War AP Edition (2014)/The Walking Dead All Out War AP Edition 001 (2014).cbz database disk image is malformed
2020-12-31 05:49:04,160 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 001 (2014).cbz database disk image is malformed
2020-12-31 05:49:04,218 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 002 (2014).cbz database disk image is malformed
2020-12-31 05:49:04,267 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 003 (2014).cbz database disk image is malformed
2020-12-31 05:49:04,334 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 004 (2014).cbz database disk image is malformed
2020-12-31 05:49:04,409 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 005 (2014).cbz database disk image is malformed
2020-12-31 05:49:04,483 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 006 (2014).cbz database disk image is malformed
2020-12-31 05:49:04,549 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 007 (2015).cbz database disk image is malformed
2020-12-31 05:49:04,632 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 008 (2015).cbz database disk image is malformed
2020-12-31 05:49:04,682 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 009 (2015).cbz database disk image is malformed
2020-12-31 05:49:04,740 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 010 (2015).cbz database disk image is malformed
2020-12-31 05:49:04,806 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 011 (2015).cbz database disk image is malformed
2020-12-31 05:49:04,927 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 012 (2015).cbz database disk image is malformed
2020-12-31 05:49:04,978 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 013 (2015).cbz database disk image is malformed
2020-12-31 05:49:05,028 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 014 (2015).cbz database disk image is malformed
2020-12-31 05:49:05,095 librarian ThreadPoolExecutor-0_0 codex.librarian.importer WARNING Import failed: /comics/Outcast by Kirkman & Azaceta (2014)/Outcast by Kirkman & Azaceta 015 (2016).cbz database disk image is malformed

I ran sqlite3 db.sqlite3 "PRAGMA integrity_check" and got this output:

Error: database disk image is malformed

I read through this StackOverflow answer which seems to imply that it could be related to DB indexes. I ran the command they suggested and got an empty file. I ran sqlite3 db.sqlite3 ".recover" | sqlite3 new-db.sqlite3 and got a lot of output like the following:

Error: near line 14059: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14060: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14061: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14062: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14063: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14064: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14065: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14066: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14067: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14068: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14069: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14070: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14071: table lost_and_found has 40 columns but 39 values were supplied
Error: near line 14072: table lost_and_found has 40 columns but 39 values were supplied

It looks like it did manage to recreate the db with about 400kb less data in it. Whether or not it worked is TBD

Load Time Issues

Currently there doesn't seem to be any pagination, so if you end up in a folder with quite a few issues, you end up trying to load all of the cover images at once, leading to both initial lag as it gathers up all the issues its supposed to display and then again in the loading of the individual images.

Perhaps some pagination may help in this regards, with a setting for how many issues people would like to have displayed per page?

AttributeError: 'NoneType' object has no attribute 'name'

2020-09-05 06:56:50 codex.librarian.importer[22] INFO Created /comics/DC Comics/Superman New Krypton Special (2008) db folder.
2020-09-05 06:56:50 codex.librarian.importer[22] INFO Created comic Superman: New Krypton Special #1
2020-09-05 06:56:50 codex.librarian.importer[22] INFO Created comic More Fun Comics #58
2020-09-05 06:56:51 codex.librarian.importer[22] ERROR 'NoneType' object has no attribute 'name'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 321, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 210, in get_credits
LOG.info(f"Created credit {credit.role.name}: {credit.person.name}")
AttributeError: 'NoneType' object has no attribute 'name'
2020-09-05 06:56:51 codex.librarian.importer[22] ERROR 'NoneType' object has no attribute 'name'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 321, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 210, in get_credits
LOG.info(f"Created credit {credit.role.name}: {credit.person.name}")
AttributeError: 'NoneType' object has no attribute 'name'

CSRF fails on library action

Triggering any Action on a library in the admin interface will raise a 403 Forbidden by Django, caused by CSRF failure.

Running via
Docker: ajslater/codex:latest
Host: RasPi4b, 8GB using Manjaro ARM

Compose

Duplicated Publishers

Might be worth combing some Publishers in Publisher view when they're for sure the same entity, a few examples attached

image

image

I/O error

2020-09-13 05:25:16 codex.librarian.importer[22] INFO Updated comic Inferno: Resurrection #1
2020-09-13 05:25:25 codex.librarian.importer[22] INFO Updated comic Inferno: Resurrection #1
2020-09-13 05:25:39 codex.librarian.importer[22] INFO Updated comic Inferno: Resurrection #2
2020-09-13 05:25:53 codex.librarian.importer[22] INFO Updated comic Inferno: Resurrection #3
2020-09-13 05:26:08 codex.librarian.importer[22] INFO Updated comic Inferno: Resurrection #4
2020-09-13 05:26:22 codex.librarian.importer[22] INFO Updated comic Inferno: Resurrection #5
2020-09-13 05:30:07 codex.librarian.importer[22] INFO Updated comic James Bond: M #1
2020-09-13 05:30:19 codex.librarian.importer[22] INFO Updated comic James Bond: M #1
2020-09-13 05:35:15 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:35:20 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:35:28 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:35:35 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:35:40 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:35:46 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:35:52 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:40:37 codex.librarian.librariand[22] ERROR File is not a zip file
Traceback (most recent call last):
File "/usr/local/lib/python3.8/zipfile.py", line 1332, in _RealGetContents
endrec = _EndRecData(fp)
File "/usr/local/lib/python3.8/zipfile.py", line 274, in _EndRecData
data = fpin.read()
OSError: [Errno 5] I/O error

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 58, in init
self.metadata.compute_page_metadata(self.namelist())
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 79, in namelist
with self._get_archive() as archive:
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 71, in _get_archive
return self.archive_cls(self._path, mode=mode)
File "/usr/local/lib/python3.8/zipfile.py", line 1269, in init
self._RealGetContents()
File "/usr/local/lib/python3.8/zipfile.py", line 1334, in _RealGetContents
raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file
2020-09-13 05:40:40 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:40:49 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:40:56 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:45:55 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:45:59 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:51:16 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:51:20 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:51:27 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:56:36 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 05:56:40 codex.librarian.librariand[22] ERROR [Errno 5] I/O error
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 367, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 65, in set_path
elif rarfile.is_rarfile(self._path):
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 346, in is_rarfile
return _get_rar_version(xfile) > 0
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 306, in _get_rar_version
buf = fd.read(len(RAR5_ID))
File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 2583, in read
return self._fd.read(n)
OSError: [Errno 5] I/O error
2020-09-13 06:01:56 codex.librarian.importer[22] INFO Updated comic Vampirella Annual #1
2020-09-13 06:02:04 codex.librarian.importer[22] INFO Updated comic Vampirella Annual #1
2020-09-13 06:02:21 codex.librarian.importer[22] INFO Updated comic Vampirella Annual #2
2020-09-13 06:07:14 codex.librarian.importer[22] INFO Updated comic Cloak and Dagger #1
2020-09-13 06:07:23 codex.librarian.importer[22] INFO Updated comic Cloak and Dagger #1
2020-09-13 06:07:36 codex.librarian.importer[22] INFO Updated comic Cloak and Dagger #2
2020-09-13 06:07:49 codex.librarian.importer[22] INFO Updated comic Cloak and Dagger #3
2020-09-13 06:08:02 codex.librarian.importer[22] INFO Updated comic Cloak and Dagger #4
2020-09-13 06:12:40 codex.librarian.importer[22] INFO Updated comic Captain America & the Invaders: Bahamas Triangle #1
2020-09-13 06:12:52 codex.librarian.importer[22] INFO Updated comic Captain America & the Invaders: Bahamas Triangle #1

Could not find a record for '' exception

2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created credit Inker: Julia Madrigal
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created credit Penciller: Julia Madrigal
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created comic Lumberjanes #69
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created comic Lumberjanes #70
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created comic Lumberjanes #71
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created comic Lumberjanes #72
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created Series Klaus
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created Volume
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created credit Colorist: Jordan Boyd
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created CreditPerson Felipe Smith
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created credit CoverArtist: Felipe Smith
2020-08-30 19:10:15 codex.librarian.importer[20] INFO Created CreditPerson Frazer Irving
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit CoverArtist: Frazer Irving
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Character Sergeant Linkvist
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Character Lady Dagmar
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Character Lilli
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Character Jonas
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Character Lord Magnus
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Character Krampus
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Location Grimsvig
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created /comics/Boom Studios/Klaus (2015) db folder.
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created comic Klaus #1
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Character Olav the Unbeatable
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created comic Klaus #2
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created comic Klaus #3
2020-08-30 19:10:16 codex.librarian.librariand[20] ERROR Could not find a record for ''
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 139, in _parse_metadata
cbi_md = self._parse_metadata_comments()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 123, in _parse_metadata_comments
parser = ComicBookInfo(string=comment)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_json.py", line 22, in from_string
self._from_json(json_obj)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 66, in _from_json
self._from_json_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 45, in _from_json_tags
val = self._pycountry(to_key, val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 71, in _pycountry
obj = module.lookup(name)
File "/usr/local/lib/python3.8/site-packages/pycountry/db.py", line 41, in load_if_needed
return f(self, *args, **kw)
File "/usr/local/lib/python3.8/site-packages/pycountry/db.py", line 146, in lookup
raise LookupError('Could not find a record for %r' % value)
LookupError: Could not find a record for ''
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created comic Klaus #5
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created comic Klaus #6
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Volume 1
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created comic Klaus #7
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Series Planet of the Apes: Ursus
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created Volume 1
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created CreditPerson Jason Wordie
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit Colorist: Jason Wordie
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit Colorist: Laura Allred
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created CreditPerson Bob Larkin
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit CoverArtist: Bob Larkin
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created CreditPerson Keith Wilson
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit CoverArtist: Keith Wilson
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created CreditPerson Chris Mooneyham
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit Inker: Chris Mooneyham
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit Penciller: Chris Mooneyham
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created CreditPerson David Walker
2020-08-30 19:10:16 codex.librarian.importer[20] INFO Created credit Writer: David Walker

Codex splits volumes by imprint

This may be intentional, but I've been fighting with some comics that have one or more issues tagged with an imprint being rendered as separate volumes. Ideally, they'd be grouped together as they are still the same series and the same volume. Or maybe a setting to allow this deviation in behavior.

I saw this with a single Captain Marvel issue (12, I think?) and I'm seeing it with Spawn 310-313. For the former, it was an issue in the middle of the series. For the latter, they are the newest issues so it's possible that Mylar will continue to tag new issues with the imprint and I'd rather not need to go retag each new issue

Sort option for issue numbering

Currently this request should ideally be fulfilled by Date Published, however something is occurring to separate issues within a series, see attached.

The addition of the number 1 next the comic name seems to be seperating them from the ones who don't have this additional numbering.

By sorting on just straight up issue numbering, I believe this can be avoided.

image

Codex doesn't remember reading preferences

When picking a comic to read, Codex seems to always pick Original Size, even if I've changed the setting to Height. I've tried both with and without the For This Comic / For All Comics setting toggled as well. Codex seems to be aware that For All Comics is tied to Width but does not seem to honor it.

Comic.DoesNotExist: Comic matching query does not exist/decimal.InvalidOperation

2020-09-05 06:56:46 codex.librarian.importer[22] INFO Created comic Monstress #30
2020-09-05 06:56:46 codex.librarian.importer[22] INFO Created comic Dark Fang #2
2020-09-05 06:56:47 codex.librarian.importer[22] INFO Created comic Ascender #12
2020-09-05 06:56:47 codex.librarian.importer[22] ERROR [<class 'decimal.InvalidOperation'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 340, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 387, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 753, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 790, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 895, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 933, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1396, in execute_sql
for sql, params in self.as_sql():
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1339, in as_sql
value_rows = [
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1281, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1512, in get_db_prep_save
return connection.ops.adapt_decimalfield_value(self.to_python(value), self.max_digits, self.decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/operations.py", line 523, in adapt_decimalfield_value
return utils.format_number(value, max_digits, decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 235, in format_number
value = value.quantize(decimal.Decimal(1).scaleb(-decimal_places), context=context)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

Windows testing

Win10pro latest build of 2004
Python 3.8
Installed via c:\programdata\codex\pip install --user codex
hypercorn.exe and codex.exe are installed to %appdata%\python\python38\scripts, which gave an error for not being in path - running it again after updating my path statement gives no errors - but it's all in appdata, c:\programdata\codex is empty

I tried to run codex.exe via the profile folder, and via copying them all into programdata\codex and both give the following traceback error:

PS C:\ProgramData\codex> .\codex.exe Traceback (most recent call last):
File "c:\python\python38\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\python\python38\lib\runpy.py", line 87, in run_code
exec(code, run_globals)
File "C:\ProgramData\codex\codex.exe_main
.py", line 4, in
File "%appdata%\Python\Python38\site-packages\codex\run.py", line 16, in
from codex.librarian.librariand import PORT
File "%appdata%\Python\Python38\site-packages\codex\librarian\librariand.py", line 64, in
set_start_method("fork", force=True)
File "c:\python\python38\lib\multiprocessing\context.py", line 247, in set_start_method
self._actual_context = self.get_context(method)
File "c:\python\python38\lib\multiprocessing\context.py", line 239, in get_context
return super().get_context(method)
File "c:\python\python38\lib\multiprocessing\context.py", line 193, in get_context
raise ValueError('cannot find context for %r' % method) from None
ValueError: cannot find context for 'fork'

[Question] Library permissions

I've been looking for a new comic server compared to Ubooquity, and someone recommended Codex. I spun up a quick test container, but I was curious if it had the ability to assign permissions like the below? I've been looking for something that can manage this since it's how I have Calibre-Web setup to great results.

  1. By default, users do not need to sign in. This "guest" can view Library A, but not Library B or Library C.
  2. Users can register, or have accounts created for them, or flow them from an upstream auth provider via something like auth-proxy. Either way, let's just assume that for now, they register manually. This new user can se see Library A and Library B automatically without me having to manually configure permissions.
  3. Admins are the only ones that can see Library C (not shared with anyone else), unless they give a specific user access.

Essentially, can we modify permissions for guests (non-users), and can we assign new users to a default group with specific permissions. Can we those permissions be related to access of libraries? I did play around with the permissions a tiny bit, but they were complicated. Seems there is a lot of granular permissions, but I couldn't find specific access to Libraries. I also couldn't see how to manage Guest (not logged in) permissions, or how to assign new users a default set of permissions.

My goal is to basically restrict access to a specific Library to everyone but one or two people. I would want to do this without having to manage permissions for each new user if they register.

Numerous exceptions that all seem related due to the fact that they all come sequentially

2020-09-05 06:56:59 codex.librarian.importer[22] INFO Created Character A'monn A'mokk
2020-09-05 06:56:59 codex.librarian.importer[22] INFO Created comic Guy Gardner: Warrior #29
2020-09-05 06:56:59 codex.librarian.importer[22] INFO Created comic Guy Gardner: Warrior #44
2020-09-05 06:56:59 codex.librarian.importer[22] ERROR [<class 'decimal.InvalidOperation'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 340, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 387, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 753, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 790, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 895, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 933, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1396, in execute_sql
for sql, params in self.as_sql():
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1339, in as_sql
value_rows = [
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1281, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1512, in get_db_prep_save
return connection.ops.adapt_decimalfield_value(self.to_python(value), self.max_digits, self.decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/operations.py", line 523, in adapt_decimalfield_value
return utils.format_number(value, max_digits, decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 235, in format_number
value = value.quantize(decimal.Decimal(1).scaleb(-decimal_places), context=context)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:00 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:01 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.importer[22] ERROR [<class 'decimal.InvalidOperation'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 340, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 387, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 753, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 790, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 895, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 933, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1396, in execute_sql
for sql, params in self.as_sql():
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1339, in as_sql
value_rows = [
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1281, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1512, in get_db_prep_save
return connection.ops.adapt_decimalfield_value(self.to_python(value), self.max_digits, self.decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/operations.py", line 523, in adapt_decimalfield_value
return utils.format_number(value, max_digits, decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 235, in format_number
value = value.quantize(decimal.Decimal(1).scaleb(-decimal_places), context=context)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:02 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:03 codex.librarian.librariand[22] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-09-05 06:57:03 codex.librarian.importer[22] ERROR [<class 'decimal.InvalidOperation'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 340, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 387, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 753, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 790, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 895, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 933, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1396, in execute_sql
for sql, params in self.as_sql():
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1339, in as_sql
value_rows = [
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1340, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1281, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1512, in get_db_prep_save
return connection.ops.adapt_decimalfield_value(self.to_python(value), self.max_digits, self.decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/operations.py", line 523, in adapt_decimalfield_value
return utils.format_number(value, max_digits, decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 235, in format_number
value = value.quantize(decimal.Decimal(1).scaleb(-decimal_places), context=context)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
2020-09-05 06:57:03 codex.librarian.importer[22] ERROR month must be in 1..12
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 340, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 384, in save
self._set_date()
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 365, in _set_date
self.date = datetime.date(year, month, day)
ValueError: month must be in 1..12

Lots of crashy crashy, some dupes.

020-08-30 19:17:26 codex.librarian.importer[20] INFO Created Character Naiad
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created comic Aquaman #8
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created CreditPerson Rodney Ramos
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created credit Inker: Rodney Ramos
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created Character Deadline
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created comic Aquaman #9
2020-08-30 19:17:26 codex.librarian.librariand[20] ERROR dictionary update sequence element #0 has length 3; 2 is required
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 145, in _parse_metadata
self.metadata.synthesize_metadata(md_list)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 209, in synthesize_metadata
synth_dict_list.update(dict_list)
ValueError: dictionary update sequence element #0 has length 3; 2 is required
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created CreditPerson Chris Schenck
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created credit CoverArtist: Chris Schenck
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created credit Penciller: Chris Schenck
2020-08-30 19:17:26 codex.librarian.importer[20] INFO Created comic Aquaman #13
2020-08-30 19:17:26 codex.librarian.importer[20] ERROR [<class 'decimal.InvalidOperation'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 336, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 452, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 750, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 787, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 892, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 930, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1394, in execute_sql
for sql, params in self.as_sql():
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1337, in as_sql
value_rows = [
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1338, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1338, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1279, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1512, in get_db_prep_save
return connection.ops.adapt_decimalfield_value(self.to_python(value), self.max_digits, self.decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/operations.py", line 530, in adapt_decimalfield_value
return utils.format_number(value, max_digits, decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 235, in format_number
value = value.quantize(decimal.Decimal(1).scaleb(-decimal_places), context=context)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
2020-08-30 19:17:27 codex.librarian.importer[20] ERROR [<class 'decimal.InvalidOperation'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 336, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 452, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 750, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 787, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 892, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 930, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1394, in execute_sql
for sql, params in self.as_sql():
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1337, in as_sql
value_rows = [
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1338, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1338, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1279, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1512, in get_db_prep_save
return connection.ops.adapt_decimalfield_value(self.to_python(value), self.max_digits, self.decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/operations.py", line 530, in adapt_decimalfield_value
return utils.format_number(value, max_digits, decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 235, in format_number
value = value.quantize(decimal.Decimal(1).scaleb(-decimal_places), context=context)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR 'NoneType' object has no attribute 'split'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 132, in _from_xml
self._from_xml_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 82, in _from_xml_credits
for name in element.text.split(","):
AttributeError: 'NoneType' object has no attribute 'split'
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR dictionary update sequence element #0 has length 3; 2 is required
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 145, in _parse_metadata
self.metadata.synthesize_metadata(md_list)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 209, in synthesize_metadata
synth_dict_list.update(dict_list)
ValueError: dictionary update sequence element #0 has length 3; 2 is required
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR dictionary update sequence element #0 has length 3; 2 is required
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 145, in _parse_metadata
self.metadata.synthesize_metadata(md_list)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 209, in synthesize_metadata
synth_dict_list.update(dict_list)
ValueError: dictionary update sequence element #0 has length 3; 2 is required
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR dictionary update sequence element #2 has length 3; 2 is required
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 145, in _parse_metadata
self.metadata.synthesize_metadata(md_list)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 209, in synthesize_metadata
synth_dict_list.update(dict_list)
ValueError: dictionary update sequence element #2 has length 3; 2 is required
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR Could not find a record for ''
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 139, in _parse_metadata
cbi_md = self._parse_metadata_comments()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 123, in _parse_metadata_comments
parser = ComicBookInfo(string=comment)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_json.py", line 22, in from_string
self._from_json(json_obj)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 66, in _from_json
self._from_json_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 45, in _from_json_tags
val = self._pycountry(to_key, val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 71, in _pycountry
obj = module.lookup(name)
File "/usr/local/lib/python3.8/site-packages/pycountry/db.py", line 41, in load_if_needed
return f(self, *args, **kw)
File "/usr/local/lib/python3.8/site-packages/pycountry/db.py", line 146, in lookup
raise LookupError('Could not find a record for %r' % value)
LookupError: Could not find a record for ''
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR dictionary update sequence element #4 has length 3; 2 is required
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 145, in _parse_metadata
self.metadata.synthesize_metadata(md_list)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 209, in synthesize_metadata
synth_dict_list.update(dict_list)
ValueError: dictionary update sequence element #4 has length 3; 2 is required
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR [<class 'decimal.ConversionSyntax'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 131, in _from_xml
self._from_xml_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 106, in _from_xml_tags
val = self.parse_decimal(val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 88, in parse_decimal
return Decimal(num)
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR Unsupported archive type: /comics/Archie Comics/Jughead The Hunger (2017)/Jughead The Hunger 010 (2019).cbz
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 68, in set_path
raise ValueError(f"Unsupported archive type: {self._path}")
ValueError: Unsupported archive type: /comics/Archie Comics/Jughead The Hunger (2017)/Jughead The Hunger 010 (2019).cbz
2020-08-30 19:17:27 codex.librarian.librariand[20] ERROR Unsupported archive type: /comics/Archie Comics/Sabrina the Teenage Witch (2019)/Sabrina the Teenage Witch 002 (2019).cbz
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 68, in set_path
raise ValueError(f"Unsupported archive type: {self._path}")
ValueError: Unsupported archive type: /comics/Archie Comics/Sabrina the Teenage Witch (2019)/Sabrina the Teenage Witch 002 (2019).cbz

Metadata parsing errors, I think?

2020-09-05 06:56:52 codex.librarian.importer[22] INFO Created comic Harley Quinn #3
2020-09-05 06:56:52 codex.librarian.importer[22] INFO Created comic Harley Quinn #4
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Carlos Ezquerra', 'role': 'Cover', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Justin Jordan', 'role': 'Writer', 'primary': False}, {'person': 'Morgan Beem', 'role': 'Artist', 'primary': False}, {'person': 'Morgan Beem', 'role': 'Cover', 'primary': False}, {'person': 'Nikki Ryan', 'role': 'Writer', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Jeff Lemire', 'role': 'Cover', 'primary': False}, {'person': 'Jeremy Haun', 'role': 'Artist', 'primary': False}, {'person': 'Jeremy Haun', 'role': 'Cover', 'primary': False}, {'person': 'Nick Filardi', 'role': 'Colorist', 'primary': False}, {'person': 'Nick Filardi', 'role': 'Cover', 'primary': False}, {'person': 'Seth Peck', 'role': 'Writer', 'primary': False}, {'person': 'Thomas Mauer', 'role': 'Letterer', 'primary': False}, {'person': 'Thomas Mauer', 'role': 'Cover', 'primary': False}, {'person': 'Thomas Mauer', 'role': 'Other', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Jeremy Haun', 'role': 'Artist', 'primary': False}, {'person': 'Jeremy Haun', 'role': 'Cover', 'primary': False}, {'person': 'Mike Huddleston', 'role': 'Cover', 'primary': False}, {'person': 'Nick Filardi', 'role': 'Colorist', 'primary': False}, {'person': 'Nick Filardi', 'role': 'Cover', 'primary': False}, {'person': 'Seth Peck', 'role': 'Writer', 'primary': False}]
Not added to synthesized metadata
Error parsing decimal: 13A
[<class 'decimal.ConversionSyntax'>]
Error parsing decimal: 13B
[<class 'decimal.ConversionSyntax'>]
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Chris Peter', 'role': 'Colorist', 'primary': False}, {'person': 'Clayton Cowles', 'role': 'Letterer', 'primary': False}, {'person': 'Jamie McKelvie', 'role': 'Cover', 'primary': False}, {'person': 'Kelly Sue DeConnick', 'role': 'Writer', 'primary': False}, {'person': 'Lauren Sankovitch', 'role': 'Editor', 'primary': False}, {'person': 'Laurenn McCubbin', 'role': 'Other', 'primary': False}, {'person': 'Rian Hughes', 'role': 'Cover', 'primary': False}, {'person': 'Rian Hughes', 'role': 'Other', 'primary': False}, {'person': 'Valentine De Landro', 'role': 'Artist', 'primary': False}, {'person': 'Valentine De Landro', 'role': 'Cover', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Chris Peter', 'role': 'Colorist', 'primary': False}, {'person': 'Clayton Cowles', 'role': 'Letterer', 'primary': False}, {'person': 'Kelly Sue DeConnick', 'role': 'Writer', 'primary': False}, {'person': 'Lauren Sankovitch', 'role': 'Editor', 'primary': False}, {'person': 'Laurenn McCubbin', 'role': 'Editor', 'primary': False}, {'person': 'Rian Hughes', 'role': 'Cover', 'primary': False}, {'person': 'Rian Hughes', 'role': 'Other', 'primary': False}, {'person': 'Valentine De Landro', 'role': 'Artist', 'primary': False}, {'person': 'Valentine De Landro', 'role': 'Cover', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Kelsey Shannon', 'role': 'Artist', 'primary': False}, {'person': 'Kelsey Shannon', 'role': 'Cover', 'primary': False}, {'person': 'Miles Gunter', 'role': 'Writer', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Bill Oakley', 'role': 'Letterer', 'primary': False}, {'person': 'Carla Feeny', 'role': 'Colorist', 'primary': False}, {'person': 'Heroic Age', 'role': 'Colorist', 'primary': False}, {'person': 'John Ostrander', 'role': 'Writer', 'primary': False}, {'person': 'Peter J. Tomasi', 'role': 'Editor', 'primary': False}, {'person': 'Tom Mandrake', 'role': 'Penciler', 'primary': False}, {'person': 'Tom Mandrake', 'role': 'Inker', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Bill Oakley', 'role': 'Letterer', 'primary': False}, {'person': 'Carla Feeny', 'role': 'Colorist', 'primary': False}, {'person': 'Heroic Age', 'role': 'Colorist', 'primary': False}, {'person': 'Peter J. Tomasi', 'role': 'Editor', 'primary': False}, {'person': 'Ray Kryssing', 'role': 'Inker', 'primary': False}, {'person': 'Stephen Wacker', 'role': 'Editor', 'primary': False}, {'person': 'Tom Mandrake', 'role': 'Writer', 'primary': False}, {'person': 'Tom Mandrake', 'role': 'Artist', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Carla Feeny', 'role': 'Colorist', 'primary': False}, {'person': 'Heroic Age', 'role': 'Colorist', 'primary': False}, {'person': 'John Ostrander', 'role': 'Writer', 'primary': False}, {'person': 'Ken Lopez', 'role': 'Letterer', 'primary': False}, {'person': 'Peter J. Tomasi', 'role': 'Editor', 'primary': False}, {'person': 'Tom Mandrake', 'role': 'Penciler', 'primary': False}, {'person': 'Tom Mandrake', 'role': 'Inker', 'primary': False}, {'person': 'Tom Mandrake', 'role': 'Cover', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Bernard Baily', 'role': 'Artist', 'primary': False}, {'person': 'Gardner Fox', 'role': 'Writer', 'primary': False}, {'person': 'Howard Sherman', 'role': 'Artist', 'primary': False}, {'person': 'Jerry Siegel', 'role': 'Writer', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Alex Sinclair', 'role': 'Colorist', 'primary': False}, {'person': 'Alex Sinclair', 'role': 'Cover', 'primary': False}, {'person': 'Amanda Conner', 'role': 'Writer', 'primary': False}, {'person': 'Amanda Conner', 'role': 'Cover', 'primary': False}, {'person': 'Bill Sienkiewicz', 'role': 'Cover', 'primary': False}, {'person': 'Bret Blevins', 'role': 'Other', 'primary': False}, {'person': 'Chad Hardin', 'role': 'Artist', 'primary': False}, {'person': 'Chris Conroy', 'role': 'Editor', 'primary': False}, {'person': 'Dave Sharpe', 'role': 'Letterer', 'primary': False}, {'person': 'Dave Wielgosz', 'role': 'Editor', 'primary': False}, {'person': 'Dave Wielgosz', 'role': 'Other', 'primary': False}, {'person': 'Hi-Fi (Brian Miller)', 'role': 'Colorist', 'primary': False}, {'person': 'Jimmy Palmiotti', 'role': 'Writer', 'primary': False}, {'person': 'John Timms', 'role': 'Artist', 'primary': False}, {'person': 'Mark Doyle', 'role': 'Editor', 'primary': False}, {'person': 'Mark Doyle', 'role': 'Other', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required
Bad credit list: [{'person': 'Alex Sinclair', 'role': 'Colorist', 'primary': False}, {'person': 'Alex Sinclair', 'role': 'Cover', 'primary': False}, {'person': 'Amanda Conner', 'role': 'Writer', 'primary': False}, {'person': 'Amanda Conner', 'role': 'Cover', 'primary': False}, {'person': 'Bill Sienkiewicz', 'role': 'Cover', 'primary': False}, {'person': 'Chris Conroy', 'role': 'Editor', 'primary': False}, {'person': 'Dave Sharpe', 'role': 'Letterer', 'primary': False}, {'person': 'Dave Wielgosz', 'role': 'Editor', 'primary': False}, {'person': 'Dave Wielgosz', 'role': 'Other', 'primary': False}, {'person': 'Jimmy Palmiotti', 'role': 'Writer', 'primary': False}, {'person': 'Joseph Michael Linsner', 'role': 'Artist', 'primary': False}, {'person': 'Mark Doyle', 'role': 'Editor', 'primary': False}, {'person': 'Mark Doyle', 'role': 'Other', 'primary': False}]
Not added to synthesized metadata
dictionary update sequence element #0 has length 3; 2 is required

New migrations failing on startup

It looks like my Codex server has been down for a few days, likely around the time the new version was released. I checked the logs and found this:

2021-12-18 16:32:11 EST INFO     Loaded config from /config/hypercorn.toml
2021-12-18 16:32:12 EST WARNING  no such table: codex_comic_folders
No changes detected in app 'codex'
Operations to perform:
  Apply all migrations: admin, auth, codex, contenttypes, sessions
Running migrations:
Traceback (most recent call last):
  File "/usr/local/bin/codex", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.10/site-packages/codex/run.py", line 67, in main
    update_db()
  File "/usr/local/lib/python3.10/site-packages/codex/run.py", line 34, in update_db
    call_command("migrate")
  File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 187, in call_command
    return command.execute(*args, **defaults)
  File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 417, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 90, in wrapped
    res = handle_func(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/django/core/management/commands/migrate.py", line 253, in handle
    post_migrate_state = executor.migrate(
  File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 126, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 156, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 235, in apply_migration
    with self.connection.schema_editor(atomic=migration.atomic) as schema_editor:
  File "/usr/local/lib/python3.10/site-packages/django/db/backends/sqlite3/schema.py", line 35, in __exit__
    self.connection.check_constraints()
  File "/usr/local/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py", line 346, in check_constraints
    raise IntegrityError(
django.db.utils.IntegrityError: The row in table 'codex_comic_characters' with primary key '15653' has an invalid foreign key: codex_comic_characters.comic_id contains a value '1674' that does not have a corresponding value in codex_comic.id.
  Applying codex.0006_update_default_names_and_remove_duplicate_comics...%

Is the best option here to just blow away my database and rebuild it? I had put in a lot of manual work to get some issues to be recognized properly and would not like to do that again, but I could. I also think that was just fixing the metadata of the issues themselves, so I suspect they'd import properly this time.

Pagination breaks sorting filters

Unfortunately don't have a screen cast for this one, but I do have reproducible actions and the log

From the top level, I sort by folder view, then leave on sort type of "Name".

I go into my DC Comics folder, then into Batman (1940) which has 731 issues in it which gives me 8 pages.

If I then try to sort by Date Published or anything else, it doesn't rearrange the issues on the current page and attempting to use the pagination buttons at the bottom don't work at all.

If I jump back up to the series view under my publisher the chosen sorting sticks, however trying to click into anything doesn't seem to work at all.

The attached codex.log has quite a lot of tracebacks that seem to be associated with trying to change Sort Type within the issue view. Let me know if there's anything else I can provide.

codex.log

unrar not found

pi@mineralspringsfalls:/mnt/skytopcliff/codex $ which unrar
/usr/local/bin/unrar
2020-09-04 01:09:54 codex.librarian.importer[19354] INFO Updated comic Doctor Strange #013
2020-09-04 01:09:54 codex.librarian.cover[19360] ERROR [Errno 8] Exec format error: 'unrar'
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/codex/librarian/cover.py", line 66, in create_comic_cover
    im = Image.open(BytesIO(car.get_cover_image()))
  File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 195, in get_cover_image
    data = archive.read(cover_fn)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 798, in read
    with self.open(name, "r", pwd) as f:
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 783, in open
    return self._file_parser.open(inf, pwd)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1237, in open
    return self._open_hack(inf, pwd)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1621, in _open_hack
    return self._open_hack_core(inf, pwd, prefix, b"")
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1275, in _open_hack_core
    return self._open_unrar(tmpname, inf, pwd, tmpname)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1286, in _open_unrar
    setup = tool_setup()
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 3327, in tool_setup
    if setup.check():
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 3228, in check
    p = custom_popen(cmdline)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 3164, in custom_popen
    p = Popen(cmd, bufsize=0, stdout=PIPE, stderr=STDOUT, stdin=DEVNULL,
  File "/usr/local/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: 'unrar'
2020-09-04 01:09:54 codex.librarian.cover[19360] ERROR Failed to create cover thumb for /mnt/whitecliff/comics/Darkseid War/02-Forever Evil (001-007+Directors Cut)(2013-2014)(digital)(Son of Ultron-Empire)/Forever Evil 007 (2014) (digital) (Son of Ultron-Empire).cbr
2020-09-04 01:09:55 codex.librarian.cover[19361] ERROR [Errno 8] Exec format error: 'unrar'
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/codex/librarian/cover.py", line 66, in create_comic_cover
    im = Image.open(BytesIO(car.get_cover_image()))
  File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 195, in get_cover_image
    data = archive.read(cover_fn)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 798, in read
    with self.open(name, "r", pwd) as f:
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 783, in open
    return self._file_parser.open(inf, pwd)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1237, in open
    return self._open_hack(inf, pwd)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1621, in _open_hack
    return self._open_hack_core(inf, pwd, prefix, b"")
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1275, in _open_hack_core
    return self._open_unrar(tmpname, inf, pwd, tmpname)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 1286, in _open_unrar
    setup = tool_setup()
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 3327, in tool_setup
    if setup.check():
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 3228, in check
    p = custom_popen(cmdline)
  File "/usr/local/lib/python3.8/site-packages/rarfile.py", line 3164, in custom_popen
    p = Popen(cmd, bufsize=0, stdout=PIPE, stderr=STDOUT, stdin=DEVNULL,
  File "/usr/local/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: 'unrar'
2020-09-04 01:09:55 codex.librarian.cover[19361] ERROR Failed to create cover thumb for /mnt/whitecliff/comics/Doctor Aphra (2016)/Doctor Aphra 005 (2017) (3 covers) (digital) (Minutemen-Midas).cbr
2020-09-04 01:09:55 codex.librarian.cover[19362] ERROR [Errno 8] Exec format error: 'unrar'

Improperly detecting metadata for comic

I found that one of my comics was being put into its own volume. It was detected as the 1975 Guardians of the Galaxy. I reran comictagger to be safe, verified the tag metadata, and then looked in Codex to see that the comic had not been moved. I've tried removing and re-adding the comic as well as tagging it again to no avail.

2020-12-31 17:08:07,141 librarian ThreadPoolExecutor-0_0 codex.librarian.importer INFO Created comic Guardians of the Galaxy: Marvel Presents #003
2020-12-31 17:08:07,178 ForkPoolWorker-1:5 ThreadPoolExecutor-0_0 codex.librarian.cover INFO Created cover thumbnail for: /comics/Guardians of the Galaxy (2019)/Guardians of the Galaxy 003 (2019).cbz

sudo comictagger -pt cr Guardians\ of\ the\ Galaxy\ 003\ (2019).cbz

--------- ComicRack tags ---------
series: Guardians of the Galaxy
issue: 3
title: The Final Gauntlet Three of Six
publisher: Marvel
year: 2019
month: 05
day: 01
volume: 6
webLink: https://comicvine.gamespot.com/guardians-of-the-galaxy-3-the-final-gauntlet-three/4000-703940/
storyArc: The Final Gauntlet
characters: Annihilus, Beta Ray Bill, Black Dwarf, Black Swan, Corvus Glaive, Cosmic Ghost Rider, Ebony Maw, G-Type, Gamora, Gladiator, Groot, Hela, Moondragon, Nebula, Nova, Phyla-Vell, Proxima Midnight, Star-Lord, Starfox, Thanos, Wraith
teams: Black Order, Dark Guardians , Guardians of the Galaxy
locations: Space, The Negative Zone
comments: The Dark Guardians ascend!

With a new Thanos rising, the galaxy calls for a group of heroes who will use any means necessary to end this threat.

Unfortunately for Star-Lord, that's NOT the Guardians of the Galaxy!

List of covers and their creators:
Cover | Name | Creator(s) | Sidebar Location |

Reg | Regular Cover | David Marquez & Dean White | 1 |
Var | Marvel Meow Variant Cover | Nao Fuji | 2 |

notes: Tagged with ComicTagger 1.3.0a0 using info from Comic Vine on 2020-12-31 12:03:24. [Issue ID 703940]
credit: Writer: Donny Cates
credit: Penciller: Geoff Shaw
credit: Inker: Geoff Shaw
credit: Colorist: Marte Gracia
credit: Letterer: Cory Petit
credit: Cover: David Marquez
credit: Cover: Dean White
credit: Cover: Nao Fuji
credit: Editor: Danny Khazem
credit: Editor: Darren Shan
credit: Editor: Jordan D. White
credit: Editor: Lauren Amaro

Comic matching query does not exist exception

2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Gregor The Great
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created comic Action Comics #97
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created comic Action Comics #98
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created comic Action Comics #99
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Cagliostro
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Thoth
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Inspector Erskine Hawkins
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Morpheus
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Oracle of Delphi
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created comic Action Comics #100
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created CreditPerson Digital Chameleon
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created credit Colorist: Digital Chameleon
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created CreditPerson Joe Rosas
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created credit Colorist: Joe Rosas
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created CreditPerson Maureen McTigue
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created credit Editor: Maureen McTigue
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created CreditPerson José Marzán Jr.
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created credit Inker: José Marzán Jr.
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created CreditPerson Ron Lim
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created credit Penciller: Ron Lim
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created CreditPerson Mark Schultz
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created credit Writer: Mark Schultz
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Platinum
2020-08-30 19:06:18 codex.librarian.importer[20] ERROR [<class 'decimal.InvalidOperation'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 336, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 452, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 750, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 787, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 892, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 930, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1394, in execute_sql
for sql, params in self.as_sql():
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1337, in as_sql
value_rows = [
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1338, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1338, in
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1279, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/init.py", line 1512, in get_db_prep_save
return connection.ops.adapt_decimalfield_value(self.to_python(value), self.max_digits, self.decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/operations.py", line 530, in adapt_decimalfield_value
return utils.format_number(value, max_digits, decimal_places)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 235, in format_number
value = value.quantize(decimal.Decimal(1).scaleb(-decimal_places), context=context)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Bruce Doyle
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Specs Dour
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character Craig Dennison
2020-08-30 19:06:18 codex.librarian.importer[20] INFO Created Character P.J. Moran
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created comic Action Comics #101
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created comic Action Comics #102
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created comic Action Comics #103
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created Character Daniel R. Sweetooth
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created comic Action Comics #104
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created comic Action Comics #105
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created Team Penthouse Pirates
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created comic Action Comics #106
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created Character Mr. Grumble
2020-08-30 19:06:19 codex.librarian.importer[20] INFO Created comic Action Comics #107
2020-08-30 19:06:20 codex.librarian.importer[20] INFO Created comic Action Comics #108
2020-08-30 19:06:20 codex.librarian.importer[20] INFO Created comic Action Comics #109
2020-08-30 19:06:20 codex.librarian.importer[20] INFO Created Location Lois Lane's Apartment
2020-08-30 19:06:20 codex.librarian.importer[20] INFO Created comic Action Comics #110

Dictionary update sequence element #0 has length 3; 2 is required exception

2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created comic Anima #5
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created CreditPerson Monica Bennett
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit Colorist: Monica Bennett
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit CoverArtist: Chris Ivy
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit CoverArtist: Jean Segarra
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created CreditPerson Chris Eades
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit Editor: Chris Eades
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created Character Shrike
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created Character Mania
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created Character The Warrior
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created Character Eris
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created comic Anima #6
2020-08-30 19:09:06 codex.librarian.librariand[20] ERROR dictionary update sequence element #0 has length 3; 2 is required
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 145, in _parse_metadata
self.metadata.synthesize_metadata(md_list)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 209, in synthesize_metadata
synth_dict_list.update(dict_list)
ValueError: dictionary update sequence element #0 has length 3; 2 is required
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit CoverArtist: Will Blyberg
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created CreditPerson Brian Garvey
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit Inker: Brian Garvey
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created comic Anima #8
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created comic Anima #9
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created CreditPerson Andrea Difiore
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit Colorist: Andrea Difiore
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit CoverArtist: Frank Pittarese
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created CreditPerson Buzz
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created credit Penciller: Buzz
2020-08-30 19:09:06 codex.librarian.importer[20] INFO Created comic Anima #10

Unsupported archive type

This one isn't exactly an exception, but it would be good if users would be told that things like this are broken so that they can decide if they want to fix it or not.

2020-09-05 07:09:47 codex.librarian.importer[22] INFO Created comic Warlock #15
2020-09-05 07:09:47 codex.librarian.librariand[22] ERROR Unsupported archive type: /comics/Marvel/New Avengers (2010)/New Avengers 009 (2011).cbz
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 68, in set_path
raise ValueError(f"Unsupported archive type: {self._path}")
ValueError: Unsupported archive type: /comics/Marvel/New Avengers (2010)/New Avengers 009 (2011).cbz

Adjust opacity of issue numbering

The background opacity of the numbering can cause some slight blending in some places with the cover image. Perhaps making the background of the number of issues in a folder more defined to avoid this.

image

Comic disappeared from collection

The Amazing Spider-Man 50 seemed to be tagged incorrectly for me, so it was appearing in its own Volume titled Amazing Spider-Man. I ran comictagger on the comic to get the tags fixed and then ran a scan on my comics folder and it just disappeared. It was no longer in its own Volume, nor was it in the The Amazing Spider-Man volume. Relevant lines in the log:

today at 12:32 AM  2020-12-31 05:32:27,343 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Scanning /comics...
today at 12:32 AM  2020-12-31 05:32:29,955 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Queued 0 comics for removal.
today at 12:32 AM  2020-12-31 05:32:29,955 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Queued 2 comics for re-import.
today at 12:32 AM  2020-12-31 05:32:29,975 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Queued 0 folders for removal.
today at 12:32 AM  2020-12-31 05:32:29,975 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Scanning /comics
today at 12:32 AM  2020-12-31 05:32:31,460 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Queued 3 comics for import.
today at 12:32 AM  2020-12-31 05:32:31,524 librarian ThreadPoolExecutor-0_0 codex.librarian.scanner INFO Scan for /comics finished.
today at 12:32 AM  2020-12-31 05:32:31,773 librarian ThreadPoolExecutor-0_0 codex.librarian.importer INFO Created Volume 2018
today at 12:32 AM  2020-12-31 05:32:32,877 librarian ThreadPoolExecutor-0_0 codex.librarian.importer INFO Updated comic The Amazing Spider-Man #050
today at 12:32 AM  2020-12-31 05:32:33,070 librarian ThreadPoolExecutor-0_0 codex.librarian.importer INFO Updated comic The Amazing Spider-Man #0.00
today at 12:32 AM  2020-12-31 05:32:33,242 ForkPoolWorker-1:3 ThreadPoolExecutor-0_0 codex.librarian.cover INFO Created cover thumbnail for: /comics/The Amazing Spider-Man (2018)/The Amazing Spider-Man 051LR (2021).cbz
today at 12:32 AM  2020-12-31 05:32:33,253 ForkPoolWorker-1:1 ThreadPoolExecutor-0_0 codex.librarian.cover INFO Created cover thumbnail for: /comics/The Amazing Spider-Man (2018)/The Amazing Spider-Man 050 (2020).cbz

Decimal conversion syntax exception

020-08-30 19:11:06 codex.librarian.importer[20] INFO Created CreditPerson JJ Harrison
2020-08-30 19:11:06 codex.librarian.importer[20] INFO Created credit CoverArtist: JJ Harrison
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created comic Archie vs. Predator II #2
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created credit CoverArtist: Jamal Igle
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created CreditPerson Pat Kennedy
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created credit CoverArtist: Pat Kennedy
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created credit CoverArtist: Phil Hester
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created CreditPerson Tim Kennedy
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created credit CoverArtist: Tim Kennedy
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created comic Archie vs. Predator II #3
2020-08-30 19:11:07 codex.librarian.librariand[20] ERROR [<class 'decimal.ConversionSyntax'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 131, in _from_xml
self._from_xml_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 106, in _from_xml_tags
val = self.parse_decimal(val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 88, in parse_decimal
return Decimal(num)
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created CreditPerson Jeff Shultz
2020-08-30 19:11:07 codex.librarian.importer[20] INFO Created credit CoverArtist: Jeff Shultz

Enforce cover image size

Some cover images may be dual width pages, such as the attached example. Might be nice to have them forced/stretched to be uniform.

image

Database locked

2020-09-04 22:58:02 codex.librarian.importer[20] INFO Created comic Hellblazer #228
2020-09-04 22:58:02 codex.librarian.importer[20] INFO Created comic Hellblazer #229
2020-09-04 22:58:03 codex.librarian.importer[20] INFO Created comic Hellblazer #230
2020-09-04 22:58:03 codex.librarian.importer[20] INFO Created comic Hellblazer #231
2020-09-04 22:58:04 codex.librarian.importer[20] INFO Created comic Hellblazer #232
2020-09-04 22:58:04 codex.librarian.importer[20] INFO Created comic Hellblazer #233
2020-09-04 22:58:05 codex.librarian.importer[20] ERROR database is locked
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 589, in update_or_create
obj = self.select_for_update().get(**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Comic.DoesNotExist: Comic matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: database is locked

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 336, in import_metadata
comic, created = Comic.objects.update_or_create(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 594, in update_or_create
obj, created = self._create_object_from_params(kwargs, params, lock=True)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/codex/models.py", line 452, in save
super().save(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 750, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 787, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 892, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 930, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1395, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in exit
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: database is locked
2020-09-04 22:58:05 codex.librarian.importer[20] INFO Created comic Hellblazer #235
2020-09-04 22:58:05 codex.librarian.importer[20] INFO Created comic Hellblazer #236
2020-09-04 22:58:05 codex.librarian.importer[20] INFO Created comic Hellblazer #237
2020-09-04 22:58:05 codex.librarian.importer[20] INFO Created comic Hellblazer #238
2020-09-04 22:58:06 codex.librarian.importer[20] INFO Created comic Hellblazer #239
2020-09-04 22:58:06 codex.librarian.importer[20] INFO Created comic Hellblazer #240
2020-09-04 22:58:06 codex.librarian.importer[20] INFO Created comic Hellblazer #241
2020-09-04 22:58:07 codex.librarian.importer[20] INFO Created comic Hellblazer #242
2020-09-04 22:58:07 codex.librarian.importer[20] INFO Created comic Hellblazer #243

variable decimal reference before assignment exception

2020-09-05 06:56:42 codex.librarian.importer[22] INFO Created comic Fury #13
2020-09-05 06:56:43 codex.librarian.importer[22] INFO Created comic The Family Trade #3
2020-09-05 06:56:43 codex.librarian.importer[22] INFO Created credit CoverArtist: Thomas Mauer
2020-09-05 06:56:43 codex.librarian.importer[22] INFO Created comic The Realm #2
2020-09-05 06:56:43 codex.librarian.importer[22] INFO Created comic The Realm #4
2020-09-05 06:56:44 codex.librarian.librariand[22] ERROR local variable 'decimal' referenced before assignment
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 131, in _from_xml
self._from_xml_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 106, in _from_xml_tags
val = self.parse_decimal(val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 107, in parse_decimal
return decimal
UnboundLocalError: local variable 'decimal' referenced before assignment
2020-09-05 06:56:44 codex.librarian.librariand[22] ERROR local variable 'decimal' referenced before assignment
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 131, in _from_xml
self._from_xml_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 106, in _from_xml_tags
val = self.parse_decimal(val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 107, in parse_decimal
return decimal
UnboundLocalError: local variable 'decimal' referenced before assignment

Various Import Tracebacks

The following Stacktraces were thrown when importing my initial comic collection, hopefully they can be helpful:

2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created comic X-Files #17
2020-08-28 23:14:40 codex.librarian.importer[21] ERROR get() returned more than one Credit -- it returned 3!
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 317, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 203, in get_credits
credit, created = Credit.objects.get_or_create(defaults=defaults, **search)
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 573, in get_or_create
return self.get(**kwargs), False
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 433, in get
raise self.model.MultipleObjectsReturned(
codex.models.Credit.MultipleObjectsReturned: get() returned more than one Credit -- it returned 3!
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created CreditPerson John Rozum
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created credit Writer: John Rozum
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created comic X-Files #19
2020-08-28 23:14:40 codex.librarian.importer[21] ERROR get() returned more than one Credit -- it returned 3!
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 317, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 203, in get_credits
credit, created = Credit.objects.get_or_create(defaults=defaults, **search)
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 573, in get_or_create
return self.get(**kwargs), False
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 433, in get
raise self.model.MultipleObjectsReturned(
codex.models.Credit.MultipleObjectsReturned: get() returned more than one Credit -- it returned 3!
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created CreditPerson Joe Rubinstein
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created credit Inker: Joe Rubinstein
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created CreditPerson Gordon Purcell
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created credit Penciller: Gordon Purcell
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created CreditPerson Kevin J. Anderson
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created credit Writer: Kevin J. Anderson
2020-08-28 23:14:40 codex.librarian.importer[21] INFO Created Location South Dakota

2020-08-28 23:14:59 codex.librarian.importer[21] INFO Created comic Transmetropolitan #45
2020-08-28 23:14:59 codex.librarian.librariand[21] ERROR Unsupported archive type: /comics/Vertigo/Transmetropolitan (1997)/transmetropolitan 046 (2001).cbz
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 68, in set_path
raise ValueError(f"Unsupported archive type: {self._path}")
ValueError: Unsupported archive type: /comics/Vertigo/Transmetropolitan (1997)/transmetropolitan 046 (2001).cbz

2020-08-28 23:14:59 codex.librarian.importer[21] ERROR database is locked
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: database is locked

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 343, in import_metadata
getattr(comic, attr).set(instance_list)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 1015, in set
self.add(*new_objs, through_defaults=through_defaults)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 950, in add
self._add_items(
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 1130, in _add_items
self.through._default_manager.using(db).bulk_create([
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 506, in bulk_create
returned_columns = self._batched_insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1272, in _batched_insert
self._insert(item, fields=fields, using=self.db, ignore_conflicts=ignore_conflicts)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1395, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in exit
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: database is locked

2020-08-28 23:15:00 codex.librarian.importer[21] INFO Created comic Preacher #1
...skipping...
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: database is locked

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 343, in import_metadata
getattr(comic, attr).set(instance_list)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 1015, in set
self.add(*new_objs, through_defaults=through_defaults)
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 950, in add
self._add_items(
File "/usr/local/lib/python3.8/site-packages/django/db/models/fields/related_descriptors.py", line 1130, in _add_items
self.through._default_manager.using(db).bulk_create([
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 506, in bulk_create
returned_columns = self._batched_insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1272, in _batched_insert
self._insert(item, fields=fields, using=self.db, ignore_conflicts=ignore_conflicts)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1395, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in exit
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: database is locked

2020-08-28 23:15:05 codex.librarian.importer[21] INFO Created comic Preacher #66
2020-08-28 23:15:05 codex.librarian.librariand[21] ERROR [<class 'decimal.ConversionSyntax'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 139, in _parse_metadata
cbi_md = self._parse_metadata_comments()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 123, in _parse_metadata_comments
parser = ComicBookInfo(string=comment)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_json.py", line 22, in from_string
self._from_json(json_obj)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 66, in _from_json
self._from_json_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 43, in _from_json_tags
val = self.parse_decimal(val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 88, in parse_decimal
return Decimal(num)
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]

2020-08-28 23:15:13 codex.librarian.librariand[21] ERROR Unsupported archive type: /comics/Vertigo/The Invisibles Volume Two (1997)/The Invisibles v2 003 (1997) (digital) (Son of Ultron-Empire).cbr
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 68, in set_path
raise ValueError(f"Unsupported archive type: {self._path}")
ValueError: Unsupported archive type: /comics/Vertigo/The Invisibles Volume Two (1997)/The Invisibles v2 003 (1997) (digital) (Son of Ultron-Empire).cbr

2020-08-28 23:15:34 codex.librarian.cover[29] ERROR Bad magic number for file header
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/cover.py", line 66, in create_comic_cover
im = Image.open(BytesIO(car.get_cover_image()))
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 195, in get_cover_image
data = archive.read(cover_fn)
File "/usr/local/lib/python3.8/zipfile.py", line 1475, in read
with self.open(name, "r", pwd) as fp:
File "/usr/local/lib/python3.8/zipfile.py", line 1535, in open
raise BadZipFile("Bad magic number for file header")
zipfile.BadZipFile: Bad magic number for file header

2020-08-28 23:15:43 codex.librarian.librariand[21] ERROR Unsupported archive type: /comics/Vertigo/Vinyl Underground (2007)/vinyl underground 008 (2008).cbz
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 68, in set_path
raise ValueError(f"Unsupported archive type: {self._path}")
ValueError: Unsupported archive type: /comics/Vertigo/Vinyl Underground (2007)/vinyl underground 008 (2008).cbz

2020-08-28 23:16:36 codex.librarian.importer[21] INFO Created comic Doctor Strange #1
2020-08-28 23:16:36 codex.librarian.librariand[21] ERROR [<class 'decimal.ConversionSyntax'>]
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 131, in _from_xml
self._from_xml_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 106, in _from_xml_tags
val = self.parse_decimal(val)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 88, in parse_decimal
return Decimal(num)
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]

2020-08-28 23:21:00 codex.librarian.importer[21] INFO Created CreditPerson Cam Kennedy
2020-08-28 23:21:00 codex.librarian.importer[21] ERROR NOT NULL constraint failed: codex_credit.role_id
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 573, in get_or_create
return self.get(**kwargs), False
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Credit.DoesNotExist: Credit matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: codex_credit.role_id

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 317, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 203, in get_credits
credit, created = Credit.objects.get_or_create(defaults=defaults, **search)
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 576, in get_or_create
return self._create_object_from_params(kwargs, params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 750, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 787, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 892, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 930, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1395, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in exit
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: codex_credit.role_id
2020-08-28 23:21:00 codex.librarian.importer[21] INFO Created credit Penciller: Don Hudson

2020-08-28 23:21:01 codex.librarian.importer[21] INFO Created CreditPerson Charles Barnett III
2020-08-28 23:21:01 codex.librarian.importer[21] ERROR NOT NULL constraint failed: codex_credit.role_id
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 573, in get_or_create
return self.get(**kwargs), False
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
raise self.model.DoesNotExist(
codex.models.Credit.DoesNotExist: Credit matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: codex_credit.role_id

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 317, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 203, in get_credits
credit, created = Credit.objects.get_or_create(defaults=defaults, **search)
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 576, in get_or_create
return self._create_object_from_params(kwargs, params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 610, in _create_object_from_params
obj = self.create(**params)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 447, in create
obj.save(force_insert=True, using=self.db)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 750, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 787, in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 892, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 930, in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1249, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1395, in execute_sql
cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in exit
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: codex_credit.role_id

2020-08-28 23:24:43 codex.librarian.importer[21] INFO Created comic Spider Man #000
2020-08-28 23:24:43 codex.librarian.librariand[21] ERROR 'NoneType' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 139, in _parse_metadata
cbi_md = self._parse_metadata_comments()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 123, in _parse_metadata_comments
parser = ComicBookInfo(string=comment)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_json.py", line 22, in from_string
self._from_json(json_obj)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 67, in _from_json
self._from_json_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 60, in _from_json_credits
for credit in credits:
TypeError: 'NoneType' object is not iterable
2020-08-28 23:24:43 codex.librarian.librariand[21] ERROR 'NoneType' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 139, in _parse_metadata
cbi_md = self._parse_metadata_comments()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 123, in _parse_metadata_comments
parser = ComicBookInfo(string=comment)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_json.py", line 22, in from_string
self._from_json(json_obj)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 67, in _from_json
self._from_json_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 60, in _from_json_credits
for credit in credits:
TypeError: 'NoneType' object is not iterable
2020-08-28 23:24:43 codex.librarian.librariand[21] ERROR 'NoneType' object is not iterable
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 139, in _parse_metadata
cbi_md = self._parse_metadata_comments()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 123, in _parse_metadata_comments
parser = ComicBookInfo(string=comment)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 52, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_json.py", line 22, in from_string
self._from_json(json_obj)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 67, in _from_json
self._from_json_credits(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicbookinfo.py", line 60, in _from_json_credits
for credit in credits:
TypeError: 'NoneType' object is not iterable

Issue number not getting pulled from filename if no metadata/tags

I notice that when Codex scans a folder and a few comics that don't (yet) have tags, but are cleanly named, it can't figure out the issue number.

For example:

The Walking Dead #002 (2003).cbz
The Walking Dead #3.cbz
The Walking Dead 4.cbz

are imported the correct series, but all as issue 0.

Unsupported archive type exception

2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created CreditPerson Andy Fish
2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created credit Colorist: Andy Fish
2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created credit CoverArtist: Victor Ibáñez
2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created /comics/Archie Comics/Sabrina the Teenage Witch (2019) db folder.
2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created comic Sabrina the Teenage Witch #1
2020-08-30 19:11:23 codex.librarian.librariand[20] ERROR Unsupported archive type: /comics/Archie Comics/Sabrina the Teenage Witch (2019)/Sabrina the Teenage Witch 002 (2019).cbz
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 122, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 359, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 53, in init
self.set_path(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 68, in set_path
raise ValueError(f"Unsupported archive type: {self._path}")
ValueError: Unsupported archive type: /comics/Archie Comics/Sabrina the Teenage Witch (2019)/Sabrina the Teenage Witch 002 (2019).cbz
2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created comic Sabrina the Teenage Witch #3
2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created comic Sabrina the Teenage Witch #4
2020-08-30 19:11:23 codex.librarian.importer[20] INFO Created Series Sabrina the Teenage Witch

For something like this, might be good to alert the user so that they can go fix the specific comic.

Feature Request: Different browsing views

It might be cool to have the option to present other views of the comics list while browsing, beyond just the thumbnail grid. As example detailed lists and compact lists. As an example, at leagueofcomicgeeks.com, you can use thumbnail view, detailed view, and text list view.

detailed
text

Codex could show slightly different data than the League website, of course, but that's the general idea.

Thanks for creating this great server app!

Reader - Height Mode Gap - Stacking Double Pages - None Functional Width Mode

Sorry for combining three issues into one, but I figure they all come from the inital attempt for a fix for centering the comic page issue.

I've got an imgur album here showing the issues I'll describe

https://imgur.com/a/wcrgo2w

So first, in Height mode and by default there is a large blank gap at the bottom of each page, pretty ugly.

Second, when selecting Display two pages, it now stacks them with the Gap in between them, also pretty ugly.

Third, Width and Original seem to just place both pages into the same type of bounding box, perhaps a container you ended up centering for the fix for off center pages?

Codex should run natively on Windows

Win10 Pro 20h2
Python 3.8.3
Installed from pip install codex

I can load http://localhost:9810 in a browser and get the initial log-in screen. I can log in with admin/admin and when I go to reset the default admin password and create a new non-admin account, it all seems to go ok.

When I browse to the main non-admin page, http://localhost:9810/browse/r/0/1, it spits out this traceback in the console:

2020-11-23 15:54:57 asyncio[11140] ERROR Task exception was never retrieved
future: <Task finished name='Task-109' coro=<worker_serve.._server_callback() done, defined at C:\Users\Nich\AppData\Roaming\Python\Python38\site-packages\hypercorn\asyncio\run.py:88> exception=ConnectionAbortedError(10053, 'An established connection was aborted by the software in your host machine', None, 10053, None)>
Traceback (most recent call last):
File "C:\Users\Nich\AppData\Roaming\Python\Python38\site-packages\hypercorn\asyncio\run.py", line 89, in _server_callback
await TCPServer(app, loop, config, reader, writer)
File "C:\Users\Nich\AppData\Roaming\Python\Python38\site-packages\hypercorn\asyncio\tcp_server.py", line 83, in run
await self._close()
File "C:\Users\Nich\AppData\Roaming\Python\Python38\site-packages\hypercorn\asyncio\tcp_server.py", line 129, in _close
await self.writer.wait_closed()
File "c:\python\python38\lib\asyncio\streams.py", line 359, in wait_closed
await self._protocol._get_close_waiter(self)
File "c:\python\python38\lib\asyncio\proactor_events.py", line 395, in _loop_writing
self._write_fut = self._loop._proactor.send(self._sock, data)
File "c:\python\python38\lib\asyncio\windows_events.py", line 528, in send
ov.WSASend(conn.fileno(), buf, flags)
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

(This traceback isn't always happening)

LOGLEVEL=DEBUG codex seems to not load anything other than a syntax error in Windows. When I run it via codex LOGLEVEL=DEBUG it seems to give no more detailed log data than just running codex

I added my entire library and realised that's maybe a bad idea with how large it is, and after wiping the settings folder and starting from scratch, added the folder of a single comic. I don't seem to be able to get this to to actually scan, now - it has watch enabled, cron disabled, and whether I tell it to scan for all changes, or import all comics, it doesn't show anything when I'm back on the library public page.

If I delete the library, on the main admin page under 'history' I can see that I added and removed it, but nothing in-between.

ValueError: invalid literal for int() with base 10: 'v1'

2020-09-05 07:07:09 codex.librarian.importer[22] INFO Created comic The Amazing Spider-Man #93
2020-09-05 07:07:09 codex.librarian.importer[22] INFO Created comic The Amazing Spider-Man #563
2020-09-05 07:07:10 codex.librarian.importer[22] ERROR 'NoneType' object has no attribute 'name'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 321, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 210, in get_credits
LOG.info(f"Created credit {credit.role.name}: {credit.person.name}")
AttributeError: 'NoneType' object has no attribute 'name'
2020-09-05 07:07:10 codex.librarian.importer[22] ERROR 'NoneType' object has no attribute 'name'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 321, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 210, in get_credits
LOG.info(f"Created credit {credit.role.name}: {credit.person.name}")
AttributeError: 'NoneType' object has no attribute 'name'
2020-09-05 07:07:10 codex.librarian.importer[22] ERROR 'NoneType' object has no attribute 'name'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 321, in import_metadata
credits = self.get_credits()
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 210, in get_credits
LOG.info(f"Created credit {credit.role.name}: {credit.person.name}")
AttributeError: 'NoneType' object has no attribute 'name'
2020-09-05 07:07:11 codex.librarian.librariand[22] ERROR invalid literal for int() with base 10: 'v1'
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/librariand.py", line 128, in librarian
import_comic(task.library_id, task.src_path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 363, in import_comic
importer = Importer(library_id, path)
File "/usr/local/lib/python3.8/site-packages/codex/librarian/importer.py", line 114, in init
self.car = ComicArchive(path)
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 57, in init
self._parse_metadata()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 138, in _parse_metadata
cix_md, comet_md = self._parse_metadata_entries()
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 107, in _parse_metadata_entries
parser = xml_parser_cls(string=data)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_base.py", line 60, in init
self.from_string(string)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comic_xml.py", line 42, in from_string
self._from_xml(tree)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 131, in _from_xml
self._from_xml_tags(root)
File "/usr/local/lib/python3.8/site-packages/comicbox/metadata/comicinfoxml.py", line 104, in _from_xml_tags
val = int(val)
ValueError: invalid literal for int() with base 10: 'v1'

Invalid argument exception

2020-08-30 19:13:19 codex.librarian.cover[30] INFO Created cover thumbnail for: /comics/DC Comics/Action Comics (1938)/Action Comics 272 (1961).cbz
2020-08-30 19:13:20 codex.librarian.cover[33] INFO Created cover thumbnail for: /comics/DC Comics/Action Comics (1938)/Action Comics 274 (1961).cbz
2020-08-30 19:13:20 codex.librarian.cover[31] INFO Created cover thumbnail for: /comics/DC Comics/Action Comics (1938)/Action Comics 278 (1961).cbz
2020-08-30 19:13:20 codex.librarian.cover[32] INFO Created cover thumbnail for: /comics/DC Comics/Action Comics (1938)/Action Comics 281 (1961).cbz
2020-08-30 19:13:20 codex.librarian.cover[27] INFO Created cover thumbnail for: /comics/DC Comics/Action Comics (1938)/Action Comics 273 (1961).cbz
2020-08-30 19:13:20 codex.librarian.cover[26] ERROR [Errno 22] Invalid argument
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/codex/librarian/cover.py", line 66, in create_comic_cover
im = Image.open(BytesIO(car.get_cover_image()))
File "/usr/local/lib/python3.8/site-packages/comicbox/comic_archive.py", line 195, in get_cover_image
data = archive.read(cover_fn)
File "/usr/local/lib/python3.8/zipfile.py", line 1475, in read
with self.open(name, "r", pwd) as fp:
File "/usr/local/lib/python3.8/zipfile.py", line 1530, in open
fheader = zef_file.read(sizeFileHeader)
File "/usr/local/lib/python3.8/zipfile.py", line 763, in read
self._file.seek(self._pos)
OSError: [Errno 22] Invalid argument
2020-08-30 19:13:20 codex.librarian.cover[26] ERROR Failed to create cover thumb for /comics/DC Comics/Action Comics (1938)/Action Comics 283 (1961).cbz
2020-08-30 19:13:20 codex.librarian.cover[29] INFO Created cover thumbnail for: /comics/DC Comics/Action Comics (1938)/Action Comics 275 (1961).cbz
2020-08-30 19:13:20 codex.librarian.importer[20] INFO Created comic Aquaman #53
2020-08-30 19:13:20 codex.librarian.cover[25] INFO Created cover thumbnail for: /comics/DC Comics/Action Comics (1938)/Action Comics 282 (1961).cbz

Covers thumbnails for browsing don't show

I just gave a try to codex 0.9.9 (installed via pip on Ubuntu 20.04, python3.9)

I pointed it at a folder with about 40 cbz files, all of them already tagged with comicinfo.xml. The files seemed to be scanned in perfectly. I can browse by series, issues, publisher, folder. I can view metadata for each comic. And finally I can read each comic just fine, start to finish

The only thing that doesn't seem to be working is the cover thumbnail display while browsing. Instead of cover thumbnails, there are only the swirly circle gifs. There doesn't seem to be anything of interest in the logs.

Any idea of how I can troubleshoot this?

Pagination introduces double scroll bars

Not always, but in some cases that I'm not sure why, double scroll bars are happening when looking at issues with pagination now.

It isn't consistent, even in the same series. In Batman here for instance, the first page does it, the second and third don't, the fourth does, the fifth doesn't etc etc.

This can be quite annoying as you have to essentially "scroll to the bottom" twice, which from a user perspective causes quite a bit of frustration when attempting to progress through the pagination.

See attached gif for an example.

https://i.imgur.com/dSmbkkb.mp4

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.