Recipe for livestreaming over Tor
ファイルへ移動
n9k bad268f52d don't send start time if offline 2021-04-12 12:07:58 +00:00
static don't zero-pad hours in timer 2021-04-11 18:54:34 +00:00
templates actually update hours in css timer 2021-04-11 18:52:38 +00:00
LICENSE Add LICENSE 2021-04-09 17:21:30 +00:00
README.md Update README.md 2021-04-12 09:39:39 +00:00
app.py don't send start time if offline 2021-04-12 12:07:58 +00:00
colour.py Upload New File 2021-04-09 17:27:05 +00:00
concatenate.py add should_close_connection hook function 2021-04-12 12:00:02 +00:00
demo.png Upload New File 2021-04-10 06:53:43 +00:00
icon.png Upload New File 2021-04-09 17:27:46 +00:00
stream.sh create pidfile and explain things more 2021-04-12 09:36:52 +00:00
title.txt Add new file 2021-04-09 17:49:12 +00:00

README.md

onion-livestreaming

Recipe for livestreaming over the Tor network

Screenshot of the livestream web interface

This was originally made for fun over the course of five days and hence sloppiness may pervade (especially in the CSS).

Dependencies

Features

  • Twitch-looking web interface (mobile friendly)
  • Change stream title as you're streaming
  • Viewer count
  • Stream on/off indicator (and with JavaScript, playback error messages with prompts to refresh)
  • Chat with custom names & tripcodes
  • Ban chatters / hide messages
  • Flood detection / liberal captcha
  • Shows stream uptime
  • Works without JavaScript

Issues

  • CSS is spaghetti (e.g. the PureCSS framework is used sometimes when it might not need be)
  • Fonts are hard-coded and you might not have them
  • AFAIK the FFmpeg command in stream.sh only works on Linux, change it for other OSs
  • Slow: stream delay of at least 40 seconds. Hopefully this will decrease when congestion control gets into Tor: https://youtu.be/watch?v=zQDbfHSjbnI
  • Most of the code is in app.py; it should be split into several files with more narrow purposes.
  • Doesn't use low-latency HLS

How it works

  • FFmpeg creates an HLS stream
  • Flask creates a website interface for the stream
  • tor makes the website accessible at an onion address

Explanation of the FFmpeg command in stream.sh

TODO

See https://www.martin-riedl.de/2018/08/24/using-ffmpeg-as-a-hls-streaming-server-part-1/ and https://www.martin-riedl.de/2018/08/24/using-ffmpeg-as-a-hls-streaming-server-part-2/ as stream.sh is based on those.

Tutorial

To run this yourself, get this source code. As the project currently exists you might need to change some things:

  • If you're on Windows stream.sh will be wrong for you and so will all the fonts in app.py. stream.sh uses $$ to get its process ID, you'll have to use the Windows equivalent.
  • If you're on macOS stream.sh might need to be changed a bit and you might not have the fonts in app.py.
  • If you're on Linux stream.sh will probably be alright but you might not have all the fonts in app.py.

Lots of the stuff in app.py and stream.sh should at some point be moved into a configuration file that you can edit more easily.

Assuming you've dealt with that, this is what you have to do.

Start streaming

FFmpeg

Go to the project root and type sh stream.sh. This starts the livestream.

Flask

Go to the project root and type flask run. This starts the websever.

tor

Now your webserver is running on port 5000 (or whichever port you set it to, if you did that). We need to tell tor to create a hidden service and to point it at port 5000.

In your torrc, add these two lines

HiddenServiceDir $PROJECT_ROOT/hidden_service
HiddenServicePort 80 127.0.0.1:5000

where $PROJECT_ROOT is the root folder of this project. When you reload tor it will create the hidden_service directory and your website will be online. Your onion address is in hidden_service/hostname. You only need to do this once.

While streaming

To appear as the broadcaster in chat, go to /broadcaster and log in with the username broadcaster and the password printed in your terminal when you started Flask.

You can change the stream title while streaming and it will update for all viewers. Edit title.txt to do that.

If you restart FFmpeg while you're streaming, viewers will have to refresh the page. Viewers with JavaScript are prompted to refresh the page.

Stop streaming

To stop streaming, stop FFmpeg and delete all the files in stream/. To start streaming again just run stream.sh.

If you restart Flask, the chat will be cleared, you'll have to log in again, and everyone else will have to do the captcha again.