viewlog: capture manifest + segment requests for view-count aggregation master
Adds pkg/viewlog: async gzipped-JSONL writer that buffers playback request events and rotates them to the VOD blob.Store on a configurable interval. Each line carries the playback session id, an HMAC-anonymized IP, and per-event-type fields (video AT-URI + manifest kind for manifest fetches, blob CID + owner DID + range bytes for segment fetches). IP anonymization uses a daily-rotated salt persisted in localdb: same IP collides within a UTC day (useful for dedup), the salt changes at midnight to decorrelate across days. Pruning old salt rows is enough to render historical logs unrecoverable. HandleGetVideoPlaylist and HandleGetVideoBlob post events to the writer through a non-blocking helper; if the operator has disabled the writer (--view-log-flush-interval=0) or no VOD store is wired, the helpers are no-ops. Files land under view-logs/<server-did>/ <window>.jsonl.gz alongside the content blobs so they pick up the bucket's lifecycle policy for free. Setup for the aggregator + place.stream.media.viewCount publish steps in a follow-up; this commit lands only the capture half. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>