Simul-casting with Friends 📺

A social event made more common in pandemic times has been The Simulcast: watching a TV show or movie with friends over the internet, who are also social distancing.

I'd watch my partner set it up, which would involve both parties calling each other on the phone, loading up Netflix, and orally confirming timestamps before announcing a "3, 2, 1, play!" countdown. It was kind of fun, but it was hard to keep in sync if somebody wanted to e.g. take a bathroom break. And if one person is off by more than 1 or 2 seconds, it's easy for someone to react to something that hasn't happened yet for the other party.

Here is what I've been using lately instead!

Potato.Land

Last summer me and the rest of the cabal team received a grant from Mozilla to implement a subjective moderation system. One of the other participants in the grant program produced a really nice little web app called potato.land. It's a simulcasting program!

You can check it out for yourself if you'd like. You specify the media (HTTP URL or local file), people can join your "couch", and the playback is synchronized automatically. It also supports YouTube URLs and a few other popular video websites. What I really like about it is that you don't need to make an account to use it.

What's really unfortunate is that potato.land doesn't seem to be open source.

Acquiring Media

I like using bittorrent to acquire media. Only legally and copyright-free media, of course. Of course.

I particularly like webtorrent-cli.

To install it, you'll need to first install NodeJS. Then, on the command line, run npm install -g webtorrent-cli. You might need administrator/sudo privileges, depending on your configuration.

From here, you can use webtorrent-cli to download torrents from a magnet link like so:

webtorrent 'magnet:?xt=urn:btih:132313E...'

Another torrent program I like is rtorrent, which gives finer control over torrents with many episodes/files, letting you selectively download a subset of files rather than the whole thing at once.

Sharing Media

potato.land has an upload-local-media option, but it requires that every participant has a copy of that media file locally.

Via a Server

If you have a server or VPS (Virtual Private Server, like Linode), then it's possible for you to upload your media file to your server and host it over HTTP, where you can then plug that URL into potato.land, and all participants will share it automatically, without needing to do any file transfers.

Via IPFS

If nobody in your group has a server, an alternative you could try is IPFS, a peer-to-peer file system program. Only the person with the media file to share needs to install it.

Once's installed, you can share the media file like so:

  1. Run ipfs add $MEDIA_FILE, which adds it to your local IPFS repository. Note the file hash that it prints out.
  2. Run ipfs daemon, which makes your local IPFS repository accessible by others, given they know the unique hash of the file.
  3. Visit https://ipfs.io/ipfs/$HASH, where $HASH is the file hash printed out in step 1. This is a public IPFS-to-HTTP gateway. (This bridges the IPFS network and the web, which will make it easier to share your media without needing a server of your own, or using an annoying ad-ridden file sharing service.) The page may take a while to load -- the ipfs.io server is downloading the media file from your local machine.

Once you can confirm it loads (it'll probably start playing the media file in the browser), you can plug this URL into potato.land as the media URL! Now everyone can watch together.

NOTE: Depending on your router's configuration, this may not work. I've noticed that some routers have NATs (Network Address Translation) systems that make peer-to-peer sharing almost impossible. If the media never seems to load on ipfs.io, this might be what's happening to you.

Preparing Media

Sometimes I want to share films that aren't in my native language (English). I've noticed that the browser media player doesn't always support subtitles well.

One work-around for this is to bake the subtitles right into the media file, as in, making the subtitles part of the actual video data.

ffmpeg (avconv on some systems) is perfect for this -- it's like a swiss-army knife for media processing.

Here is the command to run: ffmpeg -i film.mp4 -vf subtitles=film.srt -acodec copy -vcodec libx264 out.mp4

Here's what we're telling ffmpeg:

Yay! Now your media is ready to share.

Real-Time Voice Communication

I like to have an audio line open with my friends while we watch, in case we need to communicate about bio-breaks or share feelings about something that happened in the movie.

There are many options for this:

Conclusion

Honestly I'm kind of disappointed about the options for doing this, but it's at least possible without needing to use much annoying proprietary technology. I've used these tools several times and it's been much less stressful than coordinating over e.g. Netflix or some other proprietary streaming service.

I think there is room for improvement, especially using peer-to-peer technologies to facilitate group media streaming & signalling for playback, and also for group voice chat.

And, of course, nothing beats actually being in the room with your friends for a good old fashioned movie night. :)

Happy viewing!

Contact

Write me feedback, corrections or comments at kira@eight45.net!