---
title: Channel Playlists
menu_group: Linear TV
menu_order: 20
tab: Linear TV
tab_order: 20
requires_linear_tv: true
summary: Build reusable playlists of Movies, Episodes, Series, and Live streams for channel scheduling.
---

# Channel Playlists

Create playlists under **Channels → Playlists** (CPT `playlists`, admin-only — not public URLs).

These playlists are **separate** from Series episode ordering (`rovidx_smarttv_playlist` on Series posts).

## Playlist Builder

The **Playlist Builder** metabox appears when editing a playlist post.

### Content library (left panel)

- Filter by type: Movies, Episodes, Series, Live
- Search with live `input` events (not only on blur)
- **Load More** for paginated results
- Data from `GET /wp-json/mediablaster/v3/linear/library`

Empty and error states show inline messages (not a silent blank list).

### Playlist items (right panel)

- Drag to reorder (jQuery UI Sortable)
- **Remove** or **Duplicate** per item
- Summary shows item count and total duration

Items serialize to hidden field `mediablaster_playlist_items_json` on save. PHP validates and writes rows to `{prefix}mediablaster_playlist_items`.

### Item settings

Per-item options (stored in playlist item JSON / DB):

- **Start/end offsets** — trim playback window
- **Duration override** — seconds when source duration is unknown
- **Series expansion** — when adding a Series:
  - **All episodes** — uses Series `rovidx_smarttv_playlist` order
  - **Specific season** — filter by season number
  - **Selected episodes** — explicit episode list

## Validation

- Draft playlists may save with warnings.
- Playlists scheduled on channels must have valid items and usable durations before compilation succeeds.
- Changing playlist items marks affected channels dirty for recompilation.

## Meta summary

Post meta (for list columns and scheduler):

| Meta | Purpose |
|------|---------|
| `_mediablaster_playlist_duration` | Total seconds (computed on save) |
| `_mediablaster_playlist_item_count` | Item count |

## Admin REST (logged-in editors)

| Method | Route | Purpose |
|--------|-------|---------|
| GET | `/linear/library` | Search content library |
| GET | `/linear/playlists/{id}/items` | Fetch playlist items + summary |
| PUT/PATCH | `/linear/playlists/{id}/items` | Replace playlist items (builder alternative to post save) |

Nonce: WordPress REST nonce (`wp_rest`) via `X-WP-Nonce`.

## Assets

- JS: `admin/js/mediablaster-playlist-builder.js`
- CSS: `admin/css/mediablaster-linear-admin.css` (shared with scheduler)
- Localized object: `mediablasterLinear`

## Troubleshooting

| Symptom | Check |
|---------|-------|
| Content library empty with published movies | JS must not call `$list.empty()(items)` — use safe clear then iterate; check Network tab on `linear/library` |
| Library shows error message | REST 403 (nonce/capability) or PHP error in response |
| Items lost on save | Confirm `mediablaster_playlist_items_json` hidden field updates before Update |
| Zero duration on channel | Add duration override or ensure source posts have valid video duration meta |
