Skip to content

migalmoreno/tubo

Repository files navigation

tubo

Tubo is a streaming front-end focused on bringing the NewPipe experience to the web. It aims at providing a clean and simple user interface to consume media from your favorite streaming platforms. It currently supports the same services as NewPipe, including YouTube, SoundCloud, Bandcamp, and more.

Features

  • No ads
  • Background player
  • Playback queue
  • User playlists
  • System/Light/Dark themes

Installation

Packaging

Docker

There’s a Docker Compose file available which you can run locally like this:

cd /path/to/tubo
docker compose up -d

If you’d rather use the image(s) pushed to DockerHub, you can simply remove the build section and add an image property for the corresponding service in the docker-compose.yml file.

services:
  frontend:
    image: migalmoreno/tubo-frontend
    # ...
  backend:
    image: migalmoreno/tubo-backend
    # ...
  bg-helper:
    image: migalmoreno/tubo-bg-helper
    # ...

# ...

Uberjar

To bundle the whole project into a self-contained uber-jar you need to follow these build steps:

npm i
clojure -T:cljs:build uberjar

After the last command is completed, you’ll get a path to the uber-jar, which you can run like this:

java -jar target/tubo-<VERSION>.jar

Configuration

The main configuration file for all services lies in resources/config.edn. You can override this file with your preferred settings. If you use Docker you can use environment variables to configure certain deployment settings like the host or port where each service is running.

Reverse Proxy

If you want to self-host Tubo and make it publicly accessible you’ll need to set up a web server with a reverse proxy. You can find example configurations below:

Nginx

server {
    listen 443 ssl http2;
    server_name <TUBO_HOST>;
    ssl_certificate /etc/letsencrypt/live/<TUBO_HOST>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<TUBO_HOST>/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
    }
}

# optional: you can set a reverse proxy for the API to connect via other front-ends
server {
    listen 443 ssl http2;
    server_name api.<TUBO_HOST>;
    ssl_certificate /etc/letsencrypt/live/<TUBO_HOST>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<TUBO_HOST>/privkey.pem;

    location / {
        proxy_pass http://localhost:3000;
    }
}

Development Setup

To get a development environment set up, first install the front-end dependencies.

npm i

To start a PostgreSQL development server, you’ll need to invoke the following in the project root:

# Add `-- -D` if you want to detach the processes
nix run .

You can now access the database like this:

psql

Or by accessing a local pgweb instance in your browser at http://localhost:8081

CLI

To start a front-end development server with hot-reload support, run:

clojure -M:cljs watch frontend

You can now access it in your browser at http://localhost:8020

To start the API, run:

clojure -M:run

Note that front-end API requests will be proxied to the API.

REPL

You can also work on Tubo using an interactive environment like CIDER. Once you have it installed, do M-x cider-jack-in-clj&cljs in a source file and you’ll enter a live REPL.

If you’d like to automate the process, you can place something along the following lines in your .dir-locals.el file to automatically start the REPLs with the needed configuration.

((nil . ((cider-preferred-build-tool . clojure-cli)
         (cider-clojure-cli-aliases . ":cljs")
         (cider-default-cljs-repl . custom)
         (cider-custom-cljs-repl-init-form . "(do (require '[shadow.cljs.devtools.api :as shadow])\n(require '[shadow.cljs.devtools.server :as server])\n(server/start!)\n(shadow/watch :frontend)\n(shadow/nrepl-select :frontend))")
         (cider-merge-sessions . :project)
         (eval . (progn
                   (unless (boundp 'cider-jack-in-nrepl-middlewares)
                     (require 'cider))
                   (make-variable-buffer-local 'cider-jack-in-nrepl-middlewares)
                   (add-to-list 'cider-jack-in-nrepl-middlewares "cider.nrepl/cider-middleware")
                   (add-to-list 'cider-jack-in-nrepl-middlewares "shadow.cljs.devtools.server.nrepl/middleware"))))))

You can then invoke this to start the API:

user=> (require '[tubo.http])
user=> (tubo.http/start-server!)

Browser Extension Support

You can manually add any redirect rule based on regex patterns with this extension. Below are some sample configurations to redirect links from supported services to Tubo so you get a basic idea of how to write manual Redirector rules. Note the serviceId of each service is: YouTube (0), SoundCloud(1), media.ccc.de(2), PeerTube(3), and Bandcamp(4).

Description: YouTube video to Tubo stream
Example URL: https://www.youtube.com/watch?v=YE7VzlLtp-4
Include pattern: ^((?:https?://)(?:www.)?youtube.com/(watch\?v.*|shorts/.*))
Redirect to: https://<TUBO_HOST>/stream?url=$1
Example result: https://<TUBO_HOST>/stream?url=https://www.youtube.com/watch?v=YE7VzlLtp-4
Pattern type: Regular Expression
Apply to: Main window (address bar)
Description: SoundCloud stream to Tubo stream
Example URL: https://soundcloud.com/unfa/stop-the-panic
Include pattern: ^((?:https?://)(?:www.)?soundcloud.com/.*/.*)
Redirect to: https://<TUBO_HOST>/stream?url=$1
Example result: https://<TUBO_HOST>/stream?url=https://soundcloud.com/unfa/stop-the-panic
Pattern type: Regular Expression
Apply to: Main window (address bar)
Description: Bandcamp album to Tubo playlist
Example URL: https://unfa.bandcamp.com/album/suppressed
Include pattern: ^((?:https?://)(.*\.)?bandcamp.com/album/.*)
Redirect to: https://<TUBO_HOST>/playlist?url=$1
Example result: https://<TUBO_HOST>/playlist?url=https://unfa.bandcamp.com/album/suppressed
Pattern type: Regular Expression
Apply to: Main window (address bar)
Description: PeerTube (Framatube) channel to Tubo channel
Example URL: https://framatube.org/accounts/framasoft@framatube.org
Include pattern: ^((?:https?://)(?:www.)?framatube.org/accounts/.*)
Redirect to: https://<TUBO_HOST>/channel?url=$1
Example result: https://<TUBO_HOST>/channel?url=https://framatube.org/accounts/framasoft@framatube.org
Pattern type: Regular Expression
Apply to: Main window (address bar)
Description: media.ccc.de search query to Tubo search query
Example URL: https://media.ccc.de/search/?q=37c3
Include pattern: ^(?:https?://)media.ccc.de/search/\?q=(.*)
Redirect to: https://<TUBO_HOST>/search?query=$1&serviceId=2
Example result: https://<TUBO_HOST>/search?query=37c3&serviceId=2
Pattern type: Regular Expression
Apply to: Main window (address bar)

Redirects many popular services to their alternative front-ends. Has a ton of features and an active community. Tubo is supported by default for YouTube and SoundCloud.

Serves the same purpose as LibRedirect but is Manifest V3 compatible. Tubo is supported by default for SoundCloud.

A user-script that redirects popular social media platforms to their privacy respecting front-ends. Tubo is supported by default for YouTube and SoundCloud.

Community

Join the #tubo IRC channel at Libera.Chat for general project support.

About

A libre streaming front-end for the web

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published