Skip to content

Video & Audio Support

Stream video content, parse podcast feeds, and create navigable media menus on Roku.


Overview

CastConductor v5.7+ delivers comprehensive native video and audio support, enabling you to:

  • Stream live or on-demand video content
  • Import podcast feeds (RSS, SoundCloud) with Netflix-style navigation
  • Parse video playlists (YouTube, MRSS, custom JSON)
  • Create navigable menus for Roku remote control
  • Full styling control over feed layouts (colors, fonts, backgrounds)
  • Audio playback controls with progress bar and scrubbing
  • Enable Roku Universal Search integration via deep linking

Video Content Hierarchy

CastConductor supports video at multiple levels, giving you flexibility in how you structure your channel:

Level Description Configuration Location
Global Stream Single video replaces audio globally Settings Page
Scene Background Video as animated scene background Scene Background Settings
Content Block Layer Video positioned within a content block Canvas Editor
Feed/Playlist Navigable collection of videos Feed Layer in Canvas Editor

Priority Order

When multiple video sources are configured, they layer from back to front:

┌─────────────────────────────────────────────────────────────┐
│                     GLOBAL VIDEO STREAM                      │
│                  (Fullscreen, behind everything)             │
├─────────────────────────────────────────────────────────────┤
│                   SCENE VIDEO BACKGROUND                     │
│                 (Replaces static background)                 │
├─────────────────────────────────────────────────────────────┤
│  ┌────────────┐  ┌────────────┐  ┌────────────────────────┐ │
│  │ Container  │  │ Container  │  │      Container         │ │
│  │  (Video)   │  │  (Text)    │  │   (Feed Browser)       │ │
│  └────────────┘  └────────────┘  └────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

Playback Modes (v5.6.9+)

CastConductor supports four playback modes, configurable from the WordPress admin settings:

Mode Description Use Case
Standard One source at a time (video OR audio) Traditional streaming - video takes precedence if both configured
Dual Source Video plays muted + separate audio on top Music radio with visualizer video, ambient video with podcast audio
Video Only Video with its own audio track Traditional video content, live TV, VOD
Audio Only Audio stream only, no video layer Radio stations, podcasts, music streams

Dual Source Mode

This powerful mode enables creative combinations like:

  • 🎵 Music Radio + Visualizer: Play an audio visualizer video (muted) while streaming live radio
  • 🌊 Ambient + Podcast: Show relaxing nature video while playing podcast audio
  • 🎤 DJ Cam + Different Audio: Display video feed while audio comes from separate CDN
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│         🔇 VIDEO LAYER (Muted)                             │
│         ┌─────────────────────────────────────────────────┐ │
│         │                                                 │ │
│         │            Visualizer / Ambient Video           │ │
│         │                                                 │ │
│         └─────────────────────────────────────────────────┘ │
│                                                             │
│         🔊 AUDIO LAYER (On Top)                            │
│         ┌─────────────────────────────────────────────────┐ │
│         │  🎵 Live Radio / Podcast / Music Stream         │ │
│         └─────────────────────────────────────────────────┘ │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Configuring Playback Mode

  1. Go to CastConductor → Settings
  2. Scroll to Playback Mode
  3. Select your desired mode:
  4. Standard (One Source) - Default, backwards compatible
  5. Dual Source (Video Muted + Audio) - Video and audio play simultaneously
  6. Video Only - Video with its own audio
  7. Audio Only - Audio stream without video

When to Use Dual Source

Dual Source mode is perfect for:

  • Radio stations that want visual content without interrupting audio
  • Podcasters who want ambient video backgrounds
  • Music channels with audio visualizers
  • Any scenario where video and audio come from different sources

Supported Video Formats

Format Extension Description
HLS .m3u8 HTTP Live Streaming — most common for live & VOD
MP4 .mp4 Direct file playback
DASH .mpd Adaptive bitrate streaming
RTMP rtmp:// Legacy live streaming protocol

Recommended Format

HLS (.m3u8) is the most reliable format for Roku. It supports adaptive bitrate, live streaming, and has the widest device compatibility.


Adding Video Content

Option 1: Global Video Stream

Replace your audio stream with a video stream channel-wide.

  1. Navigate to CastConductor → Settings
  2. Find Streaming Mode and select Video
  3. Enter your Video URL (HLS or MP4)
  4. Save settings

The video will play fullscreen behind all your content blocks.

Option 2: Scene Video Background

Use video as an animated background for a specific scene.

  1. Navigate to Scenes & Containers
  2. Edit a scene
  3. In Background Settings, select Video as the background type
  4. Enter your video URL
  5. Configure options:
  6. Loop: Replay when video ends
  7. Muted: Disable audio (recommended for backgrounds)

Option 3: Video Layer in Canvas Editor

Add video as a positioned layer within a content block.

  1. Open the Canvas Editor for a content block
  2. Click + Add Layer🎬 Video LayersVideo
  3. Enter your video URL
  4. Optionally add a poster image (thumbnail shown before playback)
  5. Configure playback options:
  6. Autoplay: Start automatically
  7. Loop: Repeat when finished
  8. Muted: Disable audio
  9. Position and resize the video layer on the canvas

Option 4: Feed/Playlist Layer

Create a navigable menu of videos from a feed or playlist.

  1. Open the Canvas Editor for a content block
  2. Click + Add Layer📡 Feed Layers
  3. Choose a feed type:
  4. RSS/Podcast Feed — Standard podcast or video RSS
  5. YouTube Playlist — Videos from a YouTube channel/playlist
  6. JSON Feed — Custom API endpoint
  7. Enter the feed URL
  8. Configure display options:
  9. Layout: Grid, List, or Carousel
  10. Columns: Number of items per row (grid only)
  11. Show thumbnails, titles, duration
  12. Save and assign to a scene

Podcast & Audio Feeds

CastConductor's feed system works equally well for audio content. Perfect for:

  • Podcast episode lists
  • Music playlists
  • SoundCloud tracks

Supported Podcast Feed Types

Type Format Example
Podcast RSS XML (RSS 2.0) Any standard podcast feed
Atom XML Blog or podcast feeds
SoundCloud JSON (API) SoundCloud playlists/tracks
Custom JSON JSON Your own API endpoint

Adding a Podcast Feed

  1. Get your podcast's RSS feed URL (usually found in your podcast hosting dashboard)
  2. In the Canvas Editor, add a 📡 Feed LayerRSS/Podcast Feed
  3. Paste the RSS URL
  4. Choose your preferred layout:
  5. List — Vertical scrolling episode list
  6. Grid — Multi-column grid of episode cards
  7. Carousel — Netflix-style horizontal scrolling with center focus
  8. Featured + List — Hero item with list below
  9. Configure display options in the Precision Modal

On Roku, viewers will see an episode browser they can navigate with the remote:

  • D-pad Up/Down/Left/Right: Navigate episodes
  • OK: Open episode detail panel with full description
  • OK (on detail panel): Play episode
  • Back: Return to episode list or dismiss overlay
  • Rewind/Fast Forward: Skip back/forward 10 seconds during playback

Episode Detail Panel

When a viewer selects an episode, they see a detail panel with:

  • Episode artwork (automatically cached from feed)
  • Full episode title
  • Complete description/show notes
  • Play button
  • Audio progress bar (when playing)
  • Transport controls: Rewind 10s / Play-Pause / Forward 10s

Podcast Feed Styling (v5.7.8+)

Customize every aspect of your podcast feed appearance directly from the Precision Modal (double-click the feed layer in Canvas Editor).

Card Styling

Setting Description Default
Card Columns Number of columns in grid view 3
Card Focus Color Highlight color when card is selected Gold (#FFD700)
Card Background Color Background of the title area below artwork Dark gray
Max Items Maximum episodes to load (pagination) 50
Show Container Box Toggle the background container behind cards Off

The carousel layout features center-focused navigation:

┌────────────────────────────────────────────────────────────────┐
│                                                                 │
│    ┌─────┐   ┌─────────────┐   ┌─────┐                        │
│    │     │   │  ✨ FOCUSED  │   │     │                        │
│    │ Ep1 │   │    Ep2      │   │ Ep3 │                        │
│    │     │   │   (center)  │   │     │                        │
│    └─────┘   └─────────────┘   └─────┘                        │
│                                                                 │
│              ◀──── Cards slide through center ────▶            │
└────────────────────────────────────────────────────────────────┘
  • Selected card is always centered on screen
  • Cards smoothly slide left/right as you navigate
  • Scale and glow effects highlight the focused item

Detail Overlay Styling (v5.7.9+)

Customize the episode detail panel that appears when you select an episode:

Setting Description Default
BG Color Background color of detail panel #000000
BG Opacity Transparency (0 = transparent, 1 = solid) 0.85
BG Image Optional background image (from Media Library) None
Title Size Font size for episode title 32px
Title Color Color for episode title #FFFFFF
Desc Size Font size for description text 18px
Desc Color Color for description text #CCCCCC

Audio Controls (v5.7.9+)

Setting Description Default
Show Progress Bar Display playback progress during audio On

When enabled, the detail panel shows:

  • Progress bar with current position / total duration
  • Rewind 10 seconds button
  • Play/Pause toggle
  • Forward 10 seconds button

Keyboard Navigation

During playback, use Left/Right to move between transport controls, OK to activate. The Roku remote's dedicated Rewind/Fast Forward buttons also work!


RSS Feed Structure (Content Card Data)

CastConductor parses standard RSS/Atom feeds and automatically generates Netflix-style content cards for each item. This works with any podcast, SoundCloud, YouTube RSS, or video feed that follows the standard format.

What Gets Parsed

Every <item> in an RSS feed becomes a navigable card on Roku:

RSS Element Card Component Example
<title> Card Title "22 June 11 | Jesse Brooks | HOLLY'S HOUSE"
<itunes:image> Thumbnail High-res artwork (up to 3000x3000)
<description> Detail View Full show notes, credits, links
<itunes:duration> Duration Badge "01:06:16"
<pubDate> Published Date "Fri, 10 Jun 2022"
<enclosure url> Stream URL Direct MP3/M4A/MP4 URL
<link> Permalink Original web URL

No API Key Required

Unlike the SoundCloud API, RSS feeds are public and don't require any API keys or authentication. Just paste the feed URL and it works!

Example: SoundCloud RSS Feeds

SoundCloud provides RSS feeds for both user profiles and playlists:

Full User Feed (all tracks):

https://feeds.soundcloud.com/users/soundcloud:users:{USER_ID}/sounds.rss

Playlist Feed (specific playlist):

https://feeds.soundcloud.com/playlists/soundcloud:playlists:{PLAYLIST_ID}/sounds.rss

Finding Your SoundCloud IDs

  • User ID: View page source or network requests on your SoundCloud profile
  • Playlist ID: Similarly found in the page source of your playlist page

Example playlist: Holly's House → Playlist ID: 492618351

Example: Standard Podcast RSS

Any podcast hosted on Anchor, Libsyn, Podbean, Apple Podcasts, etc. provides an RSS feed:

<item>
  <title>Episode 42: The Answer</title>
  <pubDate>Mon, 16 Dec 2024 10:00:00 +0000</pubDate>
  <itunes:duration>00:45:30</itunes:duration>
  <itunes:image href="https://example.com/episode42.jpg"/>
  <description>In this episode, we discuss...</description>
  <enclosure url="https://example.com/ep42.mp3" type="audio/mpeg"/>
</item>

Example: YouTube RSS (No API Key Required!)

YouTube provides free RSS feeds that don't require any API key or authentication:

Channel Feed:

https://www.youtube.com/feeds/videos.xml?channel_id={CHANNEL_ID}

Playlist Feed:

https://www.youtube.com/feeds/videos.xml?playlist_id={PLAYLIST_ID}

Automatic URL Conversion

CastConductor can auto-convert regular YouTube URLs to RSS format:

  • youtube.com/channel/UC... → RSS feed automatically
  • youtube.com/playlist?list=PL... → RSS feed automatically
  • Just paste any YouTube channel or playlist URL!

Each video becomes a navigable card with:

YouTube Element Card Component
<title> Card Title
<media:thumbnail> Thumbnail Image
<media:description> Detail View
<published> Published Date
<yt:videoId> Video ID (for playback)

Finding Channel/Playlist IDs

  • Channel ID: View page source, look for channel_id or the UC... string in the URL
  • Playlist ID: Found in the URL after list= (starts with PL...)

The Menu Builder provides a centralized way to configure how remote buttons trigger navigation across your entire channel. Instead of attaching overlays to individual containers, you define button bindings that work globally.

How It Works

┌─────────────────────────────────────────────────────────────┐
│                    LIVE STREAM (Playing)                     │
│                                                             │
│                       Your Branding                          │
│                                                             │
│ ┌───────────────────┐                                       │
│ │ 🎮 Main Menu      │                                       │
│ │ ─────────────────│                                       │
│ │ ▶ Browse Shows    │  ← Opens a Content Block overlay      │
│ │   Settings        │  ← Opens a submenu                    │
│ │   About           │  ← Custom action                      │
│ └───────────────────┘                                       │
│      (Press MENU to show)                                   │
└─────────────────────────────────────────────────────────────┘

Accessing Menu Builder

  1. Go to CastConductor → 🎮 Menu Builder
  2. You'll see two sections:
  3. Remote Button Bindings — Map buttons to menus or content blocks
  4. Menus — Create and manage hierarchical navigation menus

Configuring Button Bindings

Each remote button (MENU, UP, DOWN, LEFT, RIGHT) can be configured:

Option Description
Disabled Button handled by Roku natively (default)
Opens Menu Select a hierarchical menu to display
Opens Content Block Show a content block as an overlay

When set to "Opens Content Block", you can also configure:

  • Position: left, right, top, bottom, center, fullscreen
  • Animation: slide, fade, none
  • Width/Height: Custom dimensions
  • Auto-dismiss: Seconds before hiding (0 = never)

Creating Hierarchical Menus

  1. Click + New Menu in the Menus section
  2. Enter a menu name (e.g., "Main Menu", "Settings")
  3. Add menu items with the + Add Item button
  4. Configure each item:
Item Type Description
Content Block Opens a content block as an overlay
Submenu Navigates to another menu (nested navigation)
Action Executes a predefined action (settings, about, switch scene)

Each menu can be customized:

Setting Options
Position left, right, top, bottom
Animation slide, fade, none
Width/Height Pixel dimensions
Background Color Any color with alpha support
Text Color Color for menu item labels
Accent Color Color for focused item highlight

Example: Podcast Browse Menu

Create a menu that lets viewers browse your podcast archive:

  1. Create Content Block: Design a feed browser content block with your podcast RSS
  2. Create Menu in Menu Builder:
  3. Name: "Browse Shows"
  4. Add item: "Podcast Archive" → Type: Content Block → Select your feed content block
  5. Add item: "Latest Episodes" → Type: Content Block → Select another content block
  6. Add item: "Back" → Type: Action → Action: dismiss
  7. Bind to MENU button:
  8. Set MENU to "Opens Menu" → Select "Browse Shows"
  9. Save all settings

Now when viewers press MENU on the remote, your custom navigation appears!

Remote Control Flow

Action Result
Press bound button Menu slides in from configured position
D-pad Up/Down Navigate between menu items
Press OK Select item (open content block, submenu, or execute action)
Press Back Dismiss menu or pop back to parent menu

Menus support unlimited nesting:

Main Menu
├── Browse Shows → (opens Submenu)
│   ├── Podcast Archive → (opens Content Block)
│   ├── Video Library → (opens Content Block)
│   └── ← Back
├── Settings → (opens Submenu)
│   ├── Audio Quality
│   ├── Notifications
│   └── ← Back
└── About → (action: show about screen)

When navigating submenus, pressing Back returns to the parent menu rather than dismissing entirely.

Design Tip

Keep menus shallow (2-3 levels max) for the best TV remote experience. Viewers prefer fewer button presses.


Netflix-Style Focus Animations

The FeedBrowser component includes premium Netflix-style animations for an engaging browsing experience. When viewers navigate through content cards, the focused item smoothly scales up with a glow effect.

How Focus Animation Works

┌────────────────────────────────────────────────────────────────┐
│  Mixed Show Archive                                             │
│                                                                 │
│    ┌─────┐   ┌─────────┐   ┌─────┐   ┌─────┐                  │
│    │     │   │ ✨ GLOW  │   │     │   │     │                  │
│    │ Ep1 │   │   Ep2   │   │ Ep3 │   │ Ep4 │                  │
│    │     │   │  (108%) │   │     │   │     │                  │
│    └─────┘   └─────────┘   └─────┘   └─────┘                  │
│     (100%)    FOCUSED      (100%)    (100%)                    │
│                                                                 │
│  ◀──── D-pad Left/Right ────▶                                  │
└────────────────────────────────────────────────────────────────┘

Animation Specifications

Animation Duration Easing Effect
Scale In (focus gained) 150ms outQuad Smooth zoom in
Scale Out (focus lost) 120ms inQuad Quick settle back
Glow Fade In 200ms linear Subtle glow appears
Glow Fade Out 150ms linear Glow fades away
Overlay Slide 300ms outQuad Smooth slide transition
Overlay Fade 200ms linear Opacity transition

Scale & Glow Settings

The focus animation can be customized:

Setting Default Description
focusScale 1.08 Scale factor when focused (8% larger)
focusAnimationDuration 0.15 Duration in seconds
enableFocusGlow true Show glow effect behind focused item
focusGlowColor 0x3399FF80 Glow color with alpha (blue, 50% opacity)

Centered Scaling

Items scale from their center point, not the top-left corner. This creates a natural "pop forward" effect similar to Netflix and other streaming platforms.

' Scale animation uses original position for center-based scaling
if m.originalPositions[m.focusedIndex] <> invalid
    originalPos = m.originalPositions[m.focusedIndex]
    newX = originalPos.x - (item.width * (scaleFactor - 1.0) / 2.0)
    newY = originalPos.y - (item.height * (scaleFactor - 1.0) / 2.0)
end if

Performance Optimized

Animations use Roku's native Animation and Vector2DFieldInterpolator nodes for smooth 60fps performance without frame drops.

Remote Control Navigation

When displaying feeds or playlists, viewers navigate with the Roku remote:

Button Action
D-pad (Up/Down/Left/Right) Navigate between items
OK Select item → Opens detail panel
OK (on detail panel) Begin playback
Back Return to previous screen / dismiss overlay
Play/Pause Pause/resume playback
Fast Forward Skip forward 10 seconds
Rewind Skip back 10 seconds

Playback Controls (v5.7.9+)

During audio playback, the detail panel shows transport controls:

┌─────────────────────────────────────────────────────────────┐
│                  Episode Detail Panel                        │
│  ┌─────────────┐                                            │
│  │   Artwork   │   Episode Title                            │
│  │             │   Episode description and show notes...    │
│  └─────────────┘                                            │
│                                                              │
│  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░░░░░  12:34 / 45:00        │
│        ◄◄ 10s        ▶ Play        10s ►►                   │
│                                                              │
└─────────────────────────────────────────────────────────────┘
  • Progress Bar: Shows current position and total duration
  • Rewind 10s: Skip back 10 seconds
  • Play/Pause: Toggle playback
  • Forward 10s: Skip forward 10 seconds

Navigation: Use Left/Right to move between buttons, OK to activate.

Scene → Container → Feed Browser → Episode Card
                               (OK pressed)
                               Episode Detail Panel
                               (OK pressed)
                               Audio Playback (with controls)
                               (Back pressed)
                           Return to Feed Browser

When viewers search on the Roku home screen, your content can appear in the results. Clicking a result launches your channel directly to that content.

Automatic Content IDs

CastConductor automatically generates unique content IDs for your video layers:

Content Type ID Format Example
Live Stream live:default Main live stream
Video Content Block video:{block_id} video:12345
Podcast Episode podcast:{post_id} podcast:67890
Scene with Video scene:{scene_id} scene:42

Configuring Deep Linking

When adding a video layer in the Canvas Editor, expand the 🔗 Deep Linking (Roku Search) section:

  • Media Type: Choose how Roku categorizes your content
    • shortFormVideo — Clips under 15 minutes
    • movie — Standalone films
    • episode — TV or podcast episodes
    • live — Live streaming content
  • Include in Roku Search: Toggle whether this content appears in Universal Search

Exporting the Roku Feed

To submit your content to Roku's Universal Search:

  1. Access the feed export endpoint:
    https://yoursite.com/wp-json/castconductor/v5/deep-link/roku-feed
    
  2. This returns a JSON feed in Roku Direct Publisher format
  3. Submit the feed URL to Roku Partner Dashboard

Feed Data Model

All feed items (video or audio) are normalized to this structure:

{
  "id": "unique-item-id",
  "title": "Episode or Video Title",
  "description": "Item description",
  "thumbnail": "https://example.com/thumb.jpg",
  "media_url": "https://example.com/video.m3u8",
  "media_type": "video",
  "duration": 1800,
  "published": "2025-12-21T10:00:00Z"
}

This works for video playlists, podcast feeds, YouTube imports, and custom JSON APIs.


Caching & Performance

Feed data is cached to minimize API calls:

Setting Default Notes
Cache Duration 5 minutes Configurable per feed
Auto-Refresh Disabled Enable for live/frequently updated feeds
Max Items 50 Limit items to improve load time

Podcast Artwork Caching (v5.7.3+)

Episode artwork is automatically:

  1. Fetched from feed on first access
  2. Resized for optimal Roku display (300x300 thumbnails)
  3. Cached in WordPress to reduce load times
  4. Served from your CDN instead of the original source

Clearing the Cache

Option 1: WordPress Admin

  1. Go to CastConductor → Settings
  2. Click Clear Feed Cache button
  3. All cc_feed_* transients are deleted

Option 2: REST API

POST /wp-json/castconductor/v5/feeds/cache/clear

When to Clear Cache

Clear the cache when:

  • You've added new episodes to your podcast
  • Artwork isn't displaying correctly
  • You've changed feed URLs
  • Testing feed parsing changes

Troubleshooting

Video Not Playing

  1. Check URL format: Ensure URL ends with .m3u8, .mp4, or .mpd
  2. Test URL directly: Open the URL in a browser to verify it's accessible
  3. Check CORS: Video servers must allow cross-origin requests
  4. Check HTTPS: Roku requires HTTPS for most streams

Feed Not Loading

  1. Verify feed URL: Open in browser to confirm it returns XML or JSON
  2. Check feed type: Ensure you selected the correct type (RSS, YouTube, etc.)
  3. Check API key: YouTube feeds require a valid API key
  1. Ensure feed layer has focus: Only the active feed browser receives key events
  2. Check container assignment: Feed must be assigned to a scene to be displayed

Next Steps