Skip to content

Commit 2c5b056

Browse files
committed
Add ebook_provider field to solr
1 parent a267d95 commit 2c5b056

File tree

6 files changed

+38
-7
lines changed

6 files changed

+38
-7
lines changed

conf/solr/conf/managed-schema.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@
160160
<field name="oclc" type="text_en_splitting" multiValued="true"/>
161161
<field name="isbn" type="string" multiValued="true"/>
162162
<field name="ebook_access" type="ebookAccessLevel" multiValued="false"/>
163+
<field name="ebook_provider" type="string" multiValued="true"/>
163164

164165
<!-- Reading Levels -->
165166
<field name="lexile" type="pint" multiValued="true"/>

openlibrary/book_providers.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import typing
23
from collections.abc import Callable, Iterator
34
from dataclasses import dataclass
45
from typing import Literal, TypedDict, TypeVar, cast, override
@@ -157,6 +158,10 @@ class AbstractBookProvider[TProviderMetadata]:
157158
"""
158159
identifier_key: str | None
159160

161+
@property
162+
def provider_name(self) -> str:
163+
return self.identifier_key or self.short_name
164+
160165
def get_olids(self, identifier: str) -> list[str]:
161166
return web.ctx.site.things(
162167
{"type": "/type/edition", self.db_selector: identifier}
@@ -272,6 +277,11 @@ class InternetArchiveProvider(AbstractBookProvider[IALiteMetadata]):
272277
long_name = 'Internet Archive'
273278
identifier_key = 'ocaid'
274279

280+
@property
281+
@typing.override
282+
def provider_name(self) -> str:
283+
return 'ia'
284+
275285
@property
276286
def db_selector(self) -> str:
277287
return self.identifier_key
@@ -648,8 +658,14 @@ def is_non_ia_ocaid(ocaid: str) -> bool:
648658
return any(provider.is_own_ocaid(ocaid) for provider in providers)
649659

650660

651-
def get_book_provider_by_name(short_name: str) -> AbstractBookProvider | None:
652-
return next((p for p in PROVIDER_ORDER if p.short_name == short_name), None)
661+
def get_book_provider_by_name(name: str) -> AbstractBookProvider | None:
662+
"""
663+
:param name: Either the provider's short_name (legacy) or its provider_name
664+
"""
665+
return next(
666+
(p for p in PROVIDER_ORDER if name in (p.provider_name, p.short_name)),
667+
None,
668+
)
653669

654670

655671
ia_provider = cast(InternetArchiveProvider, get_book_provider_by_name('ia'))

openlibrary/plugins/worksearch/schemes/works.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class WorkSearchScheme(SearchScheme):
5151
"alternative_subtitle",
5252
"cover_i",
5353
"ebook_access",
54+
"ebook_provider",
5455
"edition_count",
5556
"edition_key",
5657
"format",

openlibrary/solr/solr_types.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class SolrDocument(TypedDict):
3535
oclc: Optional[list[str]]
3636
isbn: Optional[list[str]]
3737
ebook_access: Optional[Literal['no_ebook', 'unclassified', 'printdisabled', 'borrowable', 'public']]
38+
ebook_provider: Optional[list[str]]
3839
lexile: Optional[list[int]]
3940
lcc: Optional[list[str]]
4041
lcc_sort: Optional[str]

openlibrary/solr/updater/edition.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ def __init__(
104104
self._edition = edition
105105
self._solr_work = solr_work
106106
self._ia_metadata = ia_metadata
107-
self._provider = bp.get_book_provider(edition)
107+
self._providers = list(bp.get_book_providers(edition))
108+
self._best_provider = self._providers[0] if self._providers else None
108109

109110
@property
110111
def key(self):
@@ -273,12 +274,16 @@ def identifiers(self) -> dict:
273274

274275
@cached_property
275276
def ebook_access(self) -> bp.EbookAccess:
276-
if not self._provider:
277+
if not self._best_provider:
277278
return bp.EbookAccess.NO_EBOOK
278-
elif isinstance(self._provider, bp.InternetArchiveProvider):
279-
return self._provider.get_access(self._edition, self._ia_metadata)
279+
elif isinstance(self._best_provider, bp.InternetArchiveProvider):
280+
return self._best_provider.get_access(self._edition, self._ia_metadata)
280281
else:
281-
return self._provider.get_access(self._edition)
282+
return self._best_provider.get_access(self._edition)
283+
284+
@property
285+
def ebook_provider(self) -> list[str]:
286+
return [provider.provider_name for provider in (self._providers or [])]
282287

283288
@property
284289
def has_fulltext(self) -> bool:
@@ -335,6 +340,7 @@ def build(self) -> SolrDocument:
335340
'ia_box_id': self.ia_box_id,
336341
# Ebook access
337342
'ebook_access': self.ebook_access.to_solr_str(),
343+
'ebook_provider': self.ebook_provider,
338344
'has_fulltext': self.has_fulltext,
339345
'public_scan_b': self.public_scan_b,
340346
},

openlibrary/solr/updater/work.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,12 @@ def ebook_access(self) -> bp.EbookAccess:
474474
default=bp.EbookAccess.NO_EBOOK,
475475
)
476476

477+
@property
478+
def ebook_provider(self) -> list[str]:
479+
return uniq(
480+
provider for e in self._solr_editions for provider in e.ebook_provider
481+
)
482+
477483
@property
478484
def has_fulltext(self) -> bool:
479485
return any(e.has_fulltext for e in self._solr_editions)

0 commit comments

Comments
 (0)