mirror of
https://github.com/wizarrrr/wizarr.git
synced 2026-07-31 07:17:10 -04:00
- Added `identity_resolution.py` for resolving Wizarr users and identities. - Created `ingestion.py` to handle recording and updating activity events. - Introduced `maintenance.py` for cleanup and session management tasks. - Developed `queries.py` for read-oriented operations on activity sessions. - Implemented background tasks in `activity.py` for scheduled maintenance. - Added tests for activity services and blueprint to ensure functionality.
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
"""
|
|
Activity monitoring models for Wizarr.
|
|
|
|
Tracks media playback sessions and real-time snapshots for comprehensive
|
|
activity monitoring and historical analysis.
|
|
"""
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import UTC, datetime
|
|
from typing import Any
|
|
|
|
|
|
@dataclass
|
|
class ActivityEvent:
|
|
"""Data transfer object for activity events before persistence."""
|
|
|
|
event_type: str # session_start, session_end, session_progress, session_pause, session_resume
|
|
server_id: int
|
|
session_id: str
|
|
user_name: str
|
|
media_title: str
|
|
timestamp: datetime | None = None
|
|
user_id: str | None = None
|
|
media_type: str | None = None
|
|
media_id: str | None = None
|
|
series_name: str | None = None
|
|
season_number: int | None = None
|
|
episode_number: int | None = None
|
|
duration_ms: int | None = None
|
|
position_ms: int | None = None
|
|
device_name: str | None = None
|
|
client_name: str | None = None
|
|
ip_address: str | None = None
|
|
platform: str | None = None
|
|
player_version: str | None = None
|
|
state: str | None = None # playing, paused, stopped
|
|
transcoding_info: dict[str, Any] | None = None
|
|
metadata: dict[str, Any] | None = None
|
|
artwork_url: str | None = None
|
|
thumbnail_url: str | None = None
|
|
bandwidth_kbps: int | None = None
|
|
quality: str | None = None
|
|
subtitle_stream: str | None = None
|
|
audio_stream: str | None = None
|
|
|
|
def __post_init__(self):
|
|
if self.timestamp is None:
|
|
self.timestamp = datetime.now(UTC)
|
|
|
|
|
|
@dataclass
|
|
class ActivityQuery:
|
|
"""Data transfer object for activity queries."""
|
|
|
|
server_ids: list[int] | None = None
|
|
user_names: list[str] | None = None
|
|
media_types: list[str] | None = None
|
|
start_date: datetime | None = None
|
|
end_date: datetime | None = None
|
|
active_only: bool = False
|
|
include_snapshots: bool = False
|
|
limit: int | None = None
|
|
offset: int | None = None
|
|
order_by: str = "started_at"
|
|
order_direction: str = "desc"
|