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
- Go to CastConductor → Settings
- Scroll to Playback Mode
- Select your desired mode:
- Standard (One Source) - Default, backwards compatible
- Dual Source (Video Muted + Audio) - Video and audio play simultaneously
- Video Only - Video with its own audio
- 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.
- Navigate to CastConductor → Settings
- Find Streaming Mode and select Video
- Enter your Video URL (HLS or MP4)
- 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.
- Navigate to Scenes & Containers
- Edit a scene
- In Background Settings, select Video as the background type
- Enter your video URL
- Configure options:
- Loop: Replay when video ends
- Muted: Disable audio (recommended for backgrounds)
Option 3: Video Layer in Canvas Editor
Add video as a positioned layer within a content block.
- Open the Canvas Editor for a content block
- Click + Add Layer → 🎬 Video Layers → Video
- Enter your video URL
- Optionally add a poster image (thumbnail shown before playback)
- Configure playback options:
- Autoplay: Start automatically
- Loop: Repeat when finished
- Muted: Disable audio
- 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.
- Open the Canvas Editor for a content block
- Click + Add Layer → 📡 Feed Layers
- Choose a feed type:
- RSS/Podcast Feed — Standard podcast or video RSS
- YouTube Playlist — Videos from a YouTube channel/playlist
- JSON Feed — Custom API endpoint
- Enter the feed URL
- Configure display options:
- Layout: Grid, List, or Carousel
- Columns: Number of items per row (grid only)
- Show thumbnails, titles, duration
- 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
- Get your podcast's RSS feed URL (usually found in your podcast hosting dashboard)
- In the Canvas Editor, add a 📡 Feed Layer → RSS/Podcast Feed
- Paste the RSS URL
- Choose your preferred layout:
- List — Vertical scrolling episode list
- Grid — Multi-column grid of episode cards
- Carousel — Netflix-style horizontal scrolling with center focus
- Featured + List — Hero item with list below
- 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 |
Carousel Mode (Netflix-Style)
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):
Playlist Feed (specific playlist):
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:
Playlist Feed:
Automatic URL Conversion
CastConductor can auto-convert regular YouTube URLs to RSS format:
youtube.com/channel/UC...→ RSS feed automaticallyyoutube.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_idor theUC...string in the URL - Playlist ID: Found in the URL after
list=(starts withPL...)
Menu Builder Navigation (v5.6.9+)
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
- Go to CastConductor → 🎮 Menu Builder
- You'll see two sections:
- Remote Button Bindings — Map buttons to menus or content blocks
- 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
- Click + New Menu in the Menus section
- Enter a menu name (e.g., "Main Menu", "Settings")
- Add menu items with the + Add Item button
- 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) |
Menu Styling
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:
- Create Content Block: Design a feed browser content block with your podcast RSS
- Create Menu in Menu Builder:
- Name: "Browse Shows"
- Add item: "Podcast Archive" → Type: Content Block → Select your feed content block
- Add item: "Latest Episodes" → Type: Content Block → Select another content block
- Add item: "Back" → Type: Action → Action: dismiss
- Bind to MENU button:
- Set MENU to "Opens Menu" → Select "Browse Shows"
- 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 |
Submenu Navigation
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.
Navigation Hierarchy
Scene → Container → Feed Browser → Episode Card
↓
(OK pressed)
↓
Episode Detail Panel
↓
(OK pressed)
↓
Audio Playback (with controls)
↓
(Back pressed)
↓
Return to Feed Browser
Deep Linking (Roku Universal Search)
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 minutesmovie— Standalone filmsepisode— TV or podcast episodeslive— 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:
- Access the feed export endpoint:
- This returns a JSON feed in Roku Direct Publisher format
- 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:
- Fetched from feed on first access
- Resized for optimal Roku display (300x300 thumbnails)
- Cached in WordPress to reduce load times
- Served from your CDN instead of the original source
Clearing the Cache
Option 1: WordPress Admin
- Go to CastConductor → Settings
- Click Clear Feed Cache button
- All
cc_feed_*transients are deleted
Option 2: REST API
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
- Check URL format: Ensure URL ends with
.m3u8,.mp4, or.mpd - Test URL directly: Open the URL in a browser to verify it's accessible
- Check CORS: Video servers must allow cross-origin requests
- Check HTTPS: Roku requires HTTPS for most streams
Feed Not Loading
- Verify feed URL: Open in browser to confirm it returns XML or JSON
- Check feed type: Ensure you selected the correct type (RSS, YouTube, etc.)
- Check API key: YouTube feeds require a valid API key
Navigation Not Working
- Ensure feed layer has focus: Only the active feed browser receives key events
- Check container assignment: Feed must be assigned to a scene to be displayed
Next Steps
- Scenes & Containers — Assign your video content to scenes
- CDN Setup — Optimize media delivery for large libraries
- REST API — Programmatically manage feeds and content