.. figure:: https://raw.githubusercontent.com/keredson/gnomecast/master/screenshot.png
   :alt: alt text

   alt text

Gnomecast |logo|
================

This is a native Linux GUI for casting local files to Chromecast
devices. It supports:

-  Both audio and video files (anything ``ffmpeg`` can read)
-  Realtime transcoding (only when needed)
-  Subtitles (embedded and external SRT files)
-  Fast scrubbing (waiting 20s for buffering to skip 30s ahead is
   wrong!)
-  4K videos on the Chromecast Ultra!

Install
-------

Please run:

::

   $ sudo pip3 install gnomecast

If installing in a ``mkvirtualenv`` built virtual environment, make sure
you include the ``--system-site-packages`` parameter to get the GTK
bindings.

Run
---

After installing, log out and log back in. It will be in your launcher:

.. figure:: https://raw.githubusercontent.com/keredson/gnomecast/master/launcher.png
   :alt: alt text

   alt text

You can also run it from the command line:

::

   $ gnomecast

If you ran ``pip3`` without ``sudo`` when installing, and
``$ gnomecast`` doesn’t work due to your local path setup, you can also
run it as:

::

   $ python3 -m gnomecast

*Please report bugs, including video files that don’t work for you!*

Thanks To…
----------

-  https://github.com/balloob/pychromecast
-  https://github.com/pbs/pycaption
-  https://www.ffmpeg.org/

And everyone who made this project hit `HN’s front
page <https://news.ycombinator.com/item?id=16386173>`__ and #2 on
GitHub’s trending list! That’s so awesome!!!

.. figure:: https://raw.githubusercontent.com/keredson/gnomecast/master/trending.png
   :alt: alt text

   alt text

Transcoding
-----------

Chromecasts only support a handful of media formats. See:
https://developers.google.com/cast/docs/media

So some amount of transcoding is necessary if your video files don’t
conform. But we’re smart about it. If you have an ``.mkv`` file with
``h264`` video and ``AAC`` audio, we use ``ffmpeg`` to simply rewrite
the container (to ``.mp4``) without touching the underlying streams,
which my XPS 13 can at around 100x realtime (it’s fully IO bound).

Now if you have that same ``.mkv`` file with and ``A3C`` audio stream
(which Chromecast doesn’t support) we’ll rewrite the container, copy the
``h264`` stream as is and only transcode the audio (at about 20x).

If neither your file’s audio or video streams are supported, then it’ll
do a full transcode (at around 5x).

We write the entire transcoded file to your ``/tmp`` directory in order
to make scrubbing fast and glitch-free, a good trade-off IMO. Hopefully
you’re not running your drive at less than one video’s worth of free
space!

Subtitles
---------

Chromecast only supports a handful of subtitle formats, ``.srt`` not
included. But it does support
`WebVTT <https://w3c.github.io/webvtt/>`__. So we extract whatever
subtitles are in your video, convert them to WebVTT, and then reattach
them to the video through Chomecast’s API.

.. |logo| image:: https://github.com/keredson/gnomecast/raw/master/icons/gnomecast_16.png

