media.chromecast
#
Description#
Plugin to control Chromecast devices.
Configuration#
media.chromecast:
# [Optional]
# Default Chromecast to cast to if no name is specified.
# chromecast: # type=Optional[str]
# [Optional]
# How often the plugin should poll for new/removed
# Chromecast devices (default: 30 seconds).
# poll_interval: 30 # type=float
# [Optional]
# Select the preferred video/audio format for
# YouTube videos - and any media supported by youtube-dl or the
# selected fork. See the `youtube-dl documentation
# <https://github.com/ytdl-org/youtube-dl#format-selection>`_ for more
# info on supported formats. Example:
# ``bestvideo[height<=?1080][ext=mp4]+bestaudio`` - select the best
# mp4 video with a resolution <= 1080p, and the best audio format.
# youtube_format: bv[width<=?1080][ext=mp4]+ba[ext=m4a]/bv+ba # type=Optional[str]
# [Optional]
# If media download requires ``youtube_dl``,
# and the upstream media contains both audio and video to be merged,
# this can be used to specify the format of the output container -
# e.g. ``mp4``, ``mkv``, ``avi``, ``flv``. Default: ``mp4``.
# merge_output_format: mp4 # type=str
# [Optional]
# Additional arguments to pass to the youtube-dl
# executable. Default: None.
# ytdl_args: ('--use-postprocessor', 'FFmpegCopyStream', '--ppa', 'CopyStream:"-c:v libx264 -preset veryfast -crf 28 +faststart -c:a aac"') # type=Optional[Sequence[str]]
# [Optional]
# Use youtube-dl to download the media if we are dealing
# with formats compatible with youtube-dl/yt-dlp. Disable this option
# if you experience issues with the media playback on the Chromecast,
# such as media with no video, no audio or both. This option will
# disable muxing+transcoding over the HTTP server and will stream the
# URL directly to the Chromecast.
# use_ytdl: True # type=bool
# [Optional]
# Directories that will be scanned for media files when
# a search is performed (default: only ``download_dir``). You can
# specify it either:
#
# - As a list of strings:
#
# .. code-block:: yaml
#
# media_dirs:
# - /mnt/hd/media/movies
# - /mnt/hd/media/music
# - /mnt/hd/media/series
#
# - As a dictionary where the key is the name of the media display
# name and the value is the path:
#
# .. code-block:: yaml
#
# media_dirs:
# Movies: /mnt/hd/media/movies
# Music: /mnt/hd/media/music
# Series: /mnt/hd/media/series
#
# - As a dictionary where the key is the name of the media display
# name and the value is a dictionary with the path and additional
# display information:
#
# media_dirs:
# Movies:
# path: /mnt/hd/media/movies
# icon:
# url: https://example.com/icon.png
# # FontAwesome icon classes are supported
# class: fa fa-film
#
# Music:
# path: /mnt/hd/media/music
# icon:
# url: https://example.com/icon.png
# class: fa fa-music
#
# Series:
# path: /mnt/hd/media/series
# icon:
# url: https://example.com/icon.png
# class: fa fa-tv
# media_dirs: # type=Union[str, Iterable[Union[str, dict]], Dict[str, Union[str, dict]], NoneType]
# [Optional]
# Directory where external resources/torrents will be
# downloaded (default: ~/Downloads)
# download_dir: # type=Optional[str]
# [Optional]
# Environment variables key-values to pass to the
# player executable (e.g. DISPLAY, XDG_VTNR, PULSE_SINK etc.)
# env: # type=Optional[Dict[str, str]]
# [Optional]
# Default volume for the player (default: None, maximum volume).
# volume: # type=Union[float, int, NoneType]
# [Optional]
# Optional plugin to be used for torrent download.
# Possible values:
#
# - ``torrent`` - native ``libtorrent``-based plugin (default,
# recommended)
# - ``rtorrent`` - torrent support over rtorrent RPC/XML interface
# - ``webtorrent`` - torrent support over webtorrent (unstable)
# torrent_plugin: torrent # type=str
# [Optional]
# Select the preferred audio format for
# YouTube videos downloaded only for audio. Default: ``bestaudio``.
# youtube_audio_format: ba # type=Optional[str]
# [Optional]
# Path to the ``youtube-dl`` executable, used to
# extract information from YouTube videos and other media platforms.
# Default: ``yt-dlp``. The default has changed from ``youtube-dl`` to
# the ``yt-dlp`` fork because the former is badly maintained and its
# latest release was pushed in 2021.
# youtube_dl: yt-dlp # type=str
# [Optional]
# Directory where the media cache will be stored. If not
# specified, the cache will be stored in the default cache directory
# (usually ``~/.cache/platypush/media/<media_plugin>``).
# cache_dir: # type=Optional[str]
# [Optional]
# If set to True, streams transcoded via yt-dlp or
# ffmpeg will be cached in ``cache_dir`` directory. If not set
# (default), then streams will be played directly via memory pipe.
# You may want to set this to True if you have a slow network, or if
# you want to play media at high quality, even though the start time
# may be delayed. If set to False, the media will start playing as
# soon as the stream is ready, but the quality may be lower,
# especially at the beginning, and seeking may not be supported.
# cache_streams: False # type=bool
# [Optional]
# How long we should wait for any running
# threads/processes to stop before exiting (default: 5 seconds).
# stop_timeout: 5 # type=Optional[float]
# [Optional]
# If set to True then the plugin will not monitor
# for new events. This is useful if you want to run a plugin in
# stateless mode and only leverage its actions, without triggering any
# events. Defaults to False.
# disable_monitor: False # type=bool
Dependencies#
pip
pip install pychromecast
Alpine
apk add py3-pychromecast
Debian
apt install python3-pychromecast
Fedora
yum install python-chromecast
Actions#
Module reference#
- class platypush.plugins.media.chromecast.MediaChromecastPlugin(chromecast: str | None = None, poll_interval: float = 30, youtube_format: str | None = 'bv[width<=?1080][ext=mp4]+ba[ext=m4a]/bv+ba', merge_output_format: str = 'mp4', ytdl_args: Sequence[str] | None = ('--use-postprocessor', 'FFmpegCopyStream', '--ppa', 'CopyStream:"-c:v libx264 -preset veryfast -crf 28 +faststart -c:a aac"'), use_ytdl: bool = True, **kwargs)[source]#
Bases:
MediaPlugin
,RunnablePlugin
Plugin to control Chromecast devices.
- __init__(chromecast: str | None = None, poll_interval: float = 30, youtube_format: str | None = 'bv[width<=?1080][ext=mp4]+ba[ext=m4a]/bv+ba', merge_output_format: str = 'mp4', ytdl_args: Sequence[str] | None = ('--use-postprocessor', 'FFmpegCopyStream', '--ppa', 'CopyStream:"-c:v libx264 -preset veryfast -crf 28 +faststart -c:a aac"'), use_ytdl: bool = True, **kwargs)[source]#
- Parameters:
chromecast – Default Chromecast to cast to if no name is specified.
poll_interval – How often the plugin should poll for new/removed Chromecast devices (default: 30 seconds).
use_ytdl – Use youtube-dl to download the media if we are dealing with formats compatible with youtube-dl/yt-dlp. Disable this option if you experience issues with the media playback on the Chromecast, such as media with no video, no audio or both. This option will disable muxing+transcoding over the HTTP server and will stream the URL directly to the Chromecast.
- cancel_download(url: str | None = None, path: str | None = None)#
Cancel a download in progress.
Either the URL or the path must be specified.
- Parameters:
url – URL of the download.
path – Path of the download (default: any path associated with the URL).
- clear_downloads(url: str | None = None, path: str | None = None)#
Clear completed/cancelled downloads from the queue.
- Parameters:
url – URL of the download (default: all downloads).
path – Path of the download (default: any path associated with the URL).
- disconnect(chromecast: str | None = None, timeout: float | None = None)[source]#
Disconnect a Chromecast and wait for it to terminate
- Parameters:
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
timeout – Number of seconds to wait for disconnection (default: None: block until termination).
- download(url: str, filename: str | None = None, directory: str | None = None, timeout: int = 10, sync: bool = False, only_audio: bool = False, youtube_format: str | None = None, youtube_audio_format: str | None = None, merge_output_format: str | None = None)#
Download a media URL to a local file on the Platypush host (yt-dlp required for YouTube URLs).
This action is non-blocking and returns the path to the downloaded file once the download is initiated.
You can then subscribe to these events to monitor the download progress:
- Parameters:
url – Media URL.
filename – Media filename (default: inferred from the URL basename).
directory – Destination directory (default:
download_dir
).timeout – Network timeout in seconds (default: 10).
sync – If set to True, the download will be synchronous and the action will return only when the download is completed.
only_audio – If set to True, only the audio track will be downloaded (only supported for yt-dlp-compatible URLs for now).
youtube_format – Override the default
youtube_format
setting.youtube_audio_format – Override the default
youtube_audio_format
merge_output_format – Override the default
merge_output_format
setting.
- Returns:
The absolute path to the downloaded file.
- get_downloads(url: str | None = None, path: str | None = None)#
Get the download threads.
- Parameters:
url – URL of the download (default: all downloads).
path – Path of the download (default: any path associated with the URL).
- Returns:
[ { "ended_at": "2020-01-01T00:00:00+00:00", "path": "/path/to/download/video.mp4", "size": 1024, "started_at": "2020-01-01T00:00:00+00:00", "state": "Download state", "timeout": 60, "url": "https://example.com/video.mp4" } ]
- join(chromecast: str | None = None, timeout: float | None = None)[source]#
Blocks the thread until the Chromecast connection is terminated.
- Parameters:
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
timeout – Number of seconds to wait for disconnection (default: None: block until termination).
- mute(chromecast: str | None = None)[source]#
Toggle the mute status on the Chromecast
- Parameters:
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
- next()#
Play the next item in the queue
- pause_download(url: str | None = None, path: str | None = None)#
Pause a download in progress.
Either the URL or the path must be specified.
- Parameters:
url – URL of the download.
path – Path of the download (default: any path associated with the URL).
- play(resource: str, *_, content_type: str | None = None, chromecast: str | None = None, title: str | None = None, image_url: str | None = None, autoplay: bool = True, current_time: int = 0, stream_type: str = 'BUFFERED', subtitles: str | None = None, subtitles_lang: str = 'en-US', subtitles_mime: str = 'text/vtt', subtitle_id: int = 1, youtube_format: str | None = None, use_ytdl: bool | None = None, **kwargs)[source]#
Cast media to an available Chromecast device.
- Parameters:
resource – Media to cast
content_type – Content type as a MIME type string
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
title – Optional title
image_url – URL of the image to use for the thumbnail
autoplay – Set it to false if you don’t want the content to start playing immediately (default: true)
current_time – Time to start the playback in seconds (default: 0)
stream_type – Type of stream to cast. Can be BUFFERED (default), LIVE or UNKNOWN
subtitles – URL of the subtitles to be shown
subtitles_lang – Subtitles language (default: en-US)
subtitles_mime – Subtitles MIME type (default: text/vtt)
subtitle_id – ID of the subtitles to be loaded (default: 1)
youtube_format – Override the default YouTube format.
use_ytdl – Override the default use_ytdl setting for this call.
- quit(chromecast: str | None = None)[source]#
Exits the current app on the Chromecast
- Parameters:
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
- resume_download(url: str | None = None, path: str | None = None)#
Resume a paused download.
Either the URL or the path must be specified.
- Parameters:
url – URL of the download.
path – Path of the download (default: any path associated with the URL).
- search(query: str, types: Iterable[str] | None = None, queue_results: bool = False, autoplay: bool = False, timeout: float = 60)#
Perform a video search.
- Parameters:
query – Query string, video name or partial name
types – Video types to search (default:
["youtube", "file", "torrent"]
)queue_results – Append the results to the current playing queue (default: False)
autoplay – Play the first result of the search (default: False)
timeout – Search timeout (default: 60 seconds)
- set_volume(volume: float, chromecast: str | None = None)[source]#
Set the Chromecast volume
- Parameters:
volume – Volume to be set, between 0 and 100.
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
- start()#
Start the plugin.
- start_streaming(media: str, subtitles: str | None = None, download: bool = False)#
Starts streaming local media over the specified HTTP port. The stream will be available to HTTP clients on http://{this-ip}:{http_backend_port}/media/<media_id>
- Parameters:
media – Media to stream
subtitles – Path or URL to the subtitles track to be used
download – Set to True if you prefer to download the file from the streaming link instead of streaming it
- Returns:
dict containing the streaming URL.Example:
{ "id": "0123456abcdef.mp4", "source": "file:///mnt/media/movies/movie.mp4", "mime_type": "video/mp4", "url": "http://192.168.1.2:8008/media/0123456abcdef.mp4" }
- status(chromecast: str | None = None)[source]#
- Returns:
The status of a Chromecast (if
chromecast
is specified) or all the discovered/available Chromecasts. Format:{ "type": "cast", // Can be "cast" or "audio" "name": "Living Room TV", "manufacturer": "Google Inc.", "model_name": "Chromecast", "uuid": "f812afac-80ff-11ee-84dc-001500e8f607", "address": "192.168.1.2", "port": 8009, "status": { "app": { "id": "CC1AD845", "name": "Default Media Receiver" }, "is_active_input": false, "is_stand_by": true, "is_idle": true, "namespaces": [ "urn:x-cast:com.google.cast.cac", "urn:x-cast:com.google.cast.debugoverlay", "urn:x-cast:com.google.cast.media" ], "volume": 100, "muted": false, "adjusted_current_time": 14.22972, "album_artist": null, "album_name": null, "artist": null, "url": "https://some/video.mp4", "content_type": "video/mp4", "current_subtitle_tracks": [], "position": 1.411891, "duration": 253.376145, "episode": null, "idle_reason": null, "images": [ [ "https://some/image.jpg", null, null ] ], "last_updated": "2023-11-12T02:03:33.888843", "media_custom_data": {}, "media_is_generic": true, "media_is_movie": false, "media_is_musictrack": false, "media_is_photo": false, "media_is_tvshow": false, "media_metadata": { "title": "Some media", "thumb": "https://some/image.jpg", "images": [ { "url": "https://some/image.jpg" } ], "metadataType": 0 }, "media_session_id": 1, "metadata_type": 0, "playback_rate": 1, "player_is_idle": false, "player_is_paused": false, "player_is_playing": true, "state": "play", "season": null, "series_title": null, "stream_type": "BUFFERED", "stream_type_is_buffered": true, "stream_type_is_live": false, "subtitle_tracks": [], "supported_media_commands": 12303, "supports_pause": true, "supports_queue_next": false, "supports_queue_prev": false, "seekable": true, "supports_skip_backward": false, "supports_skip_forward": false, "supports_stream_mute": true, "supports_stream_volume": true, "title": "Some media", "track": null } }
- voldown(chromecast: str | None = None, step: float = 10, **_)[source]#
Turn down the Chromecast volume by 10% or step.
- Parameters:
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
step – Volume decrement between 0 and 100 (default: 10%).
- volup(chromecast: str | None = None, step: float = 10, **_)[source]#
Turn up the Chromecast volume by 10% or step.
- Parameters:
chromecast – Chromecast to cast to. If none is specified, then the default configured Chromecast will be used.
step – Volume increment between 0 and 100 (default: 10%).
- wait_stop(timeout=None)#
Wait until a stop event is received.