/torrent-stream-server

HTTP server to convert any torrent to video stream

Primary LanguageTypeScriptMIT LicenseMIT

Torrent Stream Server

Docker CodeQL Dependencies npm version

HTTP server to convert any torrent to stream with video support.

Cover

Features:

  • Create stream from magnet or torrent file - preview
  • Choose which file to stream - preview
  • Stream video files - preview
  • Search & stream torrents - preview
  • Playlist support (m3u), open with external player - preview
  • Monitor activity - preview

Setup

Deploy

Heroku forbids P2P services, so your account can be suspened (learn more)

NPM package

Read more

Other options

Documentation

API

API uses swagger.yaml to:

  1. To generate API documentation page, which can be accesed when using npm run dev on http://127.0.0.1:3000/api-docs.
  2. To generate frontend client (frontend/src/helpers/client)
  3. To generate backend models (src/models)

Check documentation

Examples

Open in VLC

Running the following commands from a shell will run VLC and start playing the Sintel movie stream from its public torrent:

By infohash (BTIH)

vlc "http://localhost:3000/stream/08ada5a7a6183aae1e09d831df6748d566095a10"

By magnet URI

vlc "http://localhost:3000/stream?torrent=magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&file=Sintel.mp4"

Download file using curl

This command will download Sintel movie from torrents and save as sintel.mp4.

curl "http://localhost:3000/stream/08ada5a7a6183aae1e09d831df6748d566095a10" > sintel.mp4

Security

API can be protected with security.apiKey, stream api can have additional JSON Web Token (configurable via security.streamApi.key).

If only only one key specified in the config, it will be used as both: API key & streamApi.key.

API protection

When api or stream key is enabled, each API call will require Authorization header:

Authorization: Bearer <token>

Generate stream API URL

import { sign } from 'jsonwebtoken'

const url = `/stream/${encodeURIComponent(
    sign(
        {
            torrent: '08ada5a7a6183aae1e09d831df6748d566095a10',
            fileType: 'video',
        },
        key
    )
)}`

This API will have encoded parameters, so it's safe to share it publicly. It will automatically expire (configurable via security.streamApi.maxAge)