Kira's Web-Treehouse for Plants 🌱

& Other Wayward Beings

📺 Simulcast 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 actually. :)

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 unfortunate is that potato.land doesn't seem to be open source. This is a big ol bummer.

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.

Sharing Copies

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.
  4. 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.

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: - -i film.mp4: use the movie file as an (i)nput. - -vf subtitles=film.srt: this is the subtitles file to use in this video filter (vf). - -acodec copy: copy the original audio, since we aren't modifying it. - -vcodec libx264: we can't copy the original video, since we're modifying it to include subtitles. I use x264 here, but you can specify whatever codec you'd like. The encoding may go faster if you choose the same codec as the source media. - out.mp4: the media file to output.

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: - a phone call. - some people like Zoom. - a little-known program called mumble. It's open source and audio-only. There are clients for desktop and mobile. There are public servers (of varying quality & maturity), or someone in the group can run their own if they have access to a server. - potato.land has a built-in voice feature, but I don't know how good it is.

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!