Skip to main content

ytdl-sub

Automate downloading and metadata generation with YoutubeDL.

codecov Code Qaulity Checks License

ytdl-sub is a command-line tool that downloads media via yt-dlp and prepares it for your favorite media player, including Kodi, Jellyfin, Plex, Emby, and modern music players. No additional plugins or external scrapers are needed.

We recognize that everyone stores their media differently. Our approach for file and metadata formatting is to provide maximum flexibility while maintaining simplicity.

YouTube Channels as TV Shows

Plex

unknown

Jellyfin

jellyfin

Music Videos and Concerts

Kodi

kodi

Jellyfin

jelly_mv

SoundCloud Discography

Writes proper music-tags via beets API

sc_mb

Bandcamp Discography

bc_nav

How it Works

ytdl-sub uses YAML files to define subscriptions. Each subscription imports presets that define how to handle and output media files. ytdl-sub comes packaged with many prebuilt presets that do the work of config-building, so you can start downloading immediately.

# subscriptions.yaml:
# Everything in here can be downloaded using the command:
#   ytdl-sub sub subscriptions.yaml

# __preset__ is a place to define global overrides for all subscriptions
__preset__:
  overrides:
    # Root folder of all ytdl-sub TV Shows
    tv_show_directory: "/tv_shows"
    
    # Root folder of all ytdl-sub Music
    music_directory: "/music"
    
    # Root folder of all ytdl-sub Music Videos
    music_video_directory: "/music_videos"
    
    # For 'Only Recent' preset, only keep vids within this range and limit
    only_recent_date_range: "2months"
    only_recent_max_files: 30
    
  # Pass any arg directly to yt-dlp's Python API
  ytdl_options:
    cookiefile: "/config/ytdl-sub-configs/cookie.txt"

###################################################################
# TV Show Presets. Can replace Plex with Plex/Jellyfin/Emby/Kodi

Plex TV Show by Date:

  # Sets genre tag to "Documentaries"
  = Documentaries:
    "NOVA PBS": "https://www.youtube.com/@novapbs"
    "National Geographic": "https://www.youtube.com/@NatGeo"
    "Cosmos - What If": "https://www.youtube.com/playlist?list=PLZdXRHYAVxTJno6oFF9nLGuwXNGYHmE8U"

  # Sets genre tag to "Kids", "TV-Y" for content rating
  = Kids | = TV-Y:
    "Jake Trains": "https://www.youtube.com/@JakeTrains"
    "Kids Toys Play": "https://www.youtube.com/@KidsToysPlayChannel"

  = Music:
    # TV show subscriptions can support multiple urls and store in the same TV Show
    "Rick Beato":
      - "https://www.youtube.com/@RickBeato"
      - "https://www.youtube.com/@rickbeato240"

  # Set genre tag to "News", use `Only Recent` preset to only store videos uploaded recently
  = News | Only Recent:
    "BBC News": "https://www.youtube.com/@BBCNews"

Plex TV Show Collection:
  = Music:
    # Prefix with ~ to set specific override variables
    "~Beyond the Guitar":
      s01_name: "Videos"
      s01_url: "https://www.youtube.com/c/BeyondTheGuitar"
      s02_name: "Covers"
      s02_url: "https://www.youtube.com/playlist?list=PLE62gWlWZk5NWVAVuf0Lm9jdv_-_KXs0W"

###################################################################
# Music Presets.

YouTube Releases:
  = Jazz:  # Sets genre tag to "Jazz"
    "Thelonious Monk": "https://www.youtube.com/@theloniousmonk3870/releases"

YouTube Full Albums:
  = Lofi:
    "Game Chops": "https://www.youtube.com/playlist?list=PLBsm_SagFMmdWnCnrNtLjA9kzfrRkto4i"

SoundCloud Discography:
  = Chill Hop:
    "UKNOWY": "https://soundcloud.com/uknowymunich"
  = Synthwave:
    "Lazerdiscs Records": "https://soundcloud.com/lazerdiscsrecords"
    "Earmake": "https://soundcloud.com/earmake"

Bandcamp:
  = Lofi:
    "Emily Hopkins": "https://emilyharpist.bandcamp.com/"

###################################################################
# Music Video Presets. Can replace Plex with Plex/Jellyfin/Kodi
"Plex Music Videos":
  = Pop:  # Sets genre tag to "Pop"
    "Rick Astley": "https://www.youtube.com/playlist?list=PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc"
    "Michael Jackson": "https://www.youtube.com/playlist?list=OLAK5uy_mnY03zP6abNWH929q2XhGzWD_2uKJ_n8E"

All of this can be downloaded and ready to import to your favorite player using the command

ytdl-sub sub subscriptions.yaml

See our example subscriptions for more detailed examples and use-cases.

Output

After ytdl-sub runs, the end result will download and format the files into something ready to be consumed by your favorite media player/server.

tv_shows/
  Jake Trains/
    Season 2021/
      s2021.e031701 - Pattys Day Video-thumb.jpg
      s2021.e031701 - Pattys Day Video.mp4
      s2021.e031701 - Pattys Day Video.nfo
      s2021.e031702 - Second Pattys Day Video-thumb.jpg
      s2021.e031702 - Second Pattys Day Video.mp4
      s2021.e031702 - Second Pattys Day Video.nfo
    Season 2022/
      s2022.e122501 - Merry Christmas-thumb.jpg
      s2022.e122501 - Merry Christmas.mp4
      s2022.e122501 - Merry Christmas.nfo
    poster.jpg
    fanart.jpg
    tvshow.nfo

music/
  Artist/
    [2022] Some Single/
      01 - Some Single.mp3
      folder.jpg
    [2023] Latest Album/
      01 - Track Title.mp3
      02 - Another Track.mp3
      folder.jpg

music_videos/
  Elton John/
    Elton John - Rocketman.jpg
    Elton John - Rocketman.mp4

Custom Configs

Any part of this process is modifiable by using custom configs. See our walk-through guide on how to build your first config from scratch. Ready-to-use example configurations can be found here alongside our readthedocs for detailed information on all config fields.

Installation

ytdl-sub can be installed on the following platforms.

Docker Installation

Docker installs can be either headless or use the Web-GUI image, which comprises LSIO's code-server Docker image with ytdl-sub preinstalled. This is the recommended way to use ytdl-sub.

image

Contributing

There are many ways to contribute, even without coding. Please take a look in our GitHub Issues to submit a feature request, or pick up a bug.

Support

We are pretty active in our Discord channel if you have any questions. Also see our FAQ for commonly asked questions.

Download files

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

Source Distribution

ytdl_sub-2026.7.16.tar.gz (207.8 kB view details)

Uploaded Source

Built Distribution

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

ytdl_sub-2026.7.16-py3-none-any.whl (252.0 kB view details)

Uploaded Python 3

File details

Details for the file ytdl_sub-2026.7.16.tar.gz.

File metadata

  • Download URL: ytdl_sub-2026.7.16.tar.gz
  • Upload date:
  • Size: 207.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ytdl_sub-2026.7.16.tar.gz
Algorithm Hash digest
SHA256 4ce71d26adda5d819dd5296160a8f6ac16e1210c466fde2cb14dedd04a0c47c9
MD5 52f0d35dcef0395d5280ef0b7faa36bf
BLAKE2b-256 8e3bab6e5e89334e661e23165a3a2277448574b76b37bd22164eda5bbba809db

See more details on using hashes here.

File details

Details for the file ytdl_sub-2026.7.16-py3-none-any.whl.

File metadata

  • Download URL: ytdl_sub-2026.7.16-py3-none-any.whl
  • Upload date:
  • Size: 252.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ytdl_sub-2026.7.16-py3-none-any.whl
Algorithm Hash digest
SHA256 fd2e1a8f22508f14d00008d11292bdffb14e42c1d8862846f33a7572cb566cb3
MD5 4854f7b9edd5bb3d41d383d405b77c51
BLAKE2b-256 e5df9276c47aab6a15cd6bd64e513403464da0c96d5b2fd5bf47753233609d45

See more details on using hashes here.

Release history Release notifications | RSS feed

2026.8.26

2 files

This release

2026.7.16 This release

2 files

2026.6.23

2 files

2026.6.12

2 files

2026.3.19

2 files

2026.3.13

2 files

2026.3.9

2 files

2026.3.5

2 files

2026.2.23

2 files

2026.2.4

2 files

2026.2.3

2 files

2026.2.2

2 files

2026.1.30

2 files

2026.1.27

2 files

2026.1.26

2 files

2026.1.24

2 files

2026.1.23

2 files

2026.1.16

2 files

2026.1.13

2 files

2026.1.11

2 files

2026.1.6

2 files

2025.12.31

2 files

2025.12.30

2 files

2025.12.26

2 files

2025.12.8

2 files

2025.12.6

2 files

2025.11.28

2 files

2025.11.27

2 files

2025.11.18

2 files

2025.11.13

2 files

2025.11.9

2 files

2025.11.8

2 files

2025.11.7

2 files

2025.10.23

2 files

2025.10.16

2 files

2025.10.15

2 files

2025.10.12

2 files

2025.9.27

2 files

2025.9.24

2 files

2025.9.13

2 files

2025.9.9

2 files

2025.9.1

2 files

2025.8.29

2 files

2025.8.28

2 files

2025.8.27

2 files

2025.8.21

2 files

2025.8.20

2 files

2025.8.15

2 files

2025.7.24

2 files

2025.7.4

2 files

2025.7.3

2 files

2025.7.2

2 files

2025.6.27

2 files

2025.6.19

2 files

2025.6.12

2 files

2025.6.1

2 files

2025.5.31

2 files

2025.5.23

2 files

2025.5.5

2 files

2025.5.1

2 files

2025.4.18

2 files

2025.4.3

2 files

2025.4.2

2 files

2025.3.31

2 files

2025.3.26

2 files

2025.3.25

2 files

2025.3.21

2 files

2025.3.16

2 files

2025.3.15

2 files

2025.2.21

2 files

2025.2.20

2 files

2025.2.17

2 files

2025.2.5

2 files

2025.1.28

2 files

2025.1.27

2 files

2025.1.17

2 files

2025.1.15

2 files

2024.12.27

2 files

2024.12.14

2 files

2024.12.8

2 files

2024.12.4

2 files

2024.11.26

2 files

2024.11.24

2 files

2024.11.18

2 files

2024.11.6

2 files

2024.11.5

2 files

2024.10.31

2 files

2024.10.26

2 files

2024.10.23

2 files

2024.10.9

2 files

2024.10.6

2 files

2024.9.30

2 files

2024.9.29

2 files

2024.9.20

2 files

2024.9.18

2 files

2024.9.8

2 files

2024.7.26

2 files

2024.7.21

2 files

2024.7.13

2 files

2024.7.4

2 files

2024.6.6

2 files

2024.6.3

2 files

2024.5.29

2 files

2024.5.11

2 files

2024.4.28

2 files

2024.4.3

2 files

2024.4.1

2 files

2024.3.31

2 files

2024.3.19

2 files

2024.2.28

2 files

2024.2.17

2 files

2024.2.13

2 files

2024.1.20

2 files

2024.1.19

2 files

2024.1.18

2 files

2024.1.15

2 files

2024.1.11

2 files

2024.1.10

2 files

2024.1.8

2 files

2024.1.7

2 files

2024.1.6

2 files

2024.1.5

2 files

2024.1.4

2 files

2023.12.26

2 files

2023.12.21

2 files

2023.12.20

2 files

2023.12.19

2 files

2023.12.15

2 files

2023.11.25

2 files

2023.11.16

2 files

2023.11.15

2 files

2023.11.11

2 files

2023.11.6

2 files

2023.11.5

2 files

2023.11.4

2 files

2023.11.2

2 files

2023.10.28

2 files

2023.10.25

2 files

2023.10.24

2 files

2023.10.22

2 files

2023.10.21

2 files

2023.10.18

2 files

2023.10.17

2 files

2023.10.3

2 files

2023.10.2

2 files

2023.9.28

2 files

2023.9.24

2 files

2023.9.22

2 files

2023.9.20

2 files

2023.9.19

2 files

2023.9.13

2 files

2023.9.2

2 files

2023.8.30

2 files

2023.7.30

2 files

2023.7.28

2 files

2023.7.26

2 files

2023.7.25

2 files

2023.7.24

2 files

2023.7.17

2 files

2023.6.30

2 files

2023.6.25

2 files

2023.6.24

2 files

2023.6.22

2 files

2023.6.17

2 files

2023.6.3

2 files

2023.5.31

2 files

2023.5.28

2 files

2023.5.23

2 files

2023.5.22

2 files

2023.5.19

2 files

2023.5.18

2 files

2023.4.29

2 files

2023.4.20

2 files

2023.4.12

2 files

2023.4.5

2 files

2023.4.4

2 files

2023.4.3

2 files

2023.4.1

2 files

2023.3.31

2 files

2023.3.30

2 files

2023.3.29

2 files

2023.3.26

2 files

2023.3.24

2 files

2023.3.21

2 files

2023.3.17

2 files

2023.3.15

2 files

2023.3.14

2 files

2023.3.13

2 files

2023.3.11

2 files

2023.3.10

2 files

2023.3.9

2 files

2023.3.8

2 files

2023.3.7

2 files

2023.3.4

2 files

2023.3.3

2 files

2023.3.2

2 files

2023.3.1

2 files

2023.2.25

2 files

2023.2.24

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page