Jelajahi Sumber

Fix koreader importing

Colin Powell 1 tahun lalu
induk
melakukan
dfc1365fa3

+ 17 - 8
vrobbler/apps/books/koreader.py

@@ -232,16 +232,24 @@ def build_scrobbles_from_book_map(
                 f"Book {koreader_book_id} - {page_number} {seconds_from_last_page} read seconds"
             )
             if should_create_scrobble:
-                first_page_in_scrobble = list(scrobble_page_data.keys())[0]
-                start_ts = int(
-                    scrobble_page_data.get(first_page_in_scrobble).get(
-                        "start_ts"
-                    )
+                first_page = scrobble_page_data.get(
+                    list(scrobble_page_data.keys())[0]
+                )
+                last_page = scrobble_page_data.get(
+                    list(scrobble_page_data.keys())[-1]
+                )
+                start_ts = int(first_page.get("start_ts"))
+                end_ts = int(last_page.get("start_ts")) + int(
+                    last_page.get("duration")
                 )
+
                 timestamp = datetime.fromtimestamp(start_ts).replace(
                     tzinfo=user.profile.tzinfo
                 )
-                # TODO Add a shim here temporarily to fix imports while we were in France
+                stop_timestamp = datetime.fromtimestamp(end_ts).replace(
+                    tzinfo=user.profile.tzinfo
+                )
+                # Add a shim here temporarily to fix imports while we were in France
                 # if date is between 10/15 and 12/15, cast it to Europe/Central
                 if (
                     datetime(2023, 10, 15).replace(
@@ -284,11 +292,12 @@ def build_scrobbles_from_book_map(
                             source="KOReader",
                             media_type=Scrobble.MediaType.BOOK,
                             timestamp=timestamp,
-                            played_to_completion=True,
+                            stop_timestamp=stop_timestamp,
                             playback_position_seconds=playback_position_seconds,
-                            in_progress=False,
                             book_page_data=scrobble_page_data,
                             book_pages_read=page_number,
+                            in_progress=False,
+                            played_to_completion=True,
                             long_play_complete=False,
                         )
                     )

+ 10 - 1
vrobbler/apps/books/tests/conftest.py

@@ -1,9 +1,13 @@
 import hashlib
-import pytest
 import random
 
+import pytest
+from django.contrib.auth import get_user_model
+
 from vrobbler.apps.books.koreader import KoReaderBookColumn
 
+User = get_user_model()
+
 ordinal = lambda n: "%d%s" % (
     n,
     "tsnrhtdd"[(n // 10 % 10 != 1) * (n % 10 < 4) * n % 10 :: 4],
@@ -112,3 +116,8 @@ class KoReaderBookRows:
 @pytest.fixture
 def koreader_rows():
     return KoReaderBookRows(book_count=1)
+
+
+@pytest.fixture
+def demo_user():
+    return User.objects.create(email="demo@example.com")

+ 8 - 3
vrobbler/apps/books/tests/test_koreader.py

@@ -1,7 +1,12 @@
 import pytest
 from unittest import mock
 
-from books.koreader import KoReaderBookColumn, build_book_map, build_page_data, build_scrobbles_from_book_map
+from books.koreader import (
+    KoReaderBookColumn,
+    build_book_map,
+    build_page_data,
+    build_scrobbles_from_book_map,
+)
 
 
 @pytest.mark.django_db
@@ -30,13 +35,13 @@ def test_load_page_data_to_map(get_mock, koreader_rows, valid_response):
 @pytest.mark.django_db
 @mock.patch("requests.get")
 def test_build_scrobbles_from_pages(
-    get_mock, koreader_rows, valid_response
+    get_mock, koreader_rows, demo_user, valid_response
 ):
     get_mock.return_value = valid_response
     book_map = build_book_map(koreader_rows.BOOK_ROWS)
     book_map = build_page_data(koreader_rows.PAGE_STATS_ROWS, book_map)
 
-    scrobbles = build_scrobbles_from_book_map(book_map)
+    scrobbles = build_scrobbles_from_book_map(book_map, demo_user)
     # Corresponds to number of sessions per book ( 20 pages per session, 120 +/- 15 pages read )
     expected_scrobbles = 6 * len(book_map.keys())
     assert len(scrobbles) == expected_scrobbles