- Add QR generation of the currently playing URL (macOS window / iOS sheet)
- Encode channel metadata (name/type/group/logo) in the QR payload as
compact JSON; fall back to a plain URL when the payload is too long
for a reliably scannable QR
- Scanning saves the entry into the local library with its channel
metadata and starts playback; legacy plain-URL QR codes still work
- Add iOS QR scanner sheet (AVCaptureMetadataOutput) so scanning is no
longer macOS-only; both scanners share handleScannedCode
- Add optional channel name / group fields to the Add URL dialog and
thread group/logo through addURL/addItem into the library
- Restore session (queue + position) on launch and save on quit for
macOS, not just iOS
- Bundle app icons: generate AppIcon.icns from the macOS iconset when
missing, and compile Assets.xcassets into the iOS app
- Remove Combine import and cancellables
- Use NSKeyValueObservation for timeControlStatus (controlled teardown)
- Invalidate itemStatusObserver before replacing playerItem
- Store endObserver token for proper removal
- Add cleanup() method called on view disappear
- Proper deinit with direct property cleanup (nonisolated-safe)