Skip to main content

Yt2Cli

A simple command-line (CLI) tool for searching and playing YouTube videos directly from the terminal, without needing to open a browser.

Features

  • Search YouTube videos by keyword, with an optional result limit (--limit=<n>, default 10)
  • Filter results by video type with --type=short|long|both (short = 60s or less, long = more than 60s)
  • Browse a channel's videos by its YouTube handle: channel <channeluser> (supports --limit=<n> and --thumbs=yes|no)
  • Results are cached per query and options (limit, type, thumbs), so re-searching the same keyword is instant
  • Load more results from the last search with more
  • Display search results as formatted video cards (title, channel, views with K/M/B suffix, duration, and Short/Normal badge) with the video thumbnail rendered as block/pixel art; cards flow into a responsive multi-column grid based on terminal width. Disable thumbnail rendering with --thumbs=no for faster results
  • Play any video from the list through mpv, falling back to the system's default application if mpv isn't installed
  • Play a video directly by URL without searching: open --url=<youtube-url>
  • Type a YouTube URL directly at the prompt to play it automatically, no command needed (recognizes youtube.com/watch, youtu.be, /shorts/, and /embed/ links)
  • Download one or more videos to an existing folder with --path=<existing-dir>: download <id1> <id2> ... --path=~/Videos, including direct URLs: download --url=<youtube-url> --path=~/Videos
  • Copy a video's URL to the clipboard with copy <id> (uses pyperclip)
  • Clear the in-memory cache and the loaded list with reset or cache:clear
  • Any unrecognized command is treated as a search query
  • Command line editing and history via readline
  • Cross-platform: works on Windows, macOS, and Linux

Requirements

1. Python

Recommended version: Python 3.10 or newer.

2. mpv for video playback (optional)

The app relies on mpv as the default player. If it's not installed, the app will fall back to opening the link with the system's default application.

Installing mpv:

OS Command
Fedora sudo dnf install mpv
Ubuntu / Debian sudo apt install mpv
macOS (Homebrew) brew install mpv
Windows Download from mpv.io

Installation

pip install yt2cli

Usage

yt2cli

This launches an interactive prompt. Type a command and press Enter.

Available Commands

Command Description
channel <user> Browse a channel's videos by its YouTube handle (channel <channeluser>); supports --limit=<n> and `--thumbs=yes
show Show the currently loaded videos from the last search
open <id> Play a video from the list by its number; use open --url=<youtube-url> to play a direct URL
download <id> Download one or more videos from the list to an existing folder (download <id1> <id2> ... --path=<existing-dir>); use download --url=<youtube-url> --path=<existing-dir> for a direct URL
copy <id> Copy the URL of a video from the list to the clipboard
more Load more videos from the last search (adds 5 more results)
reset Clear the loaded video list and the backend cache
cache:clear Remove the cached search results only
clear Clear the terminal screen
help Show a list of available commands
exit Close the app

Note: Any input that isn't a recognized command is treated as a search query. A direct YouTube URL (youtube.com/watch, youtu.be/..., /shorts/..., or /embed/...) is played automatically instead of being searched.

Example

==================================================
                  AVAILABLE OPTIONS
==================================================
  [channel]  Get Channel Videos, Usage channel :channeluser // the unique channel user
  [copy]  Use it to Copy the Youtube Video Url, Id Required
  [open]  Use It to Open A video From the List of Searched Videos
  [clear]  Clear The Terminal Screen
  [show]  Show The Current Loaded Videos
  [exit]  Close the App
  [help]  Show A List of Available Commands
  [reset]  Remove The Saved Search Results And Backend Cached Data on the current session
  [cache:clear]  Remove the Cached Search Results of the current session
  [more]  Get More Videos from the Last Searched Query
  [download]  Download A Youtube Video
==================================================

Yt2Cli Run: python tutorial --type=both
********** Search Results For: python tutorial , limit = 10 type = both thumbs = yes **********
 ──────────────────────────────────────────────────────────────
 ┌─────────────── block art ───────────────┐  [0] Python Basics for Beginners
 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │      Programming Academy
 │ ░░░░░░ ░░ ░ ░  ░░   ░  ░░░ ░░░ ░░ ░░░  │      2.34M views
 │ ░ ░░░░ ░ ░░ ░ ░ ░░ ░ ░░ ░ ░░░ ░ ░░░░░  │      18:42 duration
 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │      Normal video
 └─────────────────────────────────────────┘
 ──────────────────────────────────────────────────────────────

# The number in [brackets] is the video's index in the list (used by `open`/`download`/`copy`), not the YouTube video ID

Yt2Cli Run: open 0

Video Card Layout

Each search result is printed as a card:

 ──────────────────────────────────────────────────────────────
 ┌─────────────── block art ───────────────┐  [0] Python Basics for Beginners
 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │      Programming Academy
 │ ░░░░░░ ░░ ░ ░  ░░   ░  ░░░ ░░░ ░░ ░░░  │      2.34M views
 │ ░ ░░░░ ░ ░░ ░ ░ ░░ ░ ░░ ░ ░░░ ░ ░░░░░  │      18:42 duration
 │ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │      Normal video
 └─────────────────────────────────────────┘
 ──────────────────────────────────────────────────────────────
  • The card is bounded by a horizontal line ()
  • Left side: the video thumbnail rendered as terminal block/pixel art (~40 columns wide) via term-image
  • Right side: the bold [index] Title (truncated to 45 chars), the channel (truncated to 40 chars), the view count formatted with K/M/B suffixes, the video duration, and a Short/Normal video badge
  • Cards are laid out in a responsive grid — as many cards per row as the terminal width allows, and each card is padded so columns align
  • The [index] is the card's position in the loaded list — the number you pass to open <id>, download <id>, or copy <id>

You can also play a video directly by URL, without searching first:

Yt2Cli Run: open --url=https://www.youtube.com/watch?v=id

Or simply type the URL itself — it will be detected and played automatically (youtube.com/watch, youtu.be/..., /shorts/..., and /embed/... links are recognized):

Yt2Cli Run: https://www.youtube.com/watch?v=id

You can also browse a channel's videos directly by its YouTube handle:

Yt2Cli Run: channel MrBeast --limit=5

Project Structure

yt2cli/
├── src/
│   └── yt2cli/
│       ├── __init__.py      # App export entry point
│       ├── App.py           # Core logic and command handling
│       ├── Backend.py       # Search logic (yt-dlp), result caching, and downloads
│       ├── Logger.py         # Custom silent yt-dlp logger
│       ├── ParamManager.py   # Parses `--option=value` arguments for commands
│       ├── Player.py        # Video playback (mpv with system fallback)
│       ├── SearchResults.py # Renders the video cards and thumbnail block art
│       └── cli.py           # Interactive REPL entry point

Notes

  • The app uses yt-dlp to search and extract video playback URLs.
  • channel <channeluser> loads a channel's videos from its /videos tab using the channel's YouTube handle (@handle or just handle); it accepts --limit=<n> and --thumbs=yes|no, and results are cached per channel and options.
  • Search results are cached per query and options (limit, type, thumbs) in memory; playing a video re-resolves the stream URL with yt-dlp.
  • --type=short|long|both filters results by duration: short videos are 60 seconds or less, long videos are more than 60 seconds, both returns everything.
  • --thumbs=yes|no (also accepts true/false) toggles whether search results render the video thumbnail as block art; no skips fetching thumbnails for faster results.
  • more re-searches the last query with a higher limit (adds 5 results each time).
  • download <id> --path=<existing-dir> saves the video with yt-dlp into the given existing folder. The folder must already exist and is passed with --path. It accepts multiple ids at once: download 0 2 5 --path=~/Videos.
  • copy <id> copies the video's URL to the clipboard via pyperclip.
  • open --url=<youtube-url> plays any video directly by URL, without needing to search for it first.
  • download --url=<youtube-url> --path=<existing-dir> downloads any video directly by URL, without needing to search for it first.
  • Typing a YouTube URL (youtube.com/watch, youtu.be/..., /shorts/..., or /embed/...) directly at the prompt plays it automatically.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yt2cli-0.2.8.tar.gz (15.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yt2cli-0.2.8-py3-none-any.whl (13.6 kB view details)

Uploaded Python 3

File details

Details for the file yt2cli-0.2.8.tar.gz.

File metadata

  • Download URL: yt2cli-0.2.8.tar.gz
  • Upload date:
  • Size: 15.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for yt2cli-0.2.8.tar.gz
Algorithm Hash digest
SHA256 08e43eb19899488f73edf0c71ab08e9af98c6a7df7aa1b9b9b47bb96aa5caea0
MD5 28d80832f53f24b51d4e64a5bc9549e3
BLAKE2b-256 54566d7414a970dbd1bc16898f710eb999321d807eab698ff8a83d1511cf322e

See more details on using hashes here.

Provenance

The following attestation bundles were made for yt2cli-0.2.8.tar.gz:

Publisher: workflow.yml on ahmed1cb/Yt2cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yt2cli-0.2.8-py3-none-any.whl.

File metadata

  • Download URL: yt2cli-0.2.8-py3-none-any.whl
  • Upload date:
  • Size: 13.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for yt2cli-0.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 d177c7b55ad49e313dce4b057a07bfe8c90f3cfcccc7f338bca13b3975c64785
MD5 2046210f5f466731c7bd1cce63e6d240
BLAKE2b-256 da7933731a5ba8c7390ee7b4e57ee88f5afd6ac4d97750e9528fdfcbb5448e7d

See more details on using hashes here.

Provenance

The following attestation bundles were made for yt2cli-0.2.8-py3-none-any.whl:

Publisher: workflow.yml on ahmed1cb/Yt2cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page