Even though not a PVR, the command line utilities yt-dlp and ytdl-sub can be used to automate the process of downloading videos from YouTube, renaming them sequentially and then placing them somewhere to be picked up by jellyfin or Plex Media Server.
yt-dlp,ytdl-sub
ytdl-sub uses YAML configuration files to define rules for downloading YouTube content. In its simplest form, two files are used config.yaml and subscriptions.yaml where config.yaml defines some general settings and subscriptions.yaml can be used to download YouTube channel subscriptions.
The setup described on this page uses one script per YouTube show such that it is recommended to keep these files contained within the same directory structure. For example, the filesystem structure that we use is the following:
+ /opt/ytdl-sub/TVSHOW
| +
| |
| +---+ config.yaml
| |
| +---+ subscriptions.yaml
| |
| +---+ downloads
|
|
+ /etc/cron.daily
+
|
+---+ ytdl-TVSHOW
where:
TVSHOW is the name of the TV show to be downloadedconfiguration: working_directory: '/opt/ytdl-sub/TVSHOW/downloads' persist_logs: logs_directory: '/opt/ytdl-sub/TVSHOW/logs/' presets: tv_show: ytdl_options: break_on_existing: True extractor_args: youtube: lang: - "en" preset: - "kodi_tv_show_by_date" - "jellyfin_tv_show_by_date" - "plex_tv_show_by_date" - "season_by_year__episode_by_month_day"
TVSHOW: preset: - "tv_show" overrides: tv_show_name: "TVSHOW" tv_show_directory: "/mnt/data/YouTube/" url: "https://www.youtube.com/channel/UXVQPTd6lNuq3POclliYXXze"
where:
TVSHOW is the name of the TV show,https://www.youtube.com/channel/UXVQPTd6lNuq3POclliYXXze is the link to the YouTube channel
The result of this file will be that the channel videos will be downloaded to the directory /mnt/data/YouTube.
Now either Jellyfin or Plex Media Server can be configured and a new collection added for the directory /mnt/data/YouTube. Both packages already use inotify to monitor files such that it is not really necessary to complicate the script to additionally notify Jellyfin or Plex.
In order to update, create the file at /etc/cron.daily/ytdl-TVSHOW with the following contents:
#!/bin/sh YTDL_SHOW_DIRECTORY="$TVSHOW" LOCK_FILE='/var/lock/ytdl-starea-natiei' if mkdir $LOCK_FILE 2>&1 >/dev/null; then trap '{ rm -rf $LOCK_FILE; }' KILL QUIT TERM EXIT INT HUP else exit 0 fi cd "/opt/ytdl-sub/$YTDL_SHOW_DIRECTORY/" /usr/local/bin/ytdl-sub -l verbose \ --config "/opt/ytdl-sub/$YTDL_SHOW_DIRECTORY/config.yaml" sub "/opt/ytdl-sub/$YTDL_SHOW_DIRECTORY/subscriptions.yaml" | /usr/bin/logger
and replace:
$TVSHOW with the name of the TV showUsing cron, the script will now run daily and pull any additional videos that might have appeared in the meanwhile.
In order to run the script right now, tmux can be used to create a detached terminal session that will run the script manually /etc/cron.daily/ytdl-TVSHOW (where TVSHOW is the name of the TV show).
Scaling is now fairly easy with one single example in place. One would have to just duplicate the folder /opt/ytdl-sub/TVSHOW for a different show, as well as create an additional script in /etc/cron.daily that references the files in /opt/ytdl-sub/TVSHOW.
At the time of writing all GUI solutions are problematic, especially the ones meant to run under docker and the main reason is due to the yt-dlp utility that finds itself in a constant race to keep up with the YouTube API such that many of the GUI solutions have an outdated yt-dlp that cannot be updated.
yt-dlp and ytdl-sub means a little more work but ultimately, they are the best options, and especially due to being able to update both utilities at will. An alternative is to not use ytdl-sub but rather yt-dlp directly in order to download YouTube content.