Go to file
2022-08-22 16:35:15 -04:00
assets add bootstrap js. Not sure if it is useful for now 2022-07-21 16:23:42 -04:00
cmd/dummytdl Cleanup 2022-07-18 19:26:44 -04:00
db cleanup and add title 2022-07-14 16:13:27 -04:00
pubsub pt pubsub working 2022-06-28 23:02:53 -04:00
templates add bootstrap js. Not sure if it is useful for now 2022-07-21 16:23:42 -04:00
go.mod update dependencies 2022-08-22 16:35:15 -04:00
go.sum update dependencies 2022-08-22 16:35:15 -04:00
LICENSE Add LICENSE 2022-07-28 02:58:02 +00:00
main.go add bootstrap js. Not sure if it is useful for now 2022-07-21 16:23:42 -04:00
Makefile add target to update go.mod 2022-07-29 22:24:42 -04:00
README.md add another yq example 2022-07-29 23:48:37 -04:00

YTUI - Front end for youtube-dl

Bare minimum zero dependency¹² single binary web app to download youtube videos using youtube-dl. Allows multiple downloads in parallel. Shows title and live download progress. Pull requests welcome. For a more feature full nicer looking app, checkout YoutubeDL-Material

¹Uses golang.org/x/net for websockets. It is strictly not part of go standard library, but still from official go. ²Uses bootstrap for front-end. Files are embedded in the binary, does not make external requests both in front-end and back-end. See CSP header in templates/index.html

Install

 go install gitlab.com/balki/ytui@latest
go: downloading gitlab.com/balki/ytui v0.0.0-...

If you don't have and don't want to install go tool-chain, use docker to get the binary

 docker run --rm -v "${PWD}:/op" golang:latest sh -c "go install gitlab.com/balki/ytui@latest && cp -v /go/bin/ytui /op/"
go: downloading gitlab.com/balki/ytui v0.0.0-...
go: downloading golang.org/x/net v0.0.0-...
'/go/bin/ytui' -> '/op/ytui'

Usage

 ~/go/bin/ytui -h
2022/06/30 10:53:46 Youtube UI
Usage of /home/balki/go/bin/ytui:
  -cachepath string
        Path where temporary download files are saved (default "./cache")
  -dbpath string
        Path where downloaded info is saved (default "./db.json")
  -port int
        Port to listen on (default 8080)
  -videospath string
        Path where videos are saved (default "./vids")
  -videosurl string
        Prefix of the url, i.e. https://domain.com/<this var>/<video filename> (default "/vids")
  -ytdlcmd string
        youtube-dl command seperated by spaces (default "youtube-dl")

My Deployment setup

File: /usr/local/lib/systemd/system/ytui.service

[Unit]
Description=Youtube UI

[Service]
User=ytui
Type=simple
StateDirectory=ytui
WorkingDirectory=/var/lib/ytui
ExecStart=/path/to/ytui -ytdlcmd "youtube-dl --proxy socks5://x.x.x.x:1080"

[Install]
WantedBy=multi-user.target

File: /usr/local/lib/sysusers.d/ytui.conf

# See sysusers.d(5) for details.

u ytui - "Youtube UI"

File: /etc/caddy/conf.d/ytui.conf

Make sure your main caddy file includes this

ytui.mydomain.com {
    root * /var/lib/ytui

    handle /vids/* {
        file_server
    }

    handle {
        reverse_proxy 127.0.0.1:8080
    }
}

Setup Commands

sudo systemctl daemon-reload
sudo systemctl restart systemd-sysusers
sudo systemctl start ytui.service
sudo systemctl restart caddy

Progress Tracker

Wrote a small go helper ProgressTracker, to watch for progress and update subscribers. Hope it is useful elsewhere too. It has full unit test coverage

Tips

Quick view of the db in command line.

Needs yq and xsv installed

yq --from-file /dev/fd/7 db.json -o csv 7<<'EOM' | xsv table
.items
| del(.[] | .url)
| (
    [ .[0] | keys ] + 
    [ .[] 
      | .title |= sub("\n", "") 
      | [.*] 
    ]
  )
EOM

yq --from-file /dev/fd/7 db.json -o csv 7<<'EOM' | head | xsv table
.items
| with(.[]; 
    del(.url),
    .title |= sub("\n", ""),
    .status |= sub("Done", "✓"),
    .status |= sub("Error", "✗"),
    .file_name |= sub("^$", "MISSING")
  )
| (
    [ .[0] | keys ]
    + [ .[] | [.*] ]
  )
EOM