# Media

> Comprehensive media patterns: video playback, audio/music players, HLS streaming, remote images, AVAudioSession, memory management. Use when implementing any media-related features.

- Skill: `abdullah4ai/media` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add abdullah4ai/media`
- Raw SKILL.md: https://api.skillmd.com/api/skills/abdullah4ai/media/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: abdullah4ai (https://skillmd.com/u/abdullah4ai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/abdullah4ai/media

---

# Media

## Networking Clarification

Media playback URLs are **permitted**. The forbidden-patterns networking ban targets REST API clients (URLSession data tasks, custom HTTP clients), **not** media playback. The following are allowed:

- `AVPlayer` with remote URLs (MP4, HLS `.m3u8` streams)
- `AsyncImage` loading remote image URLs
- `KFImage` (Kingfisher) loading and caching remote images
- `URLSession.shared.download(from:)` **only** for downloading media files to local storage

Do **not** use URLSession for REST API calls, JSON fetching, or custom networking — that ban still applies.

## Decision Tree

Pick the right pattern based on what you're building:

| Building | Reference | Key API |
|----------|-----------|---------|
| Video player | video-playback | `VideoPlayer`, `AVPlayer` |
| HLS/live streaming | video-playback | `AVPlayer` + `.m3u8` URL |
| Video feed (TikTok-style) | video-playback + media-memory-management | `FeedPlayerCoordinator` |
| Music/audio player | audio-playback + audio-session | `AVAudioPlayer` (local) or `AVPlayer` (streaming) |
| Podcast player | audio-playback + audio-session | `AVPlayer` + Now Playing + Remote Commands |
| Background audio | audio-session | `.playback` category + `UIBackgroundModes` |
| Image gallery/feed | remote-images | `KFImage` (Kingfisher) |
| Simple remote image | remote-images | `AsyncImage` |
| Sound effects | audio-playback | `AVAudioPlayer` with `.ambient` category |
| Sample content | sample-media-urls | Public URLs, local audio generation |

## Platform Capabilities

| Feature | iOS | macOS | tvOS | watchOS | visionOS |
|---------|-----|-------|------|---------|----------|
| Video playback | VideoPlayer | AVPlayerView (NSViewRepresentable) | VideoPlayer | No | VideoPlayer |
| Audio playback | AVAudioPlayer / AVPlayer | AVAudioPlayer / AVPlayer | AVAudioPlayer / AVPlayer | WKAudioFilePlayer | AVAudioPlayer / AVPlayer |
| AVAudioSession | Yes | No (not needed) | Yes | Limited | Yes |
| Background audio | Yes (UIBackgroundModes) | N/A | No | Limited | Yes |
| Now Playing info | Yes | Yes | Limited | No | Yes |
| Remote commands | Yes | Yes | Limited | No | Yes |
| AsyncImage | Yes | Yes | Yes | Yes | Yes |
| Kingfisher | Yes | Yes | Yes | No | Yes |

## Recommended Packages

All already in the curated package registry — no new dependencies to add:

- **Kingfisher** — remote image loading with disk/memory caching, prefetch, placeholder, fade. Use for image feeds and galleries (20+ images).
- **DSWaveformImage** — audio waveform visualization. Use for voice memo or audio editing UIs.
- **AudioKit** — advanced audio synthesis and processing. Only use when the user specifically needs audio effects, synthesis, or real-time audio processing.

## Required Info.plist Keys

For background audio playback, add to the target's `info` section in `project.yml`:

```yaml
UIBackgroundModes: ["audio"]
```

No other Info.plist keys are needed for basic media playback.

## Cross-References

- **PhotosPicker** — see the `camera` skill (not duplicated here)
- **Camera access** — see the `camera` skill
- **MapKit / CoreLocation** — see the `maps` skill (not duplicated here)
- **Image containment / clip patterns** — see the `swiftui` skill
- **Haptic feedback on media controls** — see the `haptics` skill

## References

This skill includes the following reference documents (auto-loaded):

- **video-playback** — VideoPlayer, HLS streaming, custom controls, feed-style video, looping
- **audio-playback** — AVAudioPlayer (local), AVPlayer (streaming), Now Playing, remote commands, playlists
- **audio-session** — AVAudioSession categories, interruption handling, route changes, background audio
- **remote-images** — AsyncImage vs Kingfisher decision, image grids, feeds, prefetch, cache config
- **sample-media-urls** — Public video/HLS/image URLs and local audio generation with `say`
- **media-memory-management** — Player lifecycle, observer cleanup, KVO, feed coordinator, debug checklist

