Last active
December 5, 2024 20:30
-
-
Save duggan/cadedd0dd0d4c966462b to your computer and use it in GitHub Desktop.
Using pychromecast to headlessly stream youtube videos
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
""" | |
Requires pychromecast. | |
Install with `pip install pychromecast` | |
usage: cast.py [-h] -d DEVICE -v VIDEO | |
Cast YouTube videos headlessly. | |
optional arguments: | |
-h, --help show this help message and exit | |
-d DEVICE, --device DEVICE | |
Name of device to cast to. Choose: Living Room | |
-v VIDEO, --video VIDEO | |
YouTube video ID (part after ?v= in the URL) | |
""" | |
import time | |
import signal | |
import argparse | |
from threading import Event | |
import pychromecast | |
from pychromecast.controllers.youtube import YouTubeController | |
# Triggers program exit | |
shutdown = Event() | |
def signal_handler(x,y): | |
shutdown.set() | |
# Listen for these signals | |
signal.signal(signal.SIGTERM, signal_handler) | |
signal.signal(signal.SIGQUIT, signal_handler) | |
signal.signal(signal.SIGINT, signal_handler) | |
# A list of Chromecast devices broadcasting | |
chromecast_devices = ', '.join(pychromecast.get_chromecasts_as_dict().keys()) | |
# Some command line help | |
parser = argparse.ArgumentParser(description='Cast YouTube videos headlessly.') | |
parser.add_argument('-d', '--device', required=True, help='Name of device to cast to. Choose: %s' % chromecast_devices) | |
parser.add_argument('-v', '--video', required=True, help='YouTube video ID (part after ?v= in the URL)') | |
opts = parser.parse_args() | |
cast_device = opts.device | |
youtube_id = opts.video | |
# Initialize a connection to the Chromecast | |
cast = pychromecast.get_chromecast(friendly_name=cast_device) | |
# Create and register a YouTube controller | |
yt = YouTubeController() | |
cast.register_handler(yt) | |
# Play the video ID we've been given | |
yt.play_video(youtube_id) | |
print("Streaming %s to %s" % (youtube_id, cast_device)) | |
# Wait for a signal that we should shut down | |
while not shutdown.is_set(): | |
time.sleep(1) | |
print("Stopping stream...") | |
cast.quit_app() |
Ah, OK, seems like it's deprecated/broken
https://www.bountysource.com/issues/27672511-youtubecontroller-doesn-t-display-video
That's a shame, but no responses required.
What I did was to pipe from youtube-dl to a flask server.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I have pychromecast working with media I serve up from my local webserver thus
mc = cast.media_controller
mc.play_media(whatever)
but can't get the youtube controller to work. I get the YouTube splash screen but not the intended target (which I know exists)
I can get the chromecast to cast the same video directly from my android phone.
Chromecast firmware is 1.19a.63621
Any ideas/suggestions why this isn't working?
Cheers in advance
Tim