|
|
@@ -60,14 +60,7 @@ class ReadingStatsService:
|
|
|
# Calculate finished books
|
|
|
finished_sessions = [s for s in sessions if s.is_finished and s.finished_at]
|
|
|
|
|
|
- # Calculate total listening time
|
|
|
- total_hours = 0.0
|
|
|
- for session in finished_sessions:
|
|
|
- if session.started_at and session.finished_at:
|
|
|
- duration = (session.finished_at - session.started_at).total_seconds() / 3600
|
|
|
- total_hours += duration
|
|
|
-
|
|
|
- # Get book details for finished books
|
|
|
+ # Get book details for finished books first (needed for calculations)
|
|
|
finished_book_ids = [s.book_id for s in finished_sessions]
|
|
|
books_dict = {}
|
|
|
if finished_book_ids:
|
|
|
@@ -76,6 +69,14 @@ class ReadingStatsService:
|
|
|
)
|
|
|
books_dict = {book.id: book for book in books_result.scalars().all()}
|
|
|
|
|
|
+ # Calculate total listening time using actual book durations
|
|
|
+ total_hours = 0.0
|
|
|
+ for session in finished_sessions:
|
|
|
+ book = books_dict.get(session.book_id)
|
|
|
+ if book and book.duration:
|
|
|
+ # duration is in seconds, convert to hours
|
|
|
+ total_hours += book.duration / 3600
|
|
|
+
|
|
|
# Calculate average rating
|
|
|
rated_sessions = [s for s in finished_sessions if s.rating]
|
|
|
avg_rating = (
|
|
|
@@ -243,9 +244,9 @@ class ReadingStatsService:
|
|
|
continue
|
|
|
|
|
|
listening_duration = None
|
|
|
- if session.started_at and session.finished_at:
|
|
|
- duration_hours = (session.finished_at - session.started_at).total_seconds() / 3600
|
|
|
- listening_duration = round(duration_hours, 1)
|
|
|
+ if book.duration:
|
|
|
+ # Use actual book duration instead of wall-clock time
|
|
|
+ listening_duration = round(book.duration / 3600, 1)
|
|
|
|
|
|
recent.append({
|
|
|
"book_id": book.id,
|