Fixes #2003712 [Enhancement Request: URL scheme: 'virtual_library' for show-book](https://bugs.launchpad.net/calibre/+bug/2003712)
This commit is contained in:
Kovid Goyal 2023-01-24 07:18:55 +05:30
commit ea64f851ef
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 27 additions and 7 deletions

View File

@ -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
-------------------------------------------------------------------

View File

@ -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,12 @@ 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():
# 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
if not rows and (db.data.get_base_restriction_name() or db.data.get_search_restriction_name()):
@ -743,13 +757,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 != '_':