ytsub is a subscriptions only tui youtube client that uses the invidious api.
mpv
and yt-dlp
are optional dependencies for playing videos.
sqlite
is a required dependency. If it is not available on the system,
it can be compiled and linked by enabling
the bundled_sqlite
feature when building with cargo:
cargo build --features bundled_sqlite
```bash cargo install ytsub
cargo install ytsub --features bundled_sqlite ```
ytsub
is available in the AUR as
stable source package,
stable binary package and
latest development package.
You can install it using your preferred AUR helper.
```bash
paru -S ytsub
paru -S ytsub-bin
paru -S ytsub-git ```
``` Usage: ytsub [OPTIONS] [COMMAND]
Commands: import Import subscriptions export Export subscriptions help Print this message or the help of the given subcommand(s)
Options:
-c, --config
For default key bindings, press ctrl-h
in the app or refer to
the example config.toml
file.
Default directory of the configuration files is $HOME/.config/ytsub
.
| File | Description |
|------------------------------|-----------------------------------------------|
| config.toml
| option, key binding and theme configurations |
| instances
| list of invidious instances |
config.toml
Path to the configuration file can be specified with the -c
flag.
config.toml
with default values```toml
database = "/home/username/.local/share/ytsub/videos.db" # Path to database file instances = "/home/username/.config/ytsub/instances" # Path to instances file tabs = ["videos"] # Tabs to fetch videos from [possible values: videos, shorts, streams] api = "invidious" # API to be used for fetching videos [possible values: invidious, local] refreshthreshold = 600 # Time in seconds that needs to pass before refreshing a channel using the refreshchannels command rssthreshold = 125 # Use RSS if the number of channels being refreshed or being subscribed to exceeds the specified amount tickrate = 200 # Tick rate in milliseconds requesttimeout = 5 # Request timeout in seconds highlightsymbol = "" # Symbol to highlight selected items videoplayer = "mpv" # Path to video player hidewatched = false # Hide watched videos by default
[title] fg = "Cyan" modifiers = "bold"
[header] fg = "Yellow" modifiers = "bold"
[selected] fg = "Blue" modifiers = "bold"
[focused] fg = "Magenta" modifiers = "bold"
[watched] fg = "DarkGray"
[selected_watched]
[focused_watched]
[selected_block] fg = "Magenta"
[error] fg = "Red"
[warning] fg = "Yellow"
[help] fg = "Green"
[keybindings] "1" = "setmodesubs" # Switch to subscriptions mode "2" = "setmodelatestvideos" # Switch to latest videos mode "j down" = "ondown" # Go one line downward "k up" = "onup" # Go one line upward "h left" = "onleft" # Switch to channels block "l right" = "onright" # Switch to videos block "g" = "selectfirst" # Jump to the first line in the list "G" = "selectlast" # Jump to the last line in the list "c" = "jumptochannel" # Jump to the channel of the selected video from latest videos mode "t" = "togglehide" # Hide/unhide watched videos "i" = "subscribe" # Enter editing mode to enter channel id or url "d" = "unsubscribe" # Open confirmation window to unsubcribe from the selected channel "D" = "deletevideo" # Delete the selected video from database "/" = "searchforward" # Enter editing mode to make a forward search "?" = "searchbackward" # Enter editing mode to make a backward search "n" = "repeatlastsearch" # Search with the latest pattern and direction "N" = "repeatlastsearchopposite" # Search with the latest pattern and opposite direction "s" = "switchapi" # Switch between the available APIs "r" = "refreshchannel" # Refresh videos of the selected channel "R" = "refreshchannels" # Refresh videos of every channel "F" = "refreshfailedchannels" # Refresh videos of channels which their latest refresh was a failure "o" = "openininvidious" # Open channel or video Invidious page in browser "O" = "openinyoutube" # Open channel or video Youtube page in browser "p" = "playvideo" # Play selected video in a video player (default: mpv) "m" = "togglewatched" # Mark/unmark selected video as watched "ctrl-h" = "togglehelp" # Toggle help window "T" = "toggletag" # Toggle tag window "q ctrl-c" = "quit" # Quit application
[keybindings.import] "space" = "toggleselection" # Select/Unselect channel "a" = "selectall" # Select all channels "z" = "deselectall" # Deselect all channels "enter" = "import" # Import selected channels
[keybindings.tag] "i" = "createtag" "d" = "deletetag" "r" = "renametag" "s" = "selectchannels" # Pick channels for the tag "space" = "toggleselection" # Select/Unselect tag "a" = "selectall" # Select all tags "z" = "deselectall" # Deselect all tags
[keybindings.channelselection] "enter" = "confirm" # Confirm the selection of channels "escape" = "abort" # Drop changes "space" = "toggleselection" # Select/Unselect channel "a" = "selectall" # Select all channels "z" = "deselect_all" # Deselect all channels ```
instances
A custom path to the instances
file can be specified with the -i
flag.
The file can either be manually created by adding instances that have api enabled or
automatically generated from the instances in https://api.invidious.io by running the app with -g
flag.
Every instance entry is separated by a line.
If the instances
file doesn't exist, every time the app is launched,
instances list will be built from https://api.invidious.io.
instances
file
https://vid.puffyan.us
https://invidio.xamh.de
https://inv.riverside.rocks
https://yt.artemislena.eu