From 0a6774c28494cc749c462716b7a5ebfcab4d3d5a Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Sun, 5 Mar 2023 02:30:01 -0500 Subject: [PATCH] Reorganize books --- vrobbler/apps/books/admin.py | 7 +++-- vrobbler/apps/books/koreader.py | 2 ++ vrobbler/apps/books/models.py | 8 +++--- vrobbler/apps/books/utils.py | 47 --------------------------------- 4 files changed, 11 insertions(+), 53 deletions(-) diff --git a/vrobbler/apps/books/admin.py b/vrobbler/apps/books/admin.py index fc7a6bf..a9b80de 100644 --- a/vrobbler/apps/books/admin.py +++ b/vrobbler/apps/books/admin.py @@ -6,14 +6,14 @@ from scrobbles.admin import ScrobbleInline @admin.register(Author) -class AlbumAdmin(admin.ModelAdmin): +class AuthorAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ("name", "openlibrary_id") ordering = ("name",) @admin.register(Book) -class ArtistAdmin(admin.ModelAdmin): +class BookAdmin(admin.ModelAdmin): date_hierarchy = "created" list_display = ( "title", @@ -23,3 +23,6 @@ class ArtistAdmin(admin.ModelAdmin): "openlibrary_id", ) ordering = ("title",) + inlines = [ + ScrobbleInline, + ] diff --git a/vrobbler/apps/books/koreader.py b/vrobbler/apps/books/koreader.py index 6b0948e..6501f45 100644 --- a/vrobbler/apps/books/koreader.py +++ b/vrobbler/apps/books/koreader.py @@ -109,6 +109,8 @@ def process_koreader_sqlite_file(sqlite_file_path, user_id): if existing: logger.debug(f"Skipping existing scrobble {new_scrobble}") continue + if book.progress_for_user(user_id) >= Book.COMPLETION_PERCENT: + new_scrobble.long_play_complete = True logger.debug(f"Queued scrobble {new_scrobble} for creation") new_scrobbles.append(new_scrobble) diff --git a/vrobbler/apps/books/models.py b/vrobbler/apps/books/models.py index 2e3b7f1..21ac4b3 100644 --- a/vrobbler/apps/books/models.py +++ b/vrobbler/apps/books/models.py @@ -1,14 +1,12 @@ import logging -from typing import Dict +from books.openlibrary import lookup_book_from_openlibrary from django.conf import settings from django.contrib.auth import get_user_model from django.db import models from django.urls import reverse from django_extensions.db.models import TimeStampedModel from scrobbles.mixins import ScrobblableMixin - -from books.utils import lookup_book_from_openlibrary from scrobbles.utils import get_scrobbles_for_media logger = logging.getLogger(__name__) @@ -68,6 +66,8 @@ class Book(ScrobblableMixin): return 0 return int(self.pages * (self.COMPLETION_PERCENT / 100)) - def progress_for_user(self, user: User) -> int: + def progress_for_user(self, user_id: int) -> int: + """Used to keep track of whether the book is complete or not""" + user = User.objects.get(id=user_id) last_scrobble = get_scrobbles_for_media(self, user).last() return int((last_scrobble.book_pages_read / self.pages) * 100) diff --git a/vrobbler/apps/books/utils.py b/vrobbler/apps/books/utils.py index d15c88d..e69de29 100644 --- a/vrobbler/apps/books/utils.py +++ b/vrobbler/apps/books/utils.py @@ -1,47 +0,0 @@ -import json -from typing import Optional -import requests -import logging - -logger = logging.getLogger(__name__) - -SEARCH_URL = "https://openlibrary.org/search.json?title={title}" -ISBN_URL = "https://openlibrary.org/isbn/{isbn}.json" - - -def get_first(key: str, result: dict) -> str: - obj = "" - if obj_list := result.get(key): - obj = obj_list[0] - return obj - - -def lookup_book_from_openlibrary(title: str, author: str = None) -> dict: - search_url = SEARCH_URL.format(title=title) - response = requests.get(search_url) - - if response.status_code != 200: - logger.warn(f"Bad response from OL: {response.status_code}") - return {} - - results = json.loads(response.content) - - if len(results.get("docs")) == 0: - logger.warn(f"No results found from OL for {title}") - return {} - - top = results.get("docs")[0] - if author and author not in top["author_name"]: - logger.warn( - f"Lookup for {title} found top result with mismatched author" - ) - - return { - "title": top.get("title"), - "isbn": top.get("isbn")[0], - "openlibrary_id": top.get("cover_edition_key"), - "author_name": get_first("author_name", top), - "author_openlibrary_id": get_first("author_key", top), - "goodreads_id": get_first("id_goodreads", top), - "first_publish_year": top.get("first_publish_year"), - }