Show HN: Control Chromecasts from Linux

(github.com)

222 points | by this_machine 1315 days ago

14 comments

  • balloob 1314 days ago
    Author of pychromecast here, the underlying library that this project uses to control the Chromecast.

    I wrote this lib initially for use in Home Assistant, https://www.home-assistant.io

    For Home Assistant I made a rule that all device drivers are stand-alone Home Assistant agnostic Python packages. That way more projects can use it.

    Glad to see that strategy is working out and it powering projects like this

    • kingosticks 1314 days ago
      Thank you for pychromecast, balloob.

      I know there's no real requirement but I wish projects like this would give attribution where it's due. This project benefits hugely from pychromecast but there's nothing in the readme mentioning that. Just seems a bit off.

    • 1vuio0pswjnm7 1314 days ago
      Isn't there a workaround to get Chromecast to accept user changes in DNS settings. Maybe use DHCP on the user's router to suggest user-chosen DNS servers. I have forgotten. The big show stopper with Chromecast is that Google makes it difficult for the user to set their own DNS servers. As I recall, with the early Chromecast models, users could replace the Google OS with a modified one that let users choose their own DNS servers. One technique used a Teensy. Subsequent Google updates I believe closed off that option.
    • Inversechi 1314 days ago
      And thank you for giving us not only pychromecast but home-assistant :)
    • this_machine 1313 days ago
      Thanks for your work on pychromecast, I've looked and it's the best supported library for working with Chromecasts out there. It was also pleasant to integrate into this project.

      Does the pychromecast project use semantic versioning? I've had to pin the library to a specific version after running into an API breaking change on what would be a minor or patch update to 7.X if the project used SemVer.

    • atomi 1314 days ago
      It would be incredible if there was a way to use mpsyt to watch Youtube videos with your library.
      • msla 1314 days ago
        It's possible if you hook something running Kodi up to your TV.

        Here's some example code I wrote, in the form of a few ZSH shell scripts:

        https://github.com/chbarts/kodi-command-line

        The logic should port nicely to other languages. In particular, it shows how to do things like playing a YouTube video using either the URL or just the hash, plus, of course, a way to play videos on the computer you're running the commands from.

    • andrewshadura 1314 days ago
      Thank you for the library, but I wish you paid more attention to the backwards compatibility and didn't break it that often. The unannounced changes recently broke mkchromecast twice in different ways.
      • andrewshadura 1314 days ago
        By the way, even the pychromecast examples broke with those updates. Very frustrating to see as a 1) user of mkchromecast, 2) user of pychromecast, 3) maintainer of both in Debian
    • qwertygnu 1314 days ago
      It's always awesome to see early, potentially unfruitful decisions workout in a project.
  • liability 1314 days ago
    If you don't want a Google device on your LAN and are willing to put in a little bit more work for that, I've found that remotely controlling an instance of mpv over the JSON IPC interface works well for me. I can send it URLs from the web or paths to local files. My client for this isn't currently public, but it's a rather easy interface that some of you may find it easy enough to integrate into your other systems.

    (Note that it only listens on a Unix socket. With socat you can redirect that to a TCP socket though, preferably listening on a wireguard interface to keep the rest of your LAN from accessing it, since there's otherwise no security.)

    Definitely not for everybody, but perhaps suitable for some.

    https://mpv.io/manual/master/#json-ipc

    • comboy 1314 days ago
      If you haven't, you should check mpd (music player daemon). Lots of clients, works very well.
    • miccah 1314 days ago
      This is my preference as well! I even wrote an Android client app / Python server to control it from my phone.

      https://github.com/mcastorina/mpv-remote-app

      • MayeulC 1314 days ago
        This looks useful and to the point. Would you consider submitting it to f-droid?
    • angrais 1314 days ago
      Maybe it's late and I am misunderstanding ... Why would one not want a Google device on their LAN?

      Isn't a Chromecast very different than controlling locally stored media files, i.e. you can stream YouTube, Netflix, Spotify, mirror your devices (laptop), etc on Chromecast but not your solution?

      • liability 1314 days ago
        mpv plays youtube links and many other websites (although not netflix or spotify to my knowledge) using the excellent youtube-dl. For my purposes it is more than sufficient, but as I said it won't be for everybody.

        As to why I don't want google devices on my LAN, I'm sure you could already guess that the answer is the usual privacy/political concerns, which I'll not bore you with since you obviously don't care. There are however some practical benefits to my arrangement, particularly being able to play media served up by NFS (DLNA never gave me anything but grief and unreliability.) Furthermore youtube-dl supports a very long tail of sites that Chromecast doesn't (at least not without the jank of screen mirroring, which AFAIK only works for as long as the laptop being mirrored is turned on.)

  • gala8y 1314 days ago
    OT, but i had an idea yesterday... will explain in UX language: would it be possible to send video to chromecast-like device and 'leave sound on mobile device' to be able to listen on bluetooth connected headphones while watching on big screen?
    • Falling3 1314 days ago
      I've thought about the same thing, but I don't think it's feasible because you essentially need to play the video in both places and ensure it stays in sync. The easy solution is to hook up a Bluetooth transmitted to your TV.
      • gala8y 1312 days ago
        I know, but it _could_ use one stream and send audio to mobile via LAN. Syncing would be an issue, though. Overengineering at its best. ;)
    • swebs 1314 days ago
      That would be cool. Roku boxes actually come with a headphone jack in the remote so you can do just that (but not through bluetooth).
  • ebg13 1315 days ago
    I can't tell from this project's readme how to actually play things. It has an instruction for connecting to your chromecast...ok, and then what?

    In the past I've used https://github.com/keredson/gnomecast which is a standalone simple media player that transcodes if needed and streams to my Chromecast. Thoughts on what this provides that's better?

    • this_machine 1313 days ago
      While you have chromecast_mpris running, you can use an MPRIS client to issue the OpenUri method[1]. Here's an example:

          $ export URL="http://ccmixter.org/content/gmz/gmz_-_Parametaphoriquement.mp3"
          $ playerctl -p My_Chromecast open "$URL"
      
      This will cast a song to the Chromecast named "My_Chromecast". I forgot that OpenUri was implemented in the project because I typically cast from other devices and programs, but I'll include it in the README.

      > Thoughts on what this provides that's better?

      People tend to use catt or castnow to cast from the command-line. I wrote about using VLC to cast to the Chromecast[2], but I wouldn't recommend it unless you're watching something that you need VLC for.

      [1] https://specifications.freedesktop.org/mpris-spec/2.2/Player...

      [2] https://alexdelorenzo.dev/linux/2020/03/14/pipes

    • emayljames 1314 days ago
      If on Android, bubbleupnp. It is a solid and well maintained app.
  • axaxs 1315 days ago
    Thanks for this, I can't wait to test it out.

    Are there other ways to control chromecasts from Linux? I used to be able to cast straight from Chromium, but that hasn't worked for me in at least a couple years.

    • ce4 1315 days ago
      VLC has a native client afaik.

      Edit: included since v3.0

      https://www.videolan.org/developers/vlc-branch/NEWS

      • londons_explore 1314 days ago
        The VLC client is "barebones" - even simple functionality like adjusting the volume is missing. If the network connection drops, the chromecast stops playing (regular chromecast would continue). There is no support for subtitles, alternate audio/video tracks, audio effects, video playback speed, or pretty much anything else.

        Seeking is supported tho, as are audio-only files.

        • kelnos 1314 days ago
          > If the network connection drops, the chromecast stops playing (regular chromecast would continue)

          How would you expect the video bits to get from the machine running VLC to the chromecast if the network drops? Not sure what you mean by "regular chromecast", but if the network connection between the chromecast and the video source is lost, you lose playback. That's true if you're watching YouTube videos or Netflix, or if you're using any other app to cast something from your local network.

          • mholt 1314 days ago
            Only if it's lost for longer than was buffered. Most decent streaming clients -- even YouTube -- will buffer ahead and keep playing while attempting to restore connectivity.

            Speaking of which, the casting with VLC also has major buffering problems. Even casting a low-def video directly from an SSD to a Chromecast Ultra (over ethernet!) it will buffer for about 1-2 minutes for every 5 seconds of playback.

          • londons_explore 1314 days ago
            Most services (like YouTube, Netflix, etc.) transfer data direct from their servers to your Chromecast, without your phone or laptop in the loop for anything more than a remote control. It means you can start Netflix running for the kids from your phone and then go out to run an errand and it will keep playing.

            VLC could do that for network sources. Even for a local file source, it could copy the whole file over - the Chromecast has a decent amount of RAM.

        • this_machine 1313 days ago
          I opened a bug report[1] regarding this issue a few days ago if you'd like to leave a comment.

          [1] https://trac.videolan.org/vlc/ticket/25116

      • axaxs 1315 days ago
        Good to know, thanks.

        Usually I'm interested in either casting a browser window, or even the whole screen usually, which I've been coming up short on.

        • ce4 1315 days ago
          VLC re encodes content on the fly and sends it to the chromecast, even the android app supports it (albeit making your phone hot). Not sure about your two requirements though, maybe so. else has a tip here.
          • Thaxll 1315 days ago
            Only if the content can't be played on the Chromecast but most "vacation movies" can be play on the Chromecast.
        • londons_explore 1314 days ago
          Casting a browser or whole screen can be done with Chrome/Chromium on Linux. Whole screen doesn't work with wayland. Redirecting system audio doesn't work either.

          If you redirect a tab which is mostly a single video file, it is smart enough to do the video decoding directly on the chromecast, so you get much better quality/framerate.

          • mijoharas 1314 days ago
            I was interested to find out that the youtube app on an amazon fire stick is supported as a chromecast target now.

            It doesn't support casting a browser tab or a desktop though (the latter isn't surprising as I'm under wayland which the parent says doesn't work, but I'd guess a browser tab should work? would be interested in other peoples experiences of this).

      • ebg13 1314 days ago
        I was never able to get VLC to communicate with my Chromecast but gnomecast worked, so ymmv.
    • facesonflags 1314 days ago
    • psanford 1314 days ago
      You can still control chromecasts from Chrome on linux.
  • StavrosK 1314 days ago
    This is nice, I've been using catt mapped to the media keys via the native window manager shortcuts, but this seems easier to set up.
    • this_machine 1313 days ago
      I do something similar with chromecast_mpris. I have my media keys mapped to Plasma's Media Controller, which uses MPRIS in the background. Works well for me, and you don't have to wait for catt to launch and find your Chromecast each time.
  • markbnj 1314 days ago
    Shameless threadjack: does anyone know a way to cast _to_ a linux or windows desktop? We use chromecast on all our entertainment video monitors, but sometimes I would like to hang on the couch in my office and cast a video to my desktop monitor.
    • pmontra 1314 days ago
      Maybe scrcpy is enough for you.

      https://github.com/Genymobile/scrcpy

      If opening a browser tab is all you need any tab syncing app / service will do. I use kdeconnect / gsconnect so I don't have to rely on a 3rd party service, Google and Mozilla included.

      • markbnj 1313 days ago
        Ah this is a good idea, I hadn't thought of approaching it that way. Having basic pause/back/forward media controls would also be nice, but they should work if the browser location gets updated right?
    • gibolt 1314 days ago
      Could add a Chromecast on one of the Hdmi ports of the monitor. That's what I do
      • markbnj 1313 days ago
        Yeah I thought about that a few times, but I would have to change inputs, so it wasn't really the experience I had in mind.
    • _ZeD_ 1314 days ago
      Miraclecast
    • ekianjo 1314 days ago
      Jellyfin mpv shim does this
      • markbnj 1313 days ago
        Jellyfin seems like it might be just the thing, thanks for the tip!
    • throwaways885 1314 days ago
      Discord screenshare :)
    • mav3rick 1314 days ago
      Open the website ?
      • markbnj 1313 days ago
        What I would like to do is flip youtube videos or whatever on my phone and cast to the monitor, which is 6 feet from the couch... an impassable barrier as I'm sure you'll agree.
  • mijoharas 1314 days ago
    sorry to somewhat hijack this thread, but does anyone know a way to stream from linux to a miracast target?

    I have a fire stick that I believe supports miracast, and periodically check if there is linux software that will allow me to stream as a source.

    Last time I checked miraclecast[0] seemed to be somewhat broken. Has anyone had any luck?

    [0] https://github.com/albfan/miraclecast

  • baby-yoda 1315 days ago
    does chromecast still require WAN access to operate?
    • m-p-3 1314 days ago
      I believe so, and it's less than useful on network with a captive portals like hotel rooms.

      At least the upcoming Chromecast with Google TV comes with a remote, so you should be able to interact with the captive portal and use it that way.

      • fragmede 1314 days ago
        While the chromecast's inability to work with captive portals is it's own problem, they make tiny wifi routers, half as tall and twice as thick as a smartphone, and they're cheap. If you find yourself facing captive portals more than once, I'd recommend buying one so you can use your Chromecast in hotel rooms, among other use cases.
        • m-p-3 1314 days ago
          I already have one from TP-Link, but having the new Chromecast would allow me to shrink down on hardware even more.
        • Rebelgecko 1314 days ago
          Most smartphones are also wifi routers
    • kelnos 1314 days ago
      It shouldn't. Obviously if you're casting from a WAN source (like YouTube or Netflix), it needs WAN access, but if you're casting from a source on your local network, it should work without the WAN.
  • jowsie 1315 days ago
    Does this also allow you to cast arbitrary media to the Chromecast? I couldn't tell from the readme.
    • input_sh 1315 days ago
      I've been using catt (https://github.com/skorokithakis/catt) for years for that purpose. Basically:

          pip3 install catt
      
      And then:

          catt cast <any image/song/video/URL supported by youtube-dl>
      • SyncOnGreen 1314 days ago
        https://airflow.app/ is worth mentioning - paid software (sadly Windows/macOS only) but works with everything you throw at it, transcodes unsupported codecs seamlessly and has great UI with remote control via an app.
    • emayljames 1314 days ago
      bubbleupnp is the most customizable and reliable app I have found for streaming/casting.
    • geitir 1314 days ago
      Plex does
  • 29athrowaway 1314 days ago
    An unpopular choice for general purpose streaming: Steam Link.

    You can install the Steam Link on a smart TV and your computer (including Linux), switch the Steam window and stream whatever you want to stream.

  • zerop 1314 days ago
    Any way to cast zoom calls from my android zoom app to TV via Chromecast ?
    • m-p-3 1314 days ago
      You can cast your device's screen, but you'll still have to rely on the device's camera and mic.

      You'll probably want to avoid outputting the sound on the TV or you'll get a feedback loop.

      And there's going to be a slight delay, which might be annoying with a realtime conversation.

      So it might not be a great idea from the start.

      • londons_explore 1314 days ago
        You'll also end up with 15 fps, high CPU usage, and random hangs... It works, but isn't really usable...
    • chris_engel 1314 days ago
      Well, with the google home app, you can send your whole screen to a chromecast, so whatever you are doing on your phone will be visible on your TV.
  • hansjorg 1314 days ago
    Title says 'from Linux', but the README says 'Linux / *BSD / macOS' under 'Requirements'.

    How would this work on macOS?

    • this_machine 1313 days ago
      > How would this work on macOS?

      Theoretically it should work if you're able to get D-Bus working on macOS. D-Bus is usually a Linux thing, but it's been ported to other platforms. macOS isn't included in the title because most macOS users don't have D-Bus installed.

      I included instructions here[1] with URLs to the macOS versions of D-Bus and PyGObject. I'd be interested in whether you're able get it working.

      [1] https://github.com/alexdelorenzo/chromecast_mpris#requiremen...

    • hugg 1314 days ago
      where it says that, follow the link
  • ariberappss 1314 days ago
    eeoer