This release is a pre-release and may not be stable for production use.
ytdl
Yet another CLI based YouTube downloader tool for linux.
Features:
- Download only neccessary stream, not the whole video
- Download all videos or audios belong to a playlist
- Download with custom name and bounding
Just gather your favourite videos into a playlist, then let's ytdl download them overnight.
Prerequisites
- Fedora 32+, Ubuntu 20+, Debian 10+
- python 3.6.5 or newer
- ffmpeg 4.0 or newer
- YouTube API key
Install
Recommend to use pipx:
pipx install ytdl
ytdl config
However, pip may work too:
pip install ytdl
# don't
sudo pip install ytdl
Build from source requires poetry:
git clone git@github.com:ndaidong/ytdl.git && cd ytdl
poetry install
# use raw script
poetry run python main.py info
poetry run python main.py [command] [arguments]
# build wheel to `./dist` folder
poetry build
# then install it
pipx install dist/ytdl-VERSION-py3-none-any.whl
# test it
ytdl info
CLIs
Basic commands
| Command | Description | Shortcut |
|---|---|---|
ytdl config KEY VALUE |
Set config value | c |
ytdl config KEY |
Show config property | |
ytdl playlist PLAYLIST_URL |
Get playlist index | p |
ytdl video VIDEO_URL |
Download a video | v |
ytdl audio VIDEO_URL |
Download audio only | a |
Almost cases, VIDEO_URL and PLAYLIST_URL can be replaced with video ID or playlist ID.
Advanced usage
Config
There are 2 properties to configure: api_key and store_dir.
At the first time, api_key is empty and you have to set it before using other features.
# set new `api_key`
ytdl config api_key YOUR_OWN_YOUTUBE_API_KEY
# change `store_dir` to new path
ytdl config store_dir /storage/downloads/youtube
# get the current value of `api_key`
ytdl config api_key
# show all
ytdl config
By default, store_dir is being set to /home/{YOUR_USER_NAME}/ytdl_files, you should change it to more appropriate place.
Playlist
Note that this command does not download actual video/audio, but a list of indexed items.
# get playlist metadata into `{store_dir}/{title}.json`
# this file contains a list of videos with their ID and title to download later
ytdl playlist https://www.youtube.com/playlist?list=PLAYLIST_ID
# get playlist metadata into `{store_dir}/my_custom_playlist_name.json`
ytdl playlist https://www.youtube.com/playlist?list=PLAYLIST_ID my_custom_playlist_name
For example if we download the playlist Linux Tips and Tricks
The indexed file looks like below:
Then we will have some powerful ways to download the videos in this list with ytdl video or ytdl audio.
Video
Download a single video file.
# download a video file to `{store_dir}/video/{VIDEO_TITLE}.mp4`
ytdl video https://www.youtube.com/watch?v=VIDEO_ID
# custom name
ytdl video https://www.youtube.com/watch?v=VIDEO_ID my_custom_video_name
To download multi items from indexed playlist, please refer the following arguments:
--index_file: path to playlist index file (required)--since: video ID of the video where you want to start downloading from--limit: number of items to download, count fromsinceor the begining of the list--prefix_name: to auto naming downloaded file--prefix_num: to auto naming downloaded file
Examples:
# download all videos from saved playlist index file above
# these video files will be stored in `{store_dir}/video`
ytdl video --index_file "/path/to/Linux Tips and Tricks.json"
# download 5 videos from saved playlist index file above, since first item
ytdl video --index_file "/path/to/Linux Tips and Tricks.json" --limit 5
# download 5 videos from saved playlist index file above, with prefix name
ytdl video --index_file "/path/to/Linux Tips and Tricks.json" --limit 5 --prefix_name "Linux Tutorial"
# downloaded videos should look like "Linux Tutorial - 1.mp4", "Linux Tutorial - 2.mp4" and so on
# prefix_name will be useful when you want to put these files into an already created list for your different purpose
# download 5 videos from saved playlist index file above, with prefix name and prefix number
ytdl video --index_file "/path/to/Linux Tips and Tricks.json" --limit 5 --prefix_name "Linux Tutorial" --prefix_num 25
# this will be useful for the playlists those are splited to multi parts
# in this case, your serie "Linux Tutorial" had already 24 items before, now count from 25 onwards
# downloaded videos should look like "Linux Tutorial - 25.mp4", "Linux Tutorial - 26.mp4" and so on
# similar to above command, but start from given item
ytdl video --index_file "/path/to/Linux Tips and Tricks.json" --since VIDEO_ID --limit 5 --prefix_name "Linux Tutorial" --prefix_num 25
While downloading video, the stream with highest resolution will be selected.
Audio
This is similar to ytdl video, but only download audio file.
While downloading, the stream with highest abr (average bitrate) will be selected.
# download a audio file to `{store_dir}/audio/{VIDEO_TITLE}.mp3`
ytdl audio https://www.youtube.com/watch?v=VIDEO_ID
# custom name
ytdl audio https://www.youtube.com/watch?v=VIDEO_ID my_custom_audio_name
To download multi items from indexed playlist, please refer the following arguments:
--index_file: path to playlist index file (required)--since: video ID of the video where you want to start downloading from--limit: number of items to download, count fromsinceor the begining of the list--prefix_name: to auto naming downloaded file--prefix_num: to auto naming downloaded file
Examples:
# download all audios from saved playlist index file above
# these audio files will be stored in `{store_dir}/audio`
ytdl audio --index_file "/path/to/Linux Tips and Tricks.json"
# download 5 audios from saved playlist index file above, since first item
ytdl audio --index_file "/path/to/Linux Tips and Tricks.json" --limit 5
# download 5 audios from saved playlist index file above, with prefix name
ytdl audio --index_file "/path/to/Linux Tips and Tricks.json" --limit 5 --prefix_name "Linux Tutorial"
# downloaded audios should look like "Linux Tutorial - 1.mp3", "Linux Tutorial - 2.mp3" and so on
# prefix_name will be useful when you want to put these files into an already created list for your different purpose
# download 5 audios from saved playlist index file above, with prefix name and prefix number
ytdl audio --index_file "/path/to/Linux Tips and Tricks.json" --limit 5 --prefix_name "Linux Tutorial" --prefix_num 25
# this will be useful for the playlists those are splited to multi parts
# in this case, your serie "Linux Tutorial" had already 24 items before, now count from 25 onwards
# downloaded audios should look like "Linux Tutorial - 25.mp3", "Linux Tutorial - 26.mp3" and so on
# similar to above command, but start from given item
ytdl audio --index_file "/path/to/Linux Tips and Tricks.json" --since VIDEO_ID --limit 5 --prefix_name "Linux Tutorial" --prefix_num 25
Downloaded stream will be converted to .mp3 with ffmpeg.
Dependencies
This lib was built on top of the following packages:
| Dependency | License |
|---|---|
| pytube3 | MIT |
| python-youtube | MIT |
| python-fire | Apache License v2 |
Test
git clone git@github.com:ndaidong/ytdl.git && cd ytdl
poetry install
YOUTUBE_API_KEY=your_own_key ./run_test.sh
License
The MIT License (MIT)
Metadata
Release files for ytdl 1.0.0rc5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ytdl-1.0.0rc5.tar.gz | 9.8 kB | Without provenance | Details for ytdl-1.0.0rc5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ytdl-1.0.0rc5-py3-none-any.whl | Python 3 | none | any | Details for ytdl-1.0.0rc5-py3-none-any.whl |
Total release size: 19.0 kB
Release files / ytdl-1.0.0rc5.tar.gz
| Download URL | ytdl-1.0.0rc5.tar.gz |
|---|---|
| Size | 9.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3f6fe3cb0fd42b513ae99bff82caa8558b3cc71e9c5a80fe3416b63106da9522
|
|
BLAKE2b-256 checksum How to use checksums |
553916bde1c8fc2365bdcebd76e0f3beefc73f7ca5b6510e13750dcd254220a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.2 CPython/3.9.0 Linux/5.4.0-7642-generic
|
Release files / ytdl-1.0.0rc5-py3-none-any.whl
| Download URL | ytdl-1.0.0rc5-py3-none-any.whl |
|---|---|
| Size | 9.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b54027ce96afad1b6dfe855b1b70c21e9cc1f05f27bca20ecf193a97cfdf30b5
|
|
BLAKE2b-256 checksum How to use checksums |
6e46dbc11440d55ac95143556a5ac7f0e7c155c0e307b19272d8a524815171de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.2 CPython/3.9.0 Linux/5.4.0-7642-generic
|
Security for ytdl 1.0.0rc5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.