forked from platypush/platypush
Support for YouTube media in Chromecast plugin
This commit is contained in:
parent
26f3842724
commit
6fcc3a2397
1 changed files with 52 additions and 8 deletions
|
@ -1,5 +1,8 @@
|
||||||
|
import re
|
||||||
import pychromecast
|
import pychromecast
|
||||||
|
|
||||||
|
from pychromecast.controllers.youtube import YouTubeController
|
||||||
|
|
||||||
from platypush.plugins import Plugin, action
|
from platypush.plugins import Plugin, action
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,6 +10,11 @@ class MediaChromecastPlugin(Plugin):
|
||||||
"""
|
"""
|
||||||
Plugin to interact with Chromecast devices
|
Plugin to interact with Chromecast devices
|
||||||
|
|
||||||
|
Supported formats:
|
||||||
|
|
||||||
|
* YouTube URLs
|
||||||
|
* Plex (through ``media.plex`` plugin, experimental)
|
||||||
|
|
||||||
Requires:
|
Requires:
|
||||||
|
|
||||||
* **pychromecast** (``pip install pychromecast``)
|
* **pychromecast** (``pip install pychromecast``)
|
||||||
|
@ -67,16 +75,19 @@ class MediaChromecastPlugin(Plugin):
|
||||||
|
|
||||||
|
|
||||||
if chromecast not in self.chromecasts:
|
if chromecast not in self.chromecasts:
|
||||||
self.chromecasts = pychromecast.get_chromecasts()
|
self.chromecasts = {
|
||||||
cast = next(cc for cc in self.chromecasts
|
cast.device.friendly_name: cast
|
||||||
if cc.device.friendly_name == chromecast)
|
for cast in pychromecast.get_chromecasts()
|
||||||
else:
|
}
|
||||||
cast = self.chromecasts[chromecast]
|
|
||||||
|
if chromecast not in self.chromecasts:
|
||||||
|
raise RuntimeError('Device {} not found'.format(chromecast))
|
||||||
|
|
||||||
|
return self.chromecasts[chromecast]
|
||||||
|
|
||||||
return cast
|
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def cast_media(self, media, content_type, chromecast=None, title=None,
|
def cast_media(self, media, content_type=None, chromecast=None, title=None,
|
||||||
image_url=None, autoplay=True, current_time=0,
|
image_url=None, autoplay=True, current_time=0,
|
||||||
stream_type=STREAM_TYPE_BUFFERED, subtitles=None,
|
stream_type=STREAM_TYPE_BUFFERED, subtitles=None,
|
||||||
subtitles_lang='en-US', subtitles_mime='text/vtt',
|
subtitles_lang='en-US', subtitles_mime='text/vtt',
|
||||||
|
@ -121,10 +132,29 @@ class MediaChromecastPlugin(Plugin):
|
||||||
:type subtitle_id: int
|
:type subtitle_id: int
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not chromecast:
|
||||||
|
chromecast = self.chromecast
|
||||||
|
|
||||||
cast = self.get_chromecast(chromecast)
|
cast = self.get_chromecast(chromecast)
|
||||||
cast.wait()
|
cast.wait()
|
||||||
|
|
||||||
mc = cast.media_controller
|
mc = cast.media_controller
|
||||||
mc.namespace = 'urn:x-cast:com.google.cast.sse'
|
yt = self._get_youtube_url(media)
|
||||||
|
|
||||||
|
if yt:
|
||||||
|
self.logger.info('Playing YouTube video {} on {}'.format(
|
||||||
|
yt, chromecast))
|
||||||
|
|
||||||
|
hndl = YouTubeController()
|
||||||
|
cast.register_handler(hndl)
|
||||||
|
hndl.update_screen_id()
|
||||||
|
return hndl.play_video(yt)
|
||||||
|
|
||||||
|
if not content_type:
|
||||||
|
raise RuntimeError('content_type required to process media {}'.
|
||||||
|
format(media))
|
||||||
|
|
||||||
|
self.logger.info('Playing {} on {}'.format(media, chromecast))
|
||||||
|
|
||||||
mc.play_media(media, content_type, title=title, thumb=image_url,
|
mc.play_media(media, content_type, title=title, thumb=image_url,
|
||||||
current_time=current_time, autoplay=autoplay,
|
current_time=current_time, autoplay=autoplay,
|
||||||
|
@ -134,6 +164,20 @@ class MediaChromecastPlugin(Plugin):
|
||||||
|
|
||||||
mc.block_until_active()
|
mc.block_until_active()
|
||||||
|
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _get_youtube_url(cls, url):
|
||||||
|
m = re.match('https?://www.youtube.com/watch\?v=([^&]+).*', url)
|
||||||
|
if m:
|
||||||
|
return m.group(1)
|
||||||
|
|
||||||
|
m = re.match('youtube:video:(.*)', url)
|
||||||
|
if m:
|
||||||
|
return m.group(1)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def disconnect(self, chromecast=None, timeout=None, blocking=True):
|
def disconnect(self, chromecast=None, timeout=None, blocking=True):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in a new issue