{
  "id": 16309180,
  "title": "Real Watch Time from Noisy Video Player Logs",
  "url": "https://urgent.news/2026/10/24/real-watch-time-from-noisy-video-player-logs",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-10-24T09:47:52.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/mahdimolavi/real-watch-time-from-noisy-video-player-logs-jm8"
  },
  "original_language": "en",
  "account": "The player transmits a concise JSON event for each activity, including play, pause, seek, speed or quality changes, and regular \"still playing\" heartbeats. Each event includes the video's progress, a timestamp from the client, and unique identifiers for the learner and video. The player's events are lightweight and generated in high numbers, so the system must handle them efficiently without slowing down the user experience. To manage this, the ingestion service is designed to accept events quickly and store them for later processing. When the memory channel for events fills up, the service returns a 503 error code to the client, prompting it to slow down and prevent server overload. This approach ensures the player remains responsive while the server handles the incoming data. However, the player's events are not entirely reliable, as they can be affected by various factors like network issues, incorrect timestamps, or incorrect logging. Therefore, the analysis engine must account for these possibilities and infer what likely happened between two events instead of relying strictly on the data provided. The analysis engine is a standalone C# application that can be easily tested. It reads the events in chronological order for each learner-video pair and reconstructs the viewing sessions. Four key rules guide the analysis: events must be physically possible given the video's playback speed, progress is measured using tenths of a second instead of whole seconds to avoid inaccuracies, pauses not directly logged by the player are inferred when the player does not send a heartbeat within a certain timeframe, and the engine accounts for common issues like seeking, changing settings, or a sudden cessation of playback.",
  "summary": "Originally published on mahdimolavi.ir . \"How much of this video did the student actually watch?\" sounds like a question with a one-line answer. The player knows where the playhead is, so add up the seconds. Then you open the raw events and the one-liner falls apart: pauses that were never logged, tabs closed in the middle of a lesson, phones whose clocks are minutes off, people watching at 2x,…",
  "key_points": [
    "Player transmits lightweight JSON events for each activity",
    "Ingestion service accepts events quickly, returns 503 error on overload",
    "Analysis engine reconstructs viewing sessions with four key rules"
  ],
  "editors_take": "Reconstructing viewing sessions through inferred logic rather than raw logs allows the system to maintain accurate engagement metrics despite the inherent unreliability of high-volume, lightweight client-side event data.",
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}