Features
- sample-app: show a LIVE badge instead of a countdown for live streams
- sample-app: support direct manifest URL playback and mock-server testing
Bug Fixes
- exoplayer: report contentIsLive and omit contentDuration for live streams
- mediatailor: append newly-reported ads when a tracking-built avail grows (fd2b5fd), closes #2 #3
- mediatailor: centralise trailing-segment sessionId extraction
- mediatailor: classify how the tracking endpoint was resolved
- mediatailor: correct DASH cue offset and give HLS breaks a stable id
- mediatailor: derive tracking URL from implicit-session DASH playlist path
- mediatailor: derive tracking URL from implicit-session HLS playlist path
- mediatailor: describe pending implicit-session tracking URL as deferral
- mediatailor: emit AD_ERROR when tracking fetch fails silently
- mediatailor: expose creativeId-first primary key for per-ad metrics
- mediatailor: harden schedule merge against zombie breaks and pod drift
- mediatailor: keep manifest pod boundaries when tracking ad count disagrees
- mediatailor: let EXT-X-DATERANGE override an earlier trackingUrl guess
- mediatailor: make playhead poll interval configurable at construction
- mediatailor: match growing-avail ads by start time when adId is absent
- mediatailor: match manifest breaks by id, gate MISSING_AVAIL_START once
- mediatailor: paginate NextToken within one poll instead of across polls
- mediatailor: parse tracking-event beacons with ad-start-relative timing
- mediatailor: pod endTimeMs must not exceed its enclosing break
- mediatailor: prune viewed avails from the live schedule
- mediatailor: read HLS tracking URL from EXT-X-DATERANGE when advertised
- mediatailor: rename segmentPrefix to canonical adSegmentPrefix
- mediatailor: require unanimous representation agreement for DASH ad periods
- mediatailor: revert tracking requests from POST back to GET
- mediatailor: round-trip NextToken across tracking polls
- mediatailor: stabilise avail identity across live window rotations
- mediatailor: surface avails missing startTimeInSeconds as an error
- mediatailor: surface pods appended after the playhead left their window
- mediatailor: treat empty avails as no-fill instead of firing AD_START