diff options
| author | Ben Sima <ben@bsima.me> | 2025-11-16 03:30:44 -0500 |
|---|---|---|
| committer | Ben Sima <ben@bsima.me> | 2025-11-16 03:30:44 -0500 |
| commit | 081f0759b37452bb1319c4f5f88a1d451a5177a9 (patch) | |
| tree | 69457c921a9a82a67a1d19e6b79d713d76e820cc /Biz/PodcastItLater/Web.py | |
| parent | 3b917a87e12c8ef97bc52afd3903ac22c082f7b1 (diff) | |
Add metrics tracking endpoint and JavaScript for play events
- Added POST /episode/{id}/track endpoint to track play/download
events - Added JavaScript to audio player to track first play event -
JavaScript sends fetch request to tracking endpoint on play - Tracks
user_id if logged in, otherwise anonymous - Added main() function to
Episode.py for test compatibility
Tasks completed: t-gcdFSb, t-gcfTnG
Diffstat (limited to 'Biz/PodcastItLater/Web.py')
| -rw-r--r-- | Biz/PodcastItLater/Web.py | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/Biz/PodcastItLater/Web.py b/Biz/PodcastItLater/Web.py index 7c85e0b..a706eb5 100644 --- a/Biz/PodcastItLater/Web.py +++ b/Biz/PodcastItLater/Web.py @@ -1659,6 +1659,30 @@ def add_episode_to_feed(request: Request, episode_id: int) -> Response: ) +@app.post("/episode/{episode_id}/track") +def track_episode( + request: Request, + episode_id: int, + data: FormData, +) -> Response: + """Track an episode metric event (play, download).""" + # Get event type from form data + event_type_raw = data.get("event_type", "") + event_type = event_type_raw if isinstance(event_type_raw, str) else "" + + # Validate event type + if event_type not in {"played", "downloaded"}: + return Response("Invalid event type", status_code=400) + + # Get user ID if logged in (None for anonymous) + user_id = request.session.get("user_id") + + # Track the event + Core.Database.track_episode_metric(episode_id, event_type, user_id) + + return Response("", status_code=200) + + class BaseWebTest(Test.TestCase): """Base class for web tests with database setup.""" |
