diff --git a/vrobbler/apps/books/models.py b/vrobbler/apps/books/models.py index ed424de..1330df4 100644 --- a/vrobbler/apps/books/models.py +++ b/vrobbler/apps/books/models.py @@ -108,11 +108,9 @@ class Author(TimeStampedModel): def __str__(self): return f"{self.name}" - def enrich_from_semantic(self, overwrite=False): - ... + def enrich_from_semantic(self, overwrite=False): ... - def enrich_from_google_books(self, overwrite=False): - ... + def enrich_from_google_books(self, overwrite=False): ... def enrich_from_openlibrary(self, overwrite=False): data_dict = lookup_author_from_openlibrary(self.openlibrary_id) @@ -311,7 +309,8 @@ class Book(LongPlayScrobblableMixin): book.save() book.save_image_from_url(cover_url) - book.genre.add(*genres) + if genres: + book.genre.add(*genres) book.authors.add(*author_list) return book @@ -390,7 +389,7 @@ class Book(LongPlayScrobblableMixin): # Pop this, so we can look it up later cover_url = data.pop("cover_url", "") - subject_key_list = data.pop("subject_key_list", "") + subject_key_list = data.pop("subject_key_list", []) # Fun trick for updating all fields at once Book.objects.filter(pk=self.id).update(**data) diff --git a/vrobbler/apps/books/sources/openlibrary.py b/vrobbler/apps/books/sources/openlibrary.py index 61c9a07..bb7afff 100644 --- a/vrobbler/apps/books/sources/openlibrary.py +++ b/vrobbler/apps/books/sources/openlibrary.py @@ -11,7 +11,7 @@ def lookup_book_from_openlibrary(title: str, author: str | None = None) -> dict: try: response = requests.get( f"{OPENLIBRARY_BASE_URL}/search.json", - params={"title": title, "limit": 1}, + params={"title": title, "limit": 5}, timeout=10, ) response.raise_for_status() @@ -21,12 +21,17 @@ def lookup_book_from_openlibrary(title: str, author: str | None = None) -> dict: return {} docs = search_results.get("docs", []) - if not docs: - return {} - work_doc = docs[0] - olid = work_doc.get("key", "").replace("/works/", "") - if not olid: + title_lower = title.lower() + for work_doc in docs: + found_title = work_doc.get("title", "") + if found_title.lower() == title_lower: + olid = work_doc.get("key", "").replace("/works/", "") + if not olid: + continue + break + else: + logger.info(f"OpenLibrary: no close match for '{title}', skipping") return {} try: