返回技能库

YouTube Music Cast

从 YouTube/YouTube Music 下载音乐,并通过 Home Assistant 将其流式传输到 Chromecast。完整的命令行工具集,具有 Web 服务器集成、配置向导和播放控制。

作者:AidanTheBandit · 最新版本:6.0.0

收藏:0 · 下载:1.6k

说明文档

# YouTube Music Cast

YouTube music → your Chromecast. Simple, free, works.

Download audio from YouTube or YouTube Music and stream it through Home Assistant to any Cast-enabled device. No subscriptions, no cloud services, just your local network.

## Features

- ✅ **Free forever** — No subscriptions, no premium accounts needed
- ✅ **High quality** — 320K MP3, crystal clear audio
- ✅ **Video mode** — Create MP4 videos with album art and text overlays
- ✅ **Radio mode** — Auto-discover and play related songs
- ✅ **Local storage** — Your music stays on your machine, no cloud
- ✅ **Multi-room** — Cast to any Chromecast device in your home
- ✅ **Batch download** — Download entire playlists, stream anytime
- ✅ **Simple CLI** — Fast commands, no browser required
- ✅ **Works offline** — Once downloaded, music is yours to keep

## Use Cases

### Daily Music
Download your favorite tracks in the morning, cast them throughout the day. No waiting, no buffering.

### Party Mode
Download a playlist before guests arrive, then queue up songs without fumbling with phones or apps.

### Background Audio
Play ambient music or podcasts while you work without worrying about ads or interruptions.

### Multi-Room Sync
Stream the same track to multiple Chromecasts simultaneously (bedroom + living room + kitchen).

## Why This Over Premium Services?

| Feature | YouTube Music Cast | Spotify Premium | YouTube Premium |
|---------|-------------------|------------------|------------------|
| Cost | Free forever | $10.99/month | $13.99/month |
| Quality | 320K MP3 | Up to 320K | Up to 1080p video |
| Offline | Yes, forever | Download limit | Download limit |
| Ads | None | None | None |
| Platforms | Any Chromecast | Spotify Connect devices | YouTube apps |
| Privacy | Local only | Cloud-based | Cloud-based |

## Quick Start

```bash
# 1. Setup (one time, takes 2 minutes)
cast-setup

# 2. Download your first song
cast-download https://youtube.com/watch?v=dQw4w9WgXcQ

# 3. Start the web server
cast-server start

# 4. Cast it to your default device
cast-play never-gonna-give-you-up.mp3
```

That's it. Your music is playing through your Chromecast.

## What This Does

Three simple steps, one command each:

### 1. Download
`yt-dlp` grabs audio from YouTube or YouTube Music, extracts it as MP3 (320K quality).

### 2. Host
A lightweight Python HTTP server makes your downloaded files accessible over your local network. No setup required — just Python 3.

### 3. Cast
Home Assistant's `media_player.play_media` service sends the HTTP URL to your Chromecast, which streams the audio.

### Why a Web Server?

Home Assistant's `play_media` service requires a URL, not a file path. The web server bridges that gap.

```yaml
# ✅ This works — HA can fetch via HTTP
media_content_id: "http://192.168.1.81:8735/song.mp3"

# ❌ This fails — HA can't read file paths
media_content_id: "/tmp/youtube-music/song.mp3"
```

**Architecture:**
```
YouTube URL → yt-dlp → MP3 file → Python HTTP server → Home Assistant API → Chromecast
```

## Installation

### What You Need

- **Home Assistant** with Google Cast integration
- **Chromecast** or Cast-enabled device (Nest speakers, Google Home, TV)
- **System tools:** `yt-dlp`, Python 3, `curl`, `jq`

### Step 1: Install Scripts

```bash
# Clone or download the skill
cd youtube-music-cast

# Make all scripts executable
chmod +x scripts/*

# Install globally (recommended)
./install.sh --global

# Or install locally
./install.sh
```

### Step 2: Run Setup Wizard

```bash
cast-setup
```

The wizard will ask for:
- **Home Assistant URL** — e.g., `http://homeassistant.local:8123`
- **Long-Lived Access Token** — Generate in HA → Profile → Long-Lived Access Tokens
- **Server IP** — The machine running these scripts
- **Default media player** — e.g., `media_player.bedroom_display`

### Step 3: Test Your Setup

```bash
# Download a test song
cast-download https://youtube.com/watch?v=dQw4w9WgXcQ

# Start the server
cast-server start

# Cast it
cast-play song.mp3
```

If music plays, you're ready!

## Commands

| Command | Description | Example |
|---------|-------------|----------|
| `cast-setup` | Run configuration wizard | `cast-setup` |
| `cast-download <URL> [options]` | Download from YouTube/YouTube Music | `cast-download https://youtube.com/watch?v=... --video` |
| `cast-radio <URL> [options]` | Start radio mode with related songs | `cast-radio https://youtube.com/watch?v=... --count 10` |
| `cast-server [start|stop|status]` | Manage HTTP server | `cast-server start` |
| `cast-play <file> [device]` | Cast music or video file to device | `cast-play song.mp4` |
| `cast-stop [device]` | Stop playback | `cast-stop` |
| `cast-status [device]` | Show player status | `cast-status` |
| `cast-devices` | List all available media players | `cast-devices` |
| `cast-list` | List downloaded files | `cast-list` |
| `cast-help` | Show help | `cast-help` |

## Usage Guide

### Your First Song

```bash
# Download from YouTube
cast-download https://youtube.com/watch?v=dQw4w9WgXcQ

# Rename for cleaner URL (recommended)
mv "/tmp/youtube-music/Rick Astley - Never Gonna Give You Up.mp3" \
   "/tmp/youtube-music/never-gonna-give-you-up.mp3"

# Start the web server
cast-server start

# Cast to your default device
cast-play never-gonna-give-you-up.mp3
```

### Cast to Different Rooms

```bash
# Living room TV
cast-play song.mp3 media_player.living_room

# Kitchen speaker
cast-play song.mp3 media_player.kitchen_speaker

# Bedroom Chromecast
cast-play song.mp3 media_player.bedroom_display

# Multiple rooms at once (run multiple commands)
cast-play song.mp3 media_player.living_room & \
cast-play song.mp3 media_player.bedroom_display
```

### Check What's Playing

```bash
# Default device
cast-status

# Specific device
cast-status media_player.bedroom_display
```

Output:
```
📺 media_player.bedroom_display

State: playing
Friendly Name: Bedroom display
Volume: 22%

Now Playing:
  Title: Never Gonna Give You Up
  Artist: Rick Astley
  Duration: 3:32

App: Default Media Receiver
```

### Stop Playback

```bash
# Stop default device
cast-stop

# Stop specific device
cast-stop media_player.living_room
```

### See What You've Downloaded

```bash
# List all music files with sizes
cast-list
```

Output:
```
🎵 Downloaded Music

boneheads-bank-holiday.mp3                                    9.3M
never-gonna-give-you-up.mp3                                 8.2M
song-for-nary.mp3                                          7.8M

Total: 3 files
```

### See Available Devices

```bash
cast-devices
```

Output:
```
📺 Available Media Players

media_player.bedroom_display
  Name: Bedroom display
  State: idle
  Supported: play_media, volume_set, volume_mute, ...

media_player.living_room
  Name: Living room TV
  State: off
  Supported: play_media, volume_set, ...

Default device: media_player.bedroom_display
```

## New Features: Radio Mode & Video Mode

### 📻 Radio Mode

Radio mode automatically discovers and downloads related songs based on YouTube recommendations. After downloading a seed song, it searches for similar tracks and adds them to your queue.

**Start radio mode:**

```bash
# Basic radio (downloads seed + 3 related songs)
cast-radio https://youtube.com/watch?v=dQw4w9WgXcQ

# Custom number of related songs
cast-radio https://youtube.com/watch?v=dQw4w9WgXcQ --count 10

# Radio mode with video files
cast-radio https://youtube.com/watch?v=dQw4w9WgXcQ --video --count 5
```

**Or use cast-download with --radio flag:**

```bash
# Download with radio mode
cast-download https://youtube.com/watch?v=dQw4w9WgXcQ --radio

# Download with custom count
cast-download https://youtube.com/watch?v=dQw4w9WgXcQ --radio --radio-count 5

# Radio + video mode combined
cast-download https://youtube.com/watch?v=dQw4w9WgXcQ --radio --video
```

**How it works:**
1. Downloads the seed song you specify
2. Extracts artist/title from metadata
3. Searches YouTube for similar videos
4. Downloads related songs (prefixed with `radio_`)
5. Related songs are ready to cast in sequence

**Play your radio queue:**

```bash
# Start server
cast-server start

# Play the first song
cast-play $(ls -t /tmp/youtube-music/*.mp3 | head -n 1 | xargs basename)

# Or play related songs sequentially
cast-play radio_some-song.mp3
cast-play radio_another-song.mp3
# ... etc
```

**Tips:**
- Related songs are prefixed with `radio_` for easy identification
- The radio mode searches based on the artist name from the seed song
- Use `--count` to control how many related songs to download
- Combine with `--video` flag for visual radio mode

### 🎬 Video Mode with Visuals

Video mode creates MP4 videos instead of plain MP3 files. Each video includes:
- The original audio track
- Album art thumbnail from YouTube
- Text overlay showing song title and artist
- Smooth, high-quality encoding

**Download a video:**

```bash
# Download as MP4 with album art and text
cast-download https://youtube.com/watch?v=dQw4w9WgXcQ --video

# Cast the MP4 file
cast-server start
cast-play "Never Gonna Give You Up.mp4"
```

**Radio mode with videos:**

```bash
# Download seed + related songs as videos
cast-radio https://youtube.com/watch?v=dQw4w9WgXcQ --video --count 5

# Cast videos
cast-play "Never Gonna Give You Up.mp4"
cast-play "radio_Together Forever.mp4"
# ... etc
```

**How it works:**
1. Downloads the audio track (320K MP3 quality)
2. Downloads the album art thumbnail from YouTube
3. Uses ffmpeg to create an MP4 video with:
   - Looping album art background
   - Audio track encoded as AAC
   - Text overlay (song title and artist name) at bottom
4. Cast the MP4 to your Chromecast (TVs with video support)

**Video output:**
- Codec: H.264 (libx264)
- Audio: AAC (192K)
- Resolution: Same as thumbnail (usually 480p or 720p)
- Text: White text with semi-transparent black box
- Compatible with all Chromecast devices with video support

**Notes:**
- Videos take more space than MP3s (~2-3x larger)
- Requires ffmpeg to be installed on your system
- Text overlay uses DejaVu Sans Bold font (included on most Linux systems)
- Chromecast audio devices (like Google Home Mini) will play audio only
- Chromecast with displays (TVs, Google Nest Hub) will show the full video

**Requirements for video mode:**
- `ffmpeg` must be installed on your system
  ```bash
  # Debian/Ubuntu
  sudo apt install ffmpeg

  # macOS
  brew install ffmpeg
  ```

### Mixed MP3 and MP4

`cast-play` automatically detects the file type:
- `.mp3`, `.wav`, `.ogg`, `.m4a`, `.flac` → music
- `.mp4`, `.mkv`, `.webm`, `.mov` → video

You can mix both formats in the same directory:
```bash
# Download some as MP3
cast-download https://youtube.com/watch?v=VIDEO_ID_1

# Download some as MP4
cast-download https://youtube.com/watch?v=VIDEO_ID_2 --video

# Play both - cast-play handles the difference
cast-play song.mp3
cast-play video.mp4
```

## Configuration

Config file: `~/.youtube-music-cast/config.sh`

```bash
# Home Assistant
HA_URL="http://homeassistant.local:8123"
HA_TOKEN="your-long-lived-access-token-here"

# Web Server
SERVER_IP="192.168.1.81"
SERVER_PORT="8735"

# Default Device (override per command)
DEFAULT_DEVICE="media_player.bedroom_display"

# Directories
DOWNLOAD_DIR="/tmp/youtube-music"
CAST_DIR="$HOME/.youtube-music-cast"
```

**Edit the file directly** or **re-run `cast-setup`** to update.

## File Naming Best Practices

Keep URLs clean. Simple filenames save you from headaches later.

### The Problem

❌ Bad filenames:
```
http://192.168.1.81:8735/Bonehead's%20Bank%20Holiday%20(Remastered).mp3
```
This URL is messy, hard to type, and prone to encoding errors.

### The Solution

✅ Good filenames:
```
http://192.168.1.81:8735/boneheads-bank-holiday.mp3
```
Clean, easy to type, no issues.

### Practical Tips

```bash
# After download, rename immediately
mv "Oasis - Bonehead's Bank Holiday (Remastered 1995).mp3" \
   "oasis-boneheads-bank-holiday.mp3"

# Use lowercase, hyphens only
mv "My Awesome Song.mp3" "my-awesome-song.mp3"

# ...