From a66b5ea0e3d23a46dceea90f9ecb950e486c17a2 Mon Sep 17 00:00:00 2001
From: thFrgttn <39759781+thFrgttn@users.noreply.github.com>
Date: Sun, 23 Jan 2022 09:40:45 +1100
Subject: [PATCH] Series sorting filtering (#200)
Because additional series results are now returned due to #143 the series selection window can with a large number of results that are not usually sorted in a useful way.
I've created 3 settings that can help finding the corect series quickly
use the publisher black list - can be toggled from the series selction screen, as well as a setting for is default behaviour
a setting to make the result initially sorted by start year instead of the default no of issues
a setting to initially put exact and near matches at the top of the list
---
comictaggerlib/settings.py | 25 ++++++++++-
comictaggerlib/settingswindow.py | 13 ++++++
comictaggerlib/ui/settingswindow.ui | 34 +++++++++++++++
comictaggerlib/ui/volumeselectionwindow.ui | 10 +++++
comictaggerlib/volumeselectionwindow.py | 51 ++++++++++++++++++++--
5 files changed, 128 insertions(+), 5 deletions(-)
diff --git a/comictaggerlib/settings.py b/comictaggerlib/settings.py
index 8808788..ab09eac 100644
--- a/comictaggerlib/settings.py
+++ b/comictaggerlib/settings.py
@@ -79,7 +79,7 @@ class ComicTaggerSettings:
# identifier settings
self.id_length_delta_thresh = 5
self.id_publisher_blacklist = "Panini Comics, Abril, Planeta DeAgostini, Editorial Televisa, Dino Comics"
-
+
# Show/ask dialog flags
self.ask_about_cbi_in_rar = True
self.show_disclaimer = True
@@ -95,6 +95,10 @@ class ComicTaggerSettings:
self.remove_html_tables = False
self.cv_api_key = ""
+ self.sort_series_by_year = True
+ self.exact_series_matches_first = True
+ self.always_use_publisher_blacklist = False
+
# CBL Tranform settings
self.assume_lone_credit_is_primary = False
@@ -254,6 +258,17 @@ class ComicTaggerSettings:
if self.config.has_option('comicvine', 'remove_html_tables'):
self.remove_html_tables = self.config.getboolean(
'comicvine', 'remove_html_tables')
+
+ if self.config.has_option('comicvine', 'sort_series_by_year'):
+ self.sort_series_by_year = self.config.getboolean(
+ 'comicvine', 'sort_series_by_year')
+ if self.config.has_option('comicvine', 'exact_series_matches_first'):
+ self.exact_series_matches_first = self.config.getboolean(
+ 'comicvine', 'exact_series_matches_first')
+ if self.config.has_option('comicvine', 'always_use_publisher_blacklist'):
+ self.always_use_publisher_blacklist = self.config.getboolean(
+ 'comicvine', 'always_use_publisher_blacklist')
+
if self.config.has_option('comicvine', 'cv_api_key'):
self.cv_api_key = self.config.get('comicvine', 'cv_api_key')
@@ -408,6 +423,14 @@ class ComicTaggerSettings:
self.clear_form_before_populating_from_cv)
self.config.set(
'comicvine', 'remove_html_tables', self.remove_html_tables)
+
+ self.config.set(
+ 'comicvine', 'sort_series_by_year', self.sort_series_by_year)
+ self.config.set(
+ 'comicvine', 'exact_series_matches_first', self.exact_series_matches_first)
+ self.config.set(
+ 'comicvine', 'always_use_publisher_blacklist', self.always_use_publisher_blacklist)
+
self.config.set('comicvine', 'cv_api_key', self.cv_api_key)
if not self.config.has_section('cbl_transform'):
diff --git a/comictaggerlib/settingswindow.py b/comictaggerlib/settingswindow.py
index 0149a12..f738d9c 100644
--- a/comictaggerlib/settingswindow.py
+++ b/comictaggerlib/settingswindow.py
@@ -135,6 +135,14 @@ class SettingsWindow(QtWidgets.QDialog):
self.cbxClearFormBeforePopulating.setCheckState(QtCore.Qt.Checked)
if self.settings.remove_html_tables:
self.cbxRemoveHtmlTables.setCheckState(QtCore.Qt.Checked)
+
+ if self.settings.always_use_publisher_blacklist:
+ self.cbxUseBlackFilter.setCheckState(QtCore.Qt.Checked)
+ if self.settings.sort_series_by_year:
+ self.cbxSortByYear.setCheckState(QtCore.Qt.Checked)
+ if self.settings.exact_series_matches_first:
+ self.cbxExactMatches.setCheckState(QtCore.Qt.Checked)
+
self.leKey.setText(str(self.settings.cv_api_key))
if self.settings.assume_lone_credit_is_primary:
@@ -193,6 +201,11 @@ class SettingsWindow(QtWidgets.QDialog):
self.settings.use_series_start_as_volume = self.cbxUseSeriesStartAsVolume.isChecked()
self.settings.clear_form_before_populating_from_cv = self.cbxClearFormBeforePopulating.isChecked()
self.settings.remove_html_tables = self.cbxRemoveHtmlTables.isChecked()
+
+ self.settings.always_use_publisher_blacklist = self.cbxUseBlackFilter.isChecked()
+ self.settings.sort_series_by_year = self.cbxSortByYear.isChecked()
+ self.settings.exact_series_matches_first = self.cbxExactMatches.isChecked()
+
self.settings.cv_api_key = str(self.leKey.text())
ComicVineTalker.api_key = self.settings.cv_api_key.strip()
self.settings.assume_lone_credit_is_primary = self.cbxAssumeLoneCreditIsPrimary.isChecked()
diff --git a/comictaggerlib/ui/settingswindow.ui b/comictaggerlib/ui/settingswindow.ui
index c64f5f5..5912185 100644
--- a/comictaggerlib/ui/settingswindow.ui
+++ b/comictaggerlib/ui/settingswindow.ui
@@ -263,6 +263,40 @@
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Always use Publisher Blacklist on 'manual' searches
+
+
+
+ -
+
+
+ Initally sort Series search results by Starting Year instead of No. Issues
+
+
+
+ -
+
+
+ Initally show Series Name exact matches first
+
+
+
diff --git a/comictaggerlib/ui/volumeselectionwindow.ui b/comictaggerlib/ui/volumeselectionwindow.ui
index bf0daee..ff86c6d 100644
--- a/comictaggerlib/ui/volumeselectionwindow.ui
+++ b/comictaggerlib/ui/volumeselectionwindow.ui
@@ -148,6 +148,16 @@
+ -
+
+
+ Filter Publishers
+
+
+ Filter the publishers based on the publisher blacklist.
+
+
+
-
diff --git a/comictaggerlib/volumeselectionwindow.py b/comictaggerlib/volumeselectionwindow.py
index d28e0a2..020afda 100644
--- a/comictaggerlib/volumeselectionwindow.py
+++ b/comictaggerlib/volumeselectionwindow.py
@@ -32,9 +32,11 @@ from .settings import ComicTaggerSettings
from .matchselectionwindow import MatchSelectionWindow
from .coverimagewidget import CoverImageWidget
from comictaggerlib.ui.qtutils import reduceWidgetFontSize, centerWindowOnParent
-#from imagefetcher import ImageFetcher
-#import utils
+from comictaggerlib import settings
+#from imagefetcher import ImageFetcher
+
+from . import utils
class SearchThread(QtCore.QThread):
@@ -124,6 +126,8 @@ class VolumeSelectionWindow(QtWidgets.QDialog):
self.cover_index_list = cover_index_list
self.cv_search_results = None
+ self.use_blackList = self.settings.always_use_publisher_blacklist
+
self.twList.resizeColumnsToContents()
self.twList.currentItemChanged.connect(self.currentItemChanged)
self.twList.cellDoubleClicked.connect(self.cellDoubleClicked)
@@ -131,6 +135,9 @@ class VolumeSelectionWindow(QtWidgets.QDialog):
self.btnIssues.clicked.connect(self.showIssues)
self.btnAutoSelect.clicked.connect(self.autoSelect)
+ self.cbxFilter.setChecked(self.use_blackList)
+ self.cbxFilter.toggled.connect(self.filterToggled)
+
self.updateButtons()
self.performQuery()
self.twList.selectRow(0)
@@ -150,6 +157,10 @@ class VolumeSelectionWindow(QtWidgets.QDialog):
def requery(self,):
self.performQuery(refresh=True)
self.twList.selectRow(0)
+
+ def filterToggled(self):
+ self.use_blackList = not self.use_blackList
+ self.performQuery(refresh=False)
def autoSelect(self):
@@ -334,6 +345,40 @@ class VolumeSelectionWindow(QtWidgets.QDialog):
return
self.cv_search_results = self.search_thread.cv_search_results
+ # filter the blacklisted publishers if setting set
+ if self.use_blackList:
+ try:
+ publisher_blacklist = {s.strip().lower() for s in self.settings.id_publisher_blacklist.split(',')}
+ # use '' as publisher name if None
+ self.cv_search_results = list(filter(lambda d: ('' if d['publisher'] is None else str(d['publisher']['name']).lower()) not in publisher_blacklist, self.cv_search_results))
+ except:
+ print('bad data error filtering blacklist publishers')
+
+ # pre sort the data - so that we can put exact matches first afterwards
+ # compare as str incase extra chars ie. '1976?'
+ # - missing (none) values being converted to 'None' - consistant with prior behaviour in v1.2.3
+ # sort by start_year if set
+ if self.settings.sort_series_by_year:
+ try:
+ self.cv_search_results = sorted(self.cv_search_results, key = lambda i: (str(i['start_year']), str(i['count_of_issues'])), reverse=True)
+ except:
+ print('bad data error sorting results by start_year,count_of_issues')
+ else:
+ try:
+ self.cv_search_results = sorted(self.cv_search_results, key = lambda i: str(i['count_of_issues']), reverse=True)
+ except:
+ print('bad data error sorting results by count_of_issues')
+
+ # move sanitized matches to the front
+ if self.settings.exact_series_matches_first:
+ try:
+ sanitized = utils.sanitize_title(self.series_name)
+ exactMatches = list(filter(lambda d: utils.sanitize_title(str(d['name'])) in sanitized, self.cv_search_results))
+ nonMatches = list(filter(lambda d: utils.sanitize_title(str(d['name'])) not in sanitized, self.cv_search_results))
+ self.cv_search_results = exactMatches + nonMatches
+ except:
+ print('bad data error filtering exact/near matches')
+
self.updateButtons()
self.twList.setSortingEnabled(False)
@@ -375,9 +420,7 @@ class VolumeSelectionWindow(QtWidgets.QDialog):
row += 1
- self.twList.resizeColumnsToContents()
self.twList.setSortingEnabled(True)
- self.twList.sortItems(2, QtCore.Qt.DescendingOrder)
self.twList.selectRow(0)
self.twList.resizeColumnsToContents()