diff --git a/src/calibre/gui2/store/search/models.py b/src/calibre/gui2/store/search/models.py index 9112f40e8c82..7af51084de11 100644 --- a/src/calibre/gui2/store/search/models.py +++ b/src/calibre/gui2/store/search/models.py @@ -18,6 +18,7 @@ from calibre.gui2.store.search.download_thread import DetailsThreadPool, \ CoverThreadPool from calibre.utils.icu import sort_key +from calibre.utils.localization import get_language from calibre.utils.search_query_parser import SearchQueryParser @@ -38,7 +39,7 @@ class Matches(QAbstractItemModel): total_changed = pyqtSignal(int) - HEADERS = [_('Cover'), _('Title'), _('Price'), _('DRM'), _('Store'), _('Download'), _('Affiliate')] + HEADERS = [_('Cover'), _('Title'), _('Price'), _('DRM'), _('Store'), _('Download'), _('Affiliate'), _('Language')] HTML_COLS = (1, 4) IMG_COLS = (0, 3, 5, 6) @@ -207,6 +208,8 @@ def data(self, index, role): return (result.price) elif col == 4: return ('%s
%s
' % (result.store_name, result.formats)) + elif col == 7: + return get_language(result.language) return None elif role == Qt.DecorationRole: if col == 0 and result.cover_data: diff --git a/src/calibre/gui2/store/search/search.py b/src/calibre/gui2/store/search/search.py index e7d9698a5438..a4205aa48bad 100644 --- a/src/calibre/gui2/store/search/search.py +++ b/src/calibre/gui2/store/search/search.py @@ -157,6 +157,8 @@ def resize_columns(self): self.results_view.setColumnWidth(5, 20) # Affiliate self.results_view.setColumnWidth(6, 20) + # Language + self.results_view.setColumnWidth(7, 10) def toggle_search(self): if self.searching: diff --git a/src/calibre/gui2/store/search_result.py b/src/calibre/gui2/store/search_result.py index 0f870ee77010..cebfa50639cc 100644 --- a/src/calibre/gui2/store/search_result.py +++ b/src/calibre/gui2/store/search_result.py @@ -27,6 +27,7 @@ def __init__(self): # value = url to download the file. self.downloads = {} self.affiliate = False + self.language = '' self.plugin_author = '' self.create_browser = None diff --git a/src/calibre/gui2/store/stores/amazon_au_plugin.py b/src/calibre/gui2/store/stores/amazon_au_plugin.py index ed925783d6a6..61e7b5fa4958 100644 --- a/src/calibre/gui2/store/stores/amazon_au_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_au_plugin.py @@ -124,6 +124,20 @@ def search(self, query, max_results=10, timeout=60): for result in search_amazon(query, max_results=max_results, timeout=timeout): yield result + def get_language(self, idata): + self.language_xpath = ''' + descendant::*[ + starts-with(text(), "Language:") \ + or text() = "Language" \ + ] + ''' + for x in reversed(idata.xpath(self.language_xpath)): + if x.tail: + raw = x.tail.strip().partition(',')[0].strip() + ans = canonicalize_lang(raw) + if ans: + return ans + def get_details(self, search_result, timeout): url = DETAILS_URL @@ -140,6 +154,7 @@ def get_details(self, search_result, timeout): search_result.drm = SearchResult.DRM_UNKNOWN else: search_result.drm = SearchResult.DRM_LOCKED + search_result.language = self.get_language(idata) or '' return True diff --git a/src/calibre/gui2/store/stores/amazon_ca_plugin.py b/src/calibre/gui2/store/stores/amazon_ca_plugin.py index 88c0957a750c..66a3a9d95538 100644 --- a/src/calibre/gui2/store/stores/amazon_ca_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_ca_plugin.py @@ -124,6 +124,20 @@ def search(self, query, max_results=10, timeout=60): for result in search_amazon(query, max_results=max_results, timeout=timeout): yield result + def get_language(self, idata): + self.language_xpath = ''' + descendant::*[ + starts-with(text(), "Language:") \ + or text() = "Language" \ + ] + ''' + for x in reversed(idata.xpath(self.language_xpath)): + if x.tail: + raw = x.tail.strip().partition(',')[0].strip() + ans = canonicalize_lang(raw) + if ans: + return ans + def get_details(self, search_result, timeout): url = DETAILS_URL @@ -140,6 +154,7 @@ def get_details(self, search_result, timeout): search_result.drm = SearchResult.DRM_UNKNOWN else: search_result.drm = SearchResult.DRM_LOCKED + search_result.language = self.get_language(idata) or '' return True diff --git a/src/calibre/gui2/store/stores/amazon_plugin.py b/src/calibre/gui2/store/stores/amazon_plugin.py index b7ce325df4b4..00fdd3fc0fcb 100644 --- a/src/calibre/gui2/store/stores/amazon_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_plugin.py @@ -161,6 +161,20 @@ def search(self, query, max_results=10, timeout=60): for result in search_amazon(query, max_results=max_results, timeout=timeout): yield result + def get_language(self, idata): + self.language_xpath = ''' + descendant::*[ + starts-with(text(), "Language:") \ + or text() = "Language" \ + ] + ''' + for x in reversed(idata.xpath(self.language_xpath)): + if x.tail: + raw = x.tail.strip().partition(',')[0].strip() + ans = canonicalize_lang(raw) + if ans: + return ans + def get_details(self, search_result, timeout): url = DETAILS_URL @@ -177,6 +191,7 @@ def get_details(self, search_result, timeout): search_result.drm = SearchResult.DRM_UNKNOWN else: search_result.drm = SearchResult.DRM_LOCKED + search_result.language = self.get_language(idata) or '' return True diff --git a/src/calibre/gui2/store/stores/amazon_uk_plugin.py b/src/calibre/gui2/store/stores/amazon_uk_plugin.py index e1390d8692c6..8a3089f90eb7 100644 --- a/src/calibre/gui2/store/stores/amazon_uk_plugin.py +++ b/src/calibre/gui2/store/stores/amazon_uk_plugin.py @@ -124,6 +124,20 @@ def search(self, query, max_results=10, timeout=60): for result in search_amazon(query, max_results=max_results, timeout=timeout): yield result + def get_language(self, idata): + self.language_xpath = ''' + descendant::*[ + starts-with(text(), "Language:") \ + or text() = "Language" \ + ] + ''' + for x in reversed(idata.xpath(self.language_xpath)): + if x.tail: + raw = x.tail.strip().partition(',')[0].strip() + ans = canonicalize_lang(raw) + if ans: + return ans + def get_details(self, search_result, timeout): url = DETAILS_URL @@ -140,6 +154,7 @@ def get_details(self, search_result, timeout): search_result.drm = SearchResult.DRM_UNKNOWN else: search_result.drm = SearchResult.DRM_LOCKED + search_result.language = self.get_language(idata) or '' return True