From 687b340b1c7a0e9ccfc7c30b116ee09a52c00bb0 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Mon, 23 Jan 2023 19:22:59 +0000 Subject: [PATCH 1/2] Enhancement #2003712: URL scheme: 'virtual_library' for show-book. I will update the documentation in a later commit. --- src/calibre/gui2/ui.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index c545397146..ec6975259b 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -675,6 +675,16 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ return bytes.fromhex(x[6:]).decode('utf-8') return x + def get_virtual_library(query): + vl = None + if query.get('encoded_virtual_library'): + vl = bytes.fromhex(query.get('encoded_virtual_library')[0]).decode('utf-8') + elif query.get('virtual_library'): + vl = query.get('virtual_library')[0] + if vl == '-': + vl = None + return vl + if action == 'switch-library': library_id = decode_library_id(posixpath.basename(path)) library_path = self.library_broker.path_for_library_id(library_id) @@ -694,8 +704,11 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ library_path = self.library_broker.path_for_library_id(library_id) if library_path is None: return + vl = get_virtual_library(query) def doit(): + if vl != '_': + self.apply_virtual_library(vl) rows = self.library_view.select_rows((book_id,)) db = self.current_db if not rows and (db.data.get_base_restriction_name() or db.data.get_search_restriction_name()): @@ -743,13 +756,7 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ if sq: sq = sq[0] sq = sq or '' - vl = None - if query.get('encoded_virtual_library'): - vl = bytes.fromhex(query.get('encoded_virtual_library')[0]).decode('utf-8') - elif query.get('virtual_library'): - vl = query.get('virtual_library')[0] - if vl == '-': - vl = None + vl = get_virtual_library(query) def doit(): if vl != '_': From ba79438b31c2ce2cdc6194bd8cf313fc492947cf Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Mon, 23 Jan 2023 20:24:26 +0000 Subject: [PATCH 2/2] 1) Maintain compatibility with URLS that don't specify a virtual library. 2) Documentation. --- manual/url_scheme.rst | 12 ++++++++++++ src/calibre/gui2/ui.py | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/manual/url_scheme.rst b/manual/url_scheme.rst index 7ec7bae5cb..108e6d773b 100644 --- a/manual/url_scheme.rst +++ b/manual/url_scheme.rst @@ -56,6 +56,18 @@ brackets at the end of the path to the book folder. You can copy a link to the current book displayed in calibre by right clicking the :guilabel:`Book details` panel and choosing :guilabel:`Copy link to book`. +If a Virtual library is selected, calibre will use it when showing the book. If +the book isn't found in that virtual library then the virtual library is cleared. + +If you want to switch to a particular Virtual library when showing the book, use:: + + calibre://show-book/Library_Name/book_id?virtual_library=Library%20Name + or + calibre://show-book/Library_Name/book_id?encoded_virtual_library=hex_encoded_virtual_library_name + +replacing spaces in the Virtual library name by ``%20``. If the book isn't in that +virtual library then it is ignored. + Open a specific book in the E-book viewer at a specific position ------------------------------------------------------------------- diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index ec6975259b..ef19689963 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -707,7 +707,8 @@ class Main(MainWindow, MainWindowMixin, DeviceMixin, EmailMixin, # {{{ vl = get_virtual_library(query) def doit(): - if vl != '_': + # To maintain compatibility, don't change the VL if it isn't specified. + if vl is not None and vl != '_': self.apply_virtual_library(vl) rows = self.library_view.select_rows((book_id,)) db = self.current_db