{"id":13583405,"url":"https://github.com/Hypnos3/node-red-contrib-cast","last_synced_at":"2025-04-06T18:32:19.537Z","repository":{"id":32980956,"uuid":"140079151","full_name":"Hypnos3/node-red-contrib-cast","owner":"Hypnos3","description":"Node-RED nodes for Chromecast and GoogleHome","archived":false,"fork":true,"pushed_at":"2024-05-28T23:27:14.000Z","size":1142,"stargazers_count":71,"open_issues_count":23,"forks_count":19,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-05-29T14:00:06.359Z","etag":null,"topics":["chromecast","chromecast-sender","google-assistant","google-home"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"stephenkeep/node-red-contrib-chromecast","license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Hypnos3.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=XDPSATTXBXHCL"}},"created_at":"2018-07-07T11:38:30.000Z","updated_at":"2023-09-11T00:29:09.000Z","dependencies_parsed_at":"2023-01-16T22:45:23.520Z","dependency_job_id":null,"html_url":"https://github.com/Hypnos3/node-red-contrib-cast","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hypnos3%2Fnode-red-contrib-cast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hypnos3%2Fnode-red-contrib-cast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hypnos3%2Fnode-red-contrib-cast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hypnos3%2Fnode-red-contrib-cast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Hypnos3","download_url":"https://codeload.github.com/Hypnos3/node-red-contrib-cast/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247531229,"owners_count":20953918,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chromecast","chromecast-sender","google-assistant","google-home"],"created_at":"2024-08-01T15:03:27.571Z","updated_at":"2025-04-06T18:32:18.748Z","avatar_url":"https://github.com/Hypnos3.png","language":"JavaScript","funding_links":["https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=XDPSATTXBXHCL"],"categories":["JavaScript"],"sub_categories":[],"readme":"# node-red-contrib-cast for NodeRED\n\n[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/hypnos3/node-red-contrib-cast/graphs/commit-activity)\n[![HitCount](http://hits.dwyl.io/hypnos3/node-red-contrib-cast.svg)](http://hits.dwyl.io/hypnos3/node-red-contrib-cast)\n[![Dependencies Status](https://img.shields.io/david/hypnos3/node-red-contrib-cast.svg)](https://david-dm.org/hypnos3/node-red-contrib-cast)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Issues](https://img.shields.io/github/issues/hypnos3/node-red-contrib-cast.svg?style=flat-square)](https://github.com/hypnos3/node-red-contrib-cast/issues)\n\n[![NPM](https://nodei.co/npm/node-red-contrib-cast.png)](https://nodei.co/npm/node-red-contrib-cast/)\n\n\u003c!-- [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com) --\u003e\n\nThese nodes are based on a fork of the node-red-contrib-chromecast. It is for stream media on a chromecast or a google home device.\n\n![nodes](images/appearance1.png?raw=true)\n\n\u003e Because I no longer use this node myself, there is unfortunately only limited support.\n\n\n## Table of contents\n\n- [node-red-contrib-cast for NodeRED](#node-red-contrib-cast-for-nodered)\n\t- [Table of contents](#table-of-contents)\n\t- [Installation](#installation)\n\t- [Quick Start](#quick-start)\n\t\t- [stream a url](#stream-a-url)\n\t\t- [sends an text to Google TTS](#sends-an-text-to-google-tts)\n\t\t- [play a video on chromecast](#play-a-video-on-chromecast)\n\t\t- [get status of a cast device](#get-status-of-a-cast-device)\n\t- [Implemented Nodes](#implemented-nodes)\n\t- [How to use](#how-to-use)\n\t\t- [Media Types](#media-types)\n\t- [Advanced](#advanced)\n\t- [Tip](#tip)\n\t- [Examples](#examples)\n\t\t- [Play local files](#play-local-files)\n\t\t- [changing ip, url, contentType, streamType](#changing-ip-url-contenttype-streamtype)\n\t- [Bugs and Feedback](#bugs-and-feedback)\n\t\t- [:moneybag: Donations ![Donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=XDPSATTXBXHCL)](#moneybag-donations-)\n\t- [LICENSE](#license)\n\t- [Other](#other)\n\n## Installation\n\n```bash\ncd ~/.node-red\nnpm install node-red-contrib-cast\n```\n\n## Quick Start\n\nThis package provides a single node, cast, which will be under the \"functions\" group in the pallete.\n\n### stream a url\n\nSimple flow that sends an mp3 to the chromecast or google cast device:\n\n![example 1](images/example1.png?raw=true)\n\n    [{\"id\":\"a21f1807.41d7f8\",\"type\":\"cast-to-client\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"url\":null,\"contentType\":\"\",\"message\":null,\"language\":\"en\",\"ip\":\"\",\"port\":\"\",\"volume\":null,\"x\":590,\"y\":80,\"wires\":[[\"fba1eb3.2515918\"]]},{\"id\":\"74313baf.f282f4\",\"type\":\"inject\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"x\":160,\"y\":80,\"wires\":[[\"53d91dd8.67b924\"]]},{\"id\":\"53d91dd8.67b924\",\"type\":\"change\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"rules\":[{\"t\":\"set\",\"p\":\"ip\",\"pt\":\"msg\",\"to\":\"192.168.1.125\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"url\",\"pt\":\"msg\",\"to\":\"http://translate.google.com/translate_tts?ie=UTF-8\u0026total=1\u0026idx=0\u0026textlen=32\u0026client=tw-ob\u0026q=Word%20Up\u0026tl=En-gb\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"contentType\",\"pt\":\"msg\",\"to\":\"audio/mp3\",\"tot\":\"str\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":380,\"y\":80,\"wires\":[[\"a21f1807.41d7f8\"]]},{\"id\":\"fba1eb3.2515918\",\"type\":\"debug\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"x\":790,\"y\":80,\"wires\":[]},{\"id\":\"9ef34079.24061\",\"type\":\"comment\",\"z\":\"d900d7d9.c4c498\",\"name\":\"stream a url\",\"info\":\"\",\"x\":130,\"y\":40,\"wires\":[]}]\n\n### sends an text to Google TTS\n\nSimple flow that sends an text to Google TTS and the result to a the chromecast or google cast device:\n\n![example 2](images/example2.png?raw=true)\n\n    [{\"id\":\"8d9663a.05e27a\",\"type\":\"cast-to-client\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"url\":null,\"contentType\":\"\",\"message\":null,\"language\":\"en\",\"ip\":\"\",\"port\":\"\",\"volume\":null,\"x\":590,\"y\":200,\"wires\":[[\"b885e401.447548\"]]},{\"id\":\"6faf449b.c11efc\",\"type\":\"inject\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"x\":160,\"y\":200,\"wires\":[[\"23bdf480.46b85c\"]]},{\"id\":\"23bdf480.46b85c\",\"type\":\"change\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"rules\":[{\"t\":\"set\",\"p\":\"ip\",\"pt\":\"msg\",\"to\":\"192.168.1.125\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"message\",\"pt\":\"msg\",\"to\":\"Word Up\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"language\",\"pt\":\"msg\",\"to\":\"En-gb\",\"tot\":\"str\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":380,\"y\":200,\"wires\":[[\"8d9663a.05e27a\"]]},{\"id\":\"b885e401.447548\",\"type\":\"debug\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"x\":790,\"y\":200,\"wires\":[]},{\"id\":\"9a5a2ce.5ae7ed\",\"type\":\"comment\",\"z\":\"d900d7d9.c4c498\",\"name\":\"say a text\",\"info\":\"\",\"x\":120,\"y\":160,\"wires\":[]}]\n\n### play a video on chromecast\n\n    [{\"id\":\"443984d.4919a7c\",\"type\":\"cast-to-client\",\"z\":\"c4dd07cf.84ae98\",\"name\":\"\",\"url\":\"\",\"contentType\":\"\",\"message\":\"\",\"language\":\"de\",\"ip\":\"192.168.1.125\",\"port\":\"\",\"volume\":\"\",\"x\":490,\"y\":840,\"wires\":[[\"cad88339.e69ff\"]]},{\"id\":\"cc601032.ef8b9\",\"type\":\"inject\",\"z\":\"c4dd07cf.84ae98\",\"name\":\"\",\"topic\":\"\",\"payload\":\"youtube\",\"payloadType\":\"str\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"x\":110,\"y\":840,\"wires\":[[\"62aea8fa.99c718\"]]},{\"id\":\"cad88339.e69ff\",\"type\":\"debug\",\"z\":\"c4dd07cf.84ae98\",\"name\":\"\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"x\":710,\"y\":840,\"wires\":[]},{\"id\":\"62aea8fa.99c718\",\"type\":\"change\",\"z\":\"c4dd07cf.84ae98\",\"name\":\"\",\"rules\":[{\"t\":\"set\",\"p\":\"url\",\"pt\":\"msg\",\"to\":\"http://commondatastorage.googleapis.com/gtv-videos-bucket/big_buck_bunny_1080p.mp4\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"contentType\",\"pt\":\"msg\",\"to\":\"video/mp4\",\"tot\":\"str\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":300,\"y\":840,\"wires\":[[\"443984d.4919a7c\"]]}]\n\n### get status of a cast device\n\n    [{\"id\":\"82e3c67a.27b218\",\"type\":\"cast-to-client\",\"z\":\"c4dd07cf.84ae98\",\"name\":\"\",\"url\":\"\",\"contentType\":\"\",\"message\":\"\",\"language\":\"en\",\"ip\":\"192.168.1.125\",\"port\":\"\",\"volume\":\"\",\"x\":490,\"y\":220,\"wires\":[[\"6bc79592.92574c\"]]},{\"id\":\"a5bddaf0.4e9578\",\"type\":\"inject\",\"z\":\"c4dd07cf.84ae98\",\"name\":\"\",\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"x\":110,\"y\":220,\"wires\":[[\"82e3c67a.27b218\"]]},{\"id\":\"6bc79592.92574c\",\"type\":\"debug\",\"z\":\"c4dd07cf.84ae98\",\"name\":\"\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"x\":710,\"y\":220,\"wires\":[]}]\n\nThis will given an object of the following form:\n\n```\n{\n\t\"applications\": [{\n\t\t\t\"appId\": \"CC1AD845\",\n\t\t\t\"displayName\": \"Default Media Receiver\",\n\t\t\t\"iconUrl\": \"\",\n\t\t\t\"isIdleScreen\": false,\n\t\t\t\"launchedFromCloud\": false,\n\t\t\t\"namespaces\": [{\n\t\t\t\t\t\"name\": \"urn:x-cast:com.google.cast.cac\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.google.cast.broadcast\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.google.cast.media\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"sessionId\": \"8g547685-4ce7-4968-b656-8679b01f9a77\",\n\t\t\t\"statusText\": \"Default Media Receiver\",\n\t\t\t\"transportId\": \"8g547685-4ce7-4968-b656-8679b01f9a77\"\n\t\t}\n\t],\n\t\"userEq\": {\n\t\t\"high_shelf\": {\n\t\t\t\"frequency\": 4500,\n\t\t\t\"gain_db\": 0,\n\t\t\t\"quality\": 0.707\n\t\t},\n\t\t\"low_shelf\": {\n\t\t\t\"frequency\": 150,\n\t\t\t\"gain_db\": 0,\n\t\t\t\"quality\": 0.707\n\t\t},\n\t\t\"max_peaking_eqs\": 0,\n\t\t\"peaking_eqs\": []\n\t},\n\t\"volume\": {\n\t\t\"controlType\": \"master\",\n\t\t\"level\": 0.15000000596046448,\n\t\t\"muted\": false,\n\t\t\"stepInterval\": 0.019999999552965164\n\t}\n}\n```\n\nor if currently playing media\n\n```\n{\n\t\"applications\": [{\n\t\t\t\"appId\": \"12F05308\",\n\t\t\t\"displayName\": \"TuneIn Free\",\n\t\t\t\"iconUrl\": \"https://lh3.googleusercontent.com/HY9FJJF6gvT-JykObo1KvoNbewRoUJa2VjsE8TRgmBUmFFYGDI3FYJRGxGkj9gkMh_f3K-QSytav8G8\",\n\t\t\t\"isIdleScreen\": false,\n\t\t\t\"launchedFromCloud\": true,\n\t\t\t\"namespaces\": [{\n\t\t\t\t\t\"name\": \"urn:x-cast:com.google.cast.cac\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.init\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.initUrl\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.play\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.pause\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.stop\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.comm.addSender\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.comm.mediaLoaded\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.comm.playState\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.comm.tuneDataLoaded\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.comm.scrubberMovedMessage\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.comm.nowPlayingDataLoaded\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.tunein.cast.comm.error\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.google.cast.broadcast\"\n\t\t\t\t}, {\n\t\t\t\t\t\"name\": \"urn:x-cast:com.google.cast.media\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"sessionId\": \"1f8d64e1-fde4-42kb-xxc3-b77493ej54a6\",\n\t\t\t\"statusText\": \"Casting: Radio Dresden\",\n\t\t\t\"transportId\": \"1f8d64e1-fde4-42kb-xxc3-b77493ej54a6\"\n\t\t}\n\t],\n\t\"userEq\": {\n\t\t\"high_shelf\": {\n\t\t\t\"frequency\": 4500,\n\t\t\t\"gain_db\": 0,\n\t\t\t\"quality\": 0.707\n\t\t},\n\t\t\"low_shelf\": {\n\t\t\t\"frequency\": 150,\n\t\t\t\"gain_db\": 0,\n\t\t\t\"quality\": 0.707\n\t\t},\n\t\t\"max_peaking_eqs\": 0,\n\t\t\"peaking_eqs\": []\n\t},\n\t\"volume\": {\n\t\t\"controlType\": \"master\",\n\t\t\"level\": 0.15000000596046448,\n\t\t\"muted\": false,\n\t\t\"stepInterval\": 0.019999999552965164\n\t}\n}\n```\n\n## Implemented Nodes\n\n- Cast Node - Send media to chromecast or google home devices\n\n## How to use\n\nThe cast node has a couple of settings, which can be provided by the configuration or by the incoming message object.\n\nConfiguration possibilities:\u003cbr\u003e\n![configuration of the node](images/node-cast-properties.png?raw=true)\n\nOptions for the incoming message object:\n\n- **IP**, `msg.ip` or `msg.payload.ip` the IP address of the device to cast the media. Could also be defined in the configuration of the node.\n- **Port**, `msg.port` or `msg.payload.port` the port of the device (if not given default \u003ccode\u003e8009\u003c/code\u003e will be used).\n- **Media Url**, `msg.url` or `msg.payload.url` url to a media file which should be cast to the cast device. For a chromecast this could be a media or a video file. For a Google Home device without a display this could only a audio file.\n- **Media Type**, `msg.contentType` or `msg.payload.contentType` the content type (mime type) of the file in the url. This property is required if a url is given. Could also be defined in the configuration of the node.\n- **Image Url**, `msg.imageUrl` or `msg.payload.imageUrl` url to a image file which represents the artwork for the url which should be cast to the cast device. For a chromecast this should be an image file. For a Google Home device without a display this is irrelevant.\n- **Image Url**, `msg.imageUrl` or `msg.payload.imageUrl` url to a image file which represents the artwork for the url which should be cast to the cast device. For a chromecast this should be an image file. For a Google Home device without a display this is irrelevant.\n- **Title**, `msg.contentTitle` or `msg.payload.contentTitle` a text which should be send to the google tts engine as the title of the message. For TTS the `msg.topic` will be set as contentTitle if no `msg.contentTitle` or `msg.payload.contentTitle` are given. Otherwise the filename will be used.\n- **Language**, `msg.language` or `msg.payload.language` the language which should be used for converting the message to the media file.\n- **Volume**, `msg.volume` or `msg.payload.volume` the volume should be set.\n\n- Additional options (not configurable):\n  - `msg.status` is set to `true` the player status will be queried and send as output, No media will be played\n  - `msg.lowerVolumeLimit` or `msg.payload.lowerVolumeLimit` will set the volume to this value, if the current volume is below this value.\n  - `msg.upperVolumeLimit` or `msg.payload.upperVolumeLimit` will set the volume to this value, if the current volume is above this limit.\n  - `msg.muted` or `msg.payload.muted` the volume will be muted if set to false, otherwise the volume will be unmuted.\n  - `msg.seek` or `msg.payload.seek` will sets the current position in the stream.\n  - `msg.duration` or `msg.payload.duration` will sets the duration of the playing stream in seconds.\n  - `msg.urlList` or `msg.payload.urlList` could be set to a list of urls which should be played. This could be an array or a string with multiple urls separated by comma, semicolon, lineBreak or |.\n\nSo the config can be at 3 places. The config of the node, a property of the `msg.payload` or a property of the `msg` object. The information is loaded in that order (e.g. url):\n\n- _(1st)_ If the `msg.payload` is a object and contains a property `msg.payload.url` this setting will be used.\n  - _(2nd)_ otherwise if the `msg` object contains the property `msg.url` this setting will be used.\n    - _(3rd)_ otherwise if in the configuration the **Media Url** property is set this url will be used.\n\n### Media Types\n\nExample of Common Video File MIME Types are:\n\n| Video Type     | Extension | MIME Type             |\n| -------------- | --------- | --------------------- |\n| Flash          | .flv      | video/x-flv           |\n| MPEG-4         | .mp4      | video/mp4             |\n| iPhone Index   | .m3u8     | application/x-mpegURL |\n| iPhone Segment | .ts       | video/MP2T            |\n| 3GP Mobile     | .3gp      | video/3gpp            |\n| QuickTime      | .mov      | video/quicktime       |\n| A/V Interleave | .avi      | video/x-msvideo       |\n| Windows Media  | .wmv      | video/x-ms-wmv        |\n\nCommon Audio File MIME Types are:\n\n| File Extension | MIME Type              |\n| -------------- | ---------------------- |\n| au             | audio/basic            |\n| snd            | audio/basic            |\n| Linear PCM     | audio/L24              |\n| mid            | audio/mid              |\n| rmi            | audio/mid              |\n| mp3            | audio/mp3              |\n| mp4 audio      | audio/mp4              |\n| aif            | audio/x-aiff           |\n| aifc           | audio/x-aiff           |\n| aiff           | audio/x-aiff           |\n| m3u            | audio/x-mpegurl        |\n| ra             | audio/vnd.rn-realaudio |\n| ram            | audio/vnd.rn-realaudio |\n| Ogg Vorbis     | audio/ogg              |\n| Vorbis         | audio/vorbis           |\n| wav            | audio/vnd.wav          |\n\nPlease note that it does not mean that these types are also supported by the respective cast device. For the suported formats, please have a look at the [documentation on Google](https://developers.google.com/cast/docs/media).\n\n## Advanced\n\nWhen no **Media Url** or **Message** is setup, the player will stop playing the current media and the status will be queried and send as output. If only the status should be get without interrupting the current playing media `msg.status` needs to be set to `true`.\n\nMore advanced control is possible by using `msg.payload.media`. This must be an [object](https://developers.google.com/cast/docs/reference/messages#MediaInformation) with the following properties:\n\n| Name        | Type   | Description                                                                                                                                                                                                             |\n| ----------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| contentId   | string | Url of the media.\u003cbr\u003eIf the url is defined in configuration or by `msg.payload.url` or `msg.url` this property will be set or overwritten.                                                                              |\n| streamType  | string | Describes the type of media artifact as one of the following:\u003cbr\u003e `NONE`, `BUFFERED` or `LIVE`.\u003cbr\u003eIf not defined, `BUFFERED` will be used.                                                                             |\n| contentType | string | MIME content type of the media being played.\u003cbr\u003eIf defined in configuration or by `msg.contentType` or `msg.payload.contentType` this property will be set or overwritten.\u003cbr\u003eIf not defined, `audio/mp3` will be used. |\n| _metadata_  | object | [metadata](https://developers.google.com/cast/docs/reference/messages#MediaInformation) which should be used.                                                                                                           |\n| _duration_  | double | Duration of the currently playing stream in seconds.\u003cbr\u003eIf defined as `msg.duration` or `msg.payload.duration` this property will be set or overwritten.                                                                |\n\n## Tip\n\nTo differentiate different receivers, it may be helpful to choose different icons.\u003cbr\u003e\n![node appearance](images/appearance2.png?raw=true)\u003cbr\u003e\nThis is possible by choosing another icon in the Node Settings:\u003cbr\u003e\n![node settings](images/changing_node_icon.png?raw=true)\u003cbr\u003e\nFor this purpose, the node already comes with a selection of useful icons:\u003cbr\u003e\n![useful icons](images/node-icons.png?raw=true)\n\n## Examples\n\n### Play local files\n\nThe node sends only the address of a media file to the cast device. So the cast device needs access to that media file. For normal local files this is not possible. As a solution to this you can serve an mp3 file directly from Node-Red using an HTTP node:\n\n![example3](images/example3.png?raw=true)\n\n\t[{\"id\":\"e9028c5b.27f29\",\"type\":\"comment\",\"z\":\"9e5f07b4.280818\",\"name\":\"Doorbell routine\",\"info\":\"\",\"x\":120,\"y\":880,\"wires\":[]},{\"id\":\"8d5390b3.5e3e8\",\"type\":\"link out\",\"z\":\"9e5f07b4.280818\",\"name\":\"\",\"links\":[\"c873cb6.6216e38\"],\"x\":395,\"y\":1080,\"wires\":[],\"icon\":\"node-red-contrib-huemagic/hue-group.png\"},{\"id\":\"4b9bb17b.5c119\",\"type\":\"http in\",\"z\":\"9e5f07b4.280818\",\"name\":\"\",\"url\":\"/doorbell\",\"method\":\"get\",\"upload\":false,\"swaggerDoc\":\"\",\"x\":110,\"y\":940,\"wires\":[[\"3283748e.b1669c\"]]},{\"id\":\"156d5629.1e369a\",\"type\":\"http response\",\"z\":\"9e5f07b4.280818\",\"name\":\"\",\"statusCode\":\"\",\"headers\":{\"content-type\":\"audio/mpeg\"},\"x\":410,\"y\":940,\"wires\":[]},{\"id\":\"3283748e.b1669c\",\"type\":\"file in\",\"z\":\"9e5f07b4.280818\",\"name\":\"doorbell.mp3\",\"filename\":\"/home/pi/.node-red/doorbell.mp3\",\"format\":\"\",\"chunk\":false,\"sendError\":false,\"x\":270,\"y\":940,\"wires\":[[\"156d5629.1e369a\"]]},{\"id\":\"821eb341.0478b\",\"type\":\"link out\",\"z\":\"9e5f07b4.280818\",\"name\":\"\",\"links\":[\"ac60ad8.0709d5\"],\"x\":395,\"y\":1120,\"wires\":[],\"icon\":\"node-red-contrib-telegrambot-home/telegram.png\"},{\"id\":\"359f33cd.ed919c\",\"type\":\"ButtonPressed\",\"z\":\"9e5f07b4.280818\",\"name\":\"Dash Button\",\"mac\":\"${DASHBUTTONMAC}\",\"x\":110,\"y\":1060,\"wires\":[[\"5b101da.ce5abe4\",\"59398cb6.bb6134\",\"56f6951f.34631c\",\"ba9ea684.c25988\"]]},{\"id\":\"5b101da.ce5abe4\",\"type\":\"trigger\",\"z\":\"9e5f07b4.280818\",\"op1\":\"{\\\"ip\\\":\\\"${CASTIP}\\\",\\\"url\\\":\\\"http://${NODEREDIP}:1880/doorbell\\\",\\\"contentType\\\":\\\"audio/mp3\\\",\\\"volume\\\":50}\",\"op2\":\"{\\\"ip\\\":\\\"${CASTIP}\\\",\\\"volume\\\":50}\",\"op1type\":\"json\",\"op2type\":\"json\",\"duration\":\"13\",\"extend\":false,\"units\":\"s\",\"reset\":\"\",\"bytopic\":\"all\",\"name\":\"TTS + reset volume\",\"x\":330,\"y\":1000,\"wires\":[[\"f739fc31.14339\"]]},{\"id\":\"59398cb6.bb6134\",\"type\":\"trigger\",\"z\":\"9e5f07b4.280818\",\"op1\":\"{\\\"ip\\\":\\\"${CASTIP}\\\",\\\"url\\\":\\\"http://${NODEREDIP}:1880/doorbell\\\",\\\"contentType\\\":\\\"audio/mp3\\\",\\\"volume\\\":50}\",\"op2\":\"{\\\"ip\\\":\\\"${CASTIP}\\\",\\\"volume\\\":30}\",\"op1type\":\"json\",\"op2type\":\"json\",\"duration\":\"13\",\"extend\":false,\"units\":\"s\",\"reset\":\"\",\"bytopic\":\"all\",\"name\":\"TTS + reset volume\",\"x\":330,\"y\":1040,\"wires\":[[\"61966b21.195fb4\"]]},{\"id\":\"56f6951f.34631c\",\"type\":\"change\",\"z\":\"9e5f07b4.280818\",\"name\":\"Hue alert\",\"rules\":[{\"t\":\"set\",\"p\":\"payload\",\"pt\":\"msg\",\"to\":\"{\\\"alert\\\":2,\\\"hex\\\":\\\"ffca7b\\\"}\",\"tot\":\"json\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":300,\"y\":1080,\"wires\":[[\"8d5390b3.5e3e8\"]]},{\"id\":\"ba9ea684.c25988\",\"type\":\"change\",\"z\":\"9e5f07b4.280818\",\"name\":\"Message\",\"rules\":[{\"t\":\"set\",\"p\":\"payload\",\"pt\":\"msg\",\"to\":\"Quelqu'un sonne a la porte !\",\"tot\":\"str\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":300,\"y\":1120,\"wires\":[[\"821eb341.0478b\"]]},{\"id\":\"f739fc31.14339\",\"type\":\"cast-to-client\",\"z\":\"9e5f07b4.280818\",\"name\":\"\",\"url\":\"\",\"contentType\":\"\",\"message\":\"\",\"language\":\"fr\",\"ip\":\"\",\"port\":\"\",\"volume\":\"\",\"x\":490,\"y\":1000,\"wires\":[[]]},{\"id\":\"61966b21.195fb4\",\"type\":\"cast-to-client\",\"z\":\"9e5f07b4.280818\",\"name\":\"\",\"url\":\"\",\"contentType\":\"\",\"message\":\"\",\"language\":\"fr\",\"ip\":\"\",\"port\":\"\",\"volume\":\"\",\"x\":490,\"y\":1040,\"wires\":[[]]}]\n\n### changing ip, url, contentType, streamType\n\n\t[{\"id\":\"c4d9d977.484068\",\"type\":\"cast-to-client\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"url\":\"\",\"contentType\":\"\",\"message\":\"\",\"language\":\"en\",\"ip\":\"localhost\",\"port\":\"\",\"volume\":\"\",\"x\":570,\"y\":600,\"wires\":[[\"98ac674c.cf52d8\"]]},{\"id\":\"86798168.185b7\",\"type\":\"inject\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"x\":140,\"y\":600,\"wires\":[[\"b8e606ea.49f628\"]]},{\"id\":\"b8e606ea.49f628\",\"type\":\"change\",\"z\":\"d900d7d9.c4c498\",\"name\":\"\",\"rules\":[{\"t\":\"set\",\"p\":\"ip\",\"pt\":\"msg\",\"to\":\"192.168.1.125\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"url\",\"pt\":\"msg\",\"to\":\"http://does niot exists\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"contentType\",\"pt\":\"msg\",\"to\":\"audio/mp3\",\"tot\":\"str\"},{\"t\":\"set\",\"p\":\"streamType\",\"pt\":\"msg\",\"to\":\"BUFFERED\",\"tot\":\"str\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":360,\"y\":600,\"wires\":[[\"c4d9d977.484068\"]]},{\"id\":\"98ac674c.cf52d8\",\"type\":\"debug\",\"z\":\"d900d7d9.c4c498\",\"name\":\"test3\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"payload\",\"x\":750,\"y\":600,\"wires\":[]}]\n\n\n\n\n## Bugs and Feedback\n\nFor bugs, questions and discussions please use the\n[GitHub Issues](https://github.com/Hypnos3/node-red-contrib-cast/issues).\n\n### :moneybag: Donations [![Donate](https://img.shields.io/badge/donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=XDPSATTXBXHCL)\n\nEven for those that don't have the technical knowhow to help developing on there are ways to support development. So if you want to donate some money please feel free to send money via [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick\u0026hosted_button_id=XDPSATTXBXHCL).\n\n## LICENSE\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n\n## Other\n\nthis node is published also here:\n  - [NPM package](https://www.npmjs.com/package/node-red-contrib-cast)\n  - [Node-Red](https://flows.nodered.org/node/node-red-contrib-cast)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHypnos3%2Fnode-red-contrib-cast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FHypnos3%2Fnode-red-contrib-cast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FHypnos3%2Fnode-red-contrib-cast/lists"}