")
diff --git a/cps/templates/grid.html b/cps/templates/grid.html
index 1905d52d..3fa6958f 100644
--- a/cps/templates/grid.html
+++ b/cps/templates/grid.html
@@ -28,7 +28,7 @@
- {{ image.series(entry[0].series[0], alt=entry[0].series[0].name|shortentitle) }}
+ {{ image.book_cover(entry[0])}}
{{entry.count}}
diff --git a/cps/uploader.py b/cps/uploader.py
index bf30094d..23dfc4a6 100644
--- a/cps/uploader.py
+++ b/cps/uploader.py
@@ -79,7 +79,7 @@ def process(tmp_file_path, original_file_name, original_file_extension, rar_exec
meta = epub.get_epub_info(tmp_file_path, original_file_name, original_file_extension)
elif ".FB2" == extension_upper and use_fb2_meta is True:
meta = fb2.get_fb2_info(tmp_file_path, original_file_extension)
- elif extension_upper in ['.CBZ', '.CBT', '.CBR']:
+ elif extension_upper in ['.CBZ', '.CBT', '.CBR', ".CB7"]:
meta = comic.get_comic_info(tmp_file_path,
original_file_name,
original_file_extension,
diff --git a/cps/web.py b/cps/web.py
index 9793f01a..95b1222c 100755
--- a/cps/web.py
+++ b/cps/web.py
@@ -1002,13 +1002,21 @@ def series_list():
if no_series_count:
entries.append([db.Category(_("None"), "-1"), no_series_count])
entries = sorted(entries, key=lambda x: x[0].name.lower(), reverse=not order_no)
- return render_title_template('list.html', entries=entries, folder='web.books_list', charlist=char_list,
- title=_("Series"), page="serieslist", data="series", order=order_no)
+ return render_title_template('list.html',
+ entries=entries,
+ folder='web.books_list',
+ charlist=char_list,
+ title=_("Series"),
+ page="serieslist",
+ data="series", order=order_no)
else:
- entries = calibre_db.session.query(db.Books, func.count('books_series_link').label('count'),
- func.max(db.Books.series_index), db.Books.id) \
- .join(db.books_series_link).join(db.Series).filter(calibre_db.common_filters()) \
- .group_by(text('books_series_link.series')).order_by(order).all()
+ entries = (calibre_db.session.query(db.Books, func.count('books_series_link').label('count'),
+ func.max(db.Books.series_index), db.Books.id)
+ .join(db.books_series_link).join(db.Series).filter(calibre_db.common_filters())
+ .group_by(text('books_series_link.series'))
+ .having(func.max(db.Books.series_index))
+ .order_by(order)
+ .all())
return render_title_template('grid.html', entries=entries, folder='web.books_list', charlist=char_list,
title=_("Series"), page="serieslist", data="series", bodyClass="grid-view",
order=order_no)
diff --git a/optional-requirements.txt b/optional-requirements.txt
index 45f842eb..6e82fd60 100644
--- a/optional-requirements.txt
+++ b/optional-requirements.txt
@@ -35,6 +35,7 @@ html2text>=2020.1.16,<2022.1.1
python-dateutil>=2.1,<2.9.0
beautifulsoup4>=4.0.1,<4.13.0
faust-cchardet>=2.1.18,<2.1.20
+py7zr>=0.15.0,<0.21.0
# Comics
natsort>=2.2.0,<8.4.0
diff --git a/setup.cfg b/setup.cfg
index b445eb5e..1f617648 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -92,6 +92,7 @@ metadata =
python-dateutil>=2.1,<2.9.0
beautifulsoup4>=4.0.1,<4.12.0
faust-cchardet>=2.1.18
+ py7zr>=0.15.0,<0.21.0
comics =
natsort>=2.2.0,<8.4.0
comicapi>=2.2.0,<3.3.0
diff --git a/test/Calibre-Web TestSummary_Linux.html b/test/Calibre-Web TestSummary_Linux.html
index 309c9a25..66d4df88 100644
--- a/test/Calibre-Web TestSummary_Linux.html
+++ b/test/Calibre-Web TestSummary_Linux.html
@@ -37,20 +37,20 @@
-
Start Time: 2023-07-26 21:47:14
+
Start Time: 2023-08-23 21:16:31
-
Stop Time: 2023-07-27 04:10:01
+
Stop Time: 2023-08-24 03:51:45
-
Duration: 5h 21 min
+
Duration: 5h 34 min
@@ -234,12 +234,12 @@
-
+
TestBackupMetadata |
22 |
- 20 |
- 1 |
- 1 |
+ 22 |
+ 0 |
+ 0 |
0 |
Detail
@@ -293,32 +293,11 @@
- |
+
TestBackupMetadata - test_backup_change_book_publisher
|
-
-
-
-
-
-
-
- |
+ PASS |
@@ -395,33 +374,11 @@ AssertionError: '' != 'Lo,执|1u'
-
+
TestBackupMetadata - test_backup_change_custom_categories
|
-
-
-
-
-
-
-
- |
+ PASS |
@@ -1015,11 +972,11 @@ TypeError: 'NoneType' object is not iterable
-
+
TestEbookConvertGDriveKepubify |
3 |
- 2 |
- 1 |
+ 3 |
+ 0 |
0 |
0 |
@@ -1038,33 +995,11 @@ TypeError: 'NoneType' object is not iterable
- |
+
TestEbookConvertGDriveKepubify - test_convert_only
|
-
-
-
-
-
-
-
- |
+ PASS |
@@ -1079,15 +1014,15 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditAdditionalBooks |
+ 20 |
17 |
- 16 |
- 0 |
0 |
1 |
+ 2 |
- Detail
+ Detail
|
@@ -1201,7 +1136,36 @@ AssertionError: 'Started' != 'Finished'
-
+
+
+ TestEditAdditionalBooks - test_upload_metadata_cb7
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
TestEditAdditionalBooks - test_upload_metadata_cbr
|
@@ -1210,7 +1174,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditAdditionalBooks - test_upload_metadata_cbt
|
@@ -1219,7 +1183,42 @@ AssertionError: 'Started' != 'Finished'
-
+
+
+ TestEditAdditionalBooks - test_writeonly_calibre_database
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+ TestEditAdditionalBooks - test_writeonly_path
+ |
+ PASS |
+
+
+
+
+
TestEditAdditionalBooks - test_xss_author_edit
|
@@ -1228,7 +1227,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditAdditionalBooks - test_xss_comment_edit
|
@@ -1237,7 +1236,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditAdditionalBooks - test_xss_custom_comment_edit
|
@@ -1247,15 +1246,15 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks |
- 37 |
- 35 |
- 0 |
+ 38 |
+ 34 |
0 |
2 |
+ 2 |
- Detail
+ Detail
|
@@ -1538,7 +1537,36 @@ AssertionError: 'Started' != 'Finished'
-
+
+
+ TestEditBooks - test_upload_book_cb7
+ |
+
+
+
+
+
+
+
+ |
+
+
+
+
+
TestEditBooks - test_upload_book_cbr
|
@@ -1547,7 +1575,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_book_cbt
|
@@ -1556,7 +1584,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_book_cbz
|
@@ -1565,7 +1593,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_book_epub
|
@@ -1574,7 +1602,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_book_fb2
|
@@ -1583,7 +1611,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_book_lit
|
@@ -1592,7 +1620,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_book_mobi
|
@@ -1601,7 +1629,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_book_pdf
|
@@ -1610,7 +1638,7 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_cbz_coverformats
|
@@ -1619,11 +1647,31 @@ AssertionError: 'Started' != 'Finished'
-
+
TestEditBooks - test_upload_cover_hdd
|
- PASS |
+
+
+
+
+
+
+
+ |
@@ -1944,11 +1992,11 @@ AssertionError: 'Started' != 'Finished'
-
+
TestLoadMetadata |
1 |
- 1 |
0 |
+ 1 |
0 |
0 |
@@ -1958,21 +2006,47 @@ AssertionError: 'Started' != 'Finished'
- |
+
TestLoadMetadata - test_load_metadata
|
- PASS |
+
+
+
+
+
+
+
+ |
-
+
TestEditBooksOnGdrive |
18 |
- 17 |
- 1 |
+ 18 |
+ 0 |
0 |
0 |
@@ -2135,31 +2209,11 @@ AssertionError: 'Started' != 'Finished'
- |
+
TestEditBooksOnGdrive - test_watch_metadata
|
-
-
-
-
-
-
-
- |
+ PASS |
@@ -3606,11 +3660,11 @@ AssertionError: False is not true
-
+
TestReader |
6 |
- 5 |
- 1 |
+ 6 |
+ 0 |
0 |
0 |
@@ -3656,37 +3710,11 @@ AssertionError: False is not true
- |
+
TestReader - test_sound_listener
|
-
-
-
-
-
-
-
- |
+ PASS |
@@ -4054,11 +4082,11 @@ AssertionError: '0:03' != '0:02'
-
+
TestThumbnails |
8 |
- 6 |
- 1 |
+ 7 |
+ 0 |
0 |
1 |
@@ -4095,31 +4123,11 @@ AssertionError: '0:03' != '0:02'
- |
+
TestThumbnails - test_cover_change_on_upload_new_cover
|
-
-
-
-
-
-
-
- |
+ PASS |
@@ -5229,11 +5237,11 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
Total |
- 457 |
- 443 |
- 5 |
+ 461 |
+ 448 |
1 |
- 8 |
+ 3 |
+ 9 |
|
@@ -5261,13 +5269,13 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
Platform |
- Linux 6.2.0-25-generic #25~22.04.2-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 28 09:55:23 UTC 2 x86_64 x86_64 |
+ Linux 6.2.0-26-generic #26~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Jul 13 16:27:29 UTC 2 x86_64 x86_64 |
Basic |
Python |
- 3.10.6 |
+ 3.10.12 |
Basic |
@@ -5279,7 +5287,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
APScheduler |
- 3.10.1 |
+ 3.10.4 |
Basic |
@@ -5297,7 +5305,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
Flask |
- 2.3.2 |
+ 2.3.3 |
Basic |
@@ -5405,13 +5413,13 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
Werkzeug |
- 2.3.6 |
+ 2.3.7 |
Basic |
google-api-python-client |
- 2.95.0 |
+ 2.97.0 |
TestBackupMetadataGdrive |
@@ -5429,7 +5437,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
PyDrive2 |
- 1.16.1 |
+ 1.17.0 |
TestBackupMetadataGdrive |
@@ -5441,7 +5449,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
google-api-python-client |
- 2.95.0 |
+ 2.97.0 |
TestCliGdrivedb |
@@ -5459,7 +5467,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
PyDrive2 |
- 1.16.1 |
+ 1.17.0 |
TestCliGdrivedb |
@@ -5471,7 +5479,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
google-api-python-client |
- 2.95.0 |
+ 2.97.0 |
TestEbookConvertCalibreGDrive |
@@ -5489,7 +5497,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
PyDrive2 |
- 1.16.1 |
+ 1.17.0 |
TestEbookConvertCalibreGDrive |
@@ -5501,7 +5509,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
google-api-python-client |
- 2.95.0 |
+ 2.97.0 |
TestEbookConvertGDriveKepubify |
@@ -5519,7 +5527,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
PyDrive2 |
- 1.16.1 |
+ 1.17.0 |
TestEbookConvertGDriveKepubify |
@@ -5535,15 +5543,27 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
TestEditAdditionalBooks |
+
+ py7zr |
+ 0.20.6 |
+ TestEditAdditionalBooks |
+
+
rarfile |
4.0 |
TestEditAdditionalBooks |
+
+ py7zr |
+ 0.20.6 |
+ TestEditBooks |
+
+
google-api-python-client |
- 2.95.0 |
+ 2.97.0 |
TestEditAuthorsGdrive |
@@ -5561,7 +5581,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
PyDrive2 |
- 1.16.1 |
+ 1.17.0 |
TestEditAuthorsGdrive |
@@ -5579,7 +5599,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
google-api-python-client |
- 2.95.0 |
+ 2.97.0 |
TestEditBooksOnGdrive |
@@ -5597,7 +5617,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
PyDrive2 |
- 1.16.1 |
+ 1.17.0 |
TestEditBooksOnGdrive |
@@ -5621,7 +5641,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
google-api-python-client |
- 2.95.0 |
+ 2.97.0 |
TestSetupGdrive |
@@ -5639,7 +5659,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
PyDrive2 |
- 1.16.1 |
+ 1.17.0 |
TestSetupGdrive |
@@ -5663,13 +5683,13 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
jsonschema |
- 4.18.4 |
+ 4.19.0 |
TestKoboSync |
jsonschema |
- 4.18.4 |
+ 4.19.0 |
TestKoboSyncBig |
@@ -5681,7 +5701,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03
jsonschema |
- 4.18.4 |
+ 4.19.0 |
TestLdapLogin |
@@ -5711,7 +5731,7 @@ AssertionError: 0.0288805190529425 not greater than or equal to 0.03