Generate unique collections for each youtube channel folder stored locally. This project is now in a 1.0 usable state.
#youtubearchive When archiving youtube videos, It's difficult to have a proper UI experience to watch the youtube videos and channels that we've archived. This project aims to utilize tools available in Plex to make a usable watching experience for Youtube channels archived utilizing yt-dlp.
- Install the requirements.txt with
py -m pip install -r requirements.txt
located in this project. - Written and tested with python 3.10.x and 3.11.x
- I enforce black formatter :D -> Install "Black Formatter" in the VSCode Market
- Fill out the required environment variables in the vscode launch.json
Example Configuration:
{
"name": "[LOCAL SERVER] main script run",
"type": "python",
"request": "launch",
"program": "main.py",
"console": "integratedTerminal",
"justMyCode": true,
"env": {
"PLEX_URL": "https://localhost:32400", // 32400 is the default Plex port, but yours may be different.
"PLEX_TOKEN": "<Insert-Plex-Token>", // See https://tinyurl.com/get-plex-token
"YOUTUBE_PATH": "Z:\\Youtube",
"YOUTUBE_LIBRARY_NAME": "Youtube", // Set this to what you named your Youtube Library in Plex.
"MEDIA_TYPE": "movie", // In the Plex Library Creation UI, choose "Other Videos" for the Library video file types.
"YOUTUBE_VIDEO_EXTENSION": ".mkv",
"SECONDS_TO_WAIT": "3600",
"PYTHONWARNINGS": "ignore:Unverified HTTPS request",
"OPTIMIZE_SCANS": "true", // OPTIONAL
"DOWNLOAD_AVATARS_AND_BANNERS": "true", // OPTIONAL
"YTDLP_PROCESS_PATH": "J:\\Youtube\\youtube-dlp.exe" // OPTIONAL
}
}
You can also simply input a config.json (a template has been provided in the project root) as an argument to load the necessary variables.
{
"PLEX_URL": "https://localhost:32400",
"PLEX_TOKEN": "<Insert-Plex-Token>",
"YOUTUBE_PATH": "C:\\Youtube",
"YOUTUBE_LIBRARY_NAME": "Youtube",
"MEDIA_TYPE": "movie",
"YOUTUBE_VIDEO_EXTENSION": ".mkv",
"SECONDS_TO_WAIT": "3600",
"PYTHONWARNINGS": "ignore:Unverified HTTPS request",
"OPTIMIZE_SCANS": "true",
"DOWNLOAD_AVATARS_AND_BANNERS": "true",
"YTDLP_PROCESS_PATH": "C:\\user\\youtube-dlp.exe"
}
This can be called by running python main.py config.json
in your terminal.
- This project heavily relies on code from the yt-dlp project, FFMPEG, and Plex
- Download the latest yt-dlp
- Place the exe in your youtube library folder. Example: Z:\Youtube
- Place the config.conf in Z:\Youtube, and ensure the commands point to your new youtube folder Z:\Youtube
--batch-file "Z:\Youtube\channel_list.txt"
--download-archive "Z:\Youtube\downloaded.txt"
--output "Z:\Youtube\%(uploader)s [%(channel_id)s]/%(upload_date)s - %(title)s - (%(duration)ss) [%(id)s].%(ext)s"
--ffmpeg-location "Z:\Youtube\ffmpeg\bin"
Note: These configurations are very extensive. If you want to speed up downloads, disable --get-comments.
- Create a channel_list.txt file with a list of youtube channel urls you want to download
- Run
Z:\Youtube\yt-dlp.exe --config-location "Z:\Youtube\config.conf"
- It's recommended that you create a
.plexignore
file in your Youtube directory to explicitly ignore *.temp.mkv files. This ensures Plex does not attempt to scan temp mkvs while the yt-dlp script runs. - Create file:
Z:\Youtube\.plexignore
and fill the fil contents with
# Ignore all temp mkv files, these are generated by yt-dlp and should be automatically deleted.
*.temp.mkv
- Ensure you have a Plex Server running, and create a dedicated library named "Youtube" and point the library to Z:\Youtube
- After Plex has finished scanning the videos, the library will be completely disorganized. This is expected, we now need to create the collections.
- Run main.py config.json
This can take some time as the script pings your PlexServer for every video metadata in your Z:\Youtube library. Once completed, you should be able to find under the Collections tab a collection for every youtube channel in the library. Additionally, you will find the video files'smodified date
property to be changed to match the original Youtube video upload date. When I tested first-time runs, it takes about 15 minutes to generate the initial collection libraries. Then, for cron-job updates, it only takes about 5 minutes to run, as it only needs to download youtube channel avatars and banners, and create collections on the initial run.
- ✅ Optimize youtube channel scans. Currently we check the PlexServer for every single video in a channel folder. Even if the video was already added to the collection. Idea: After successfully parsing and adding videos to a Plex Collection, serialize the list and store it as a txt file in each respective channel. We can read in thefile every time the script runs so we only scan for new youtube video additions to the channel folder.
- ✅ Add more error retry checks. Currently the script will keep going if a video fails. But we should produce a log file of all of the video files it failed to load into Plex. Historically this is usually due to some weird special character in the youtubeVideo's file name.
- ✅ Create in-depth documentation for utilizing yt-dlp in conjunction with this script. The video files must be organized and titled correctly or this script will not work.
- ✅ Add a flag to automatically pull the Youtube Channl avatar and banner, and automatically set the Plex Collection cover art to these images (super cool)
- ✅ Implement unit tests using pytest
- ✅ Add Github Actions to Pull Requests