Making My Own YouTube With ytdl-sub and Jellyfin

YouTube is an amazing place. Where else can you watch someone replace the batteries in an electric mower, go in-depth on a decades-old adventure game, or just experience a low-poly rat spinning forever? YouTube is also the absolutely worst place for watching these videos. The apps have gotten more and more aggressive about pushing its users towards a kind of passive consumption that revolves around its algorithms, to the detriment of anybody wanting to curate their experience.

And I absolutely hate it.

As much as I understand that “doomscrolling”—mindlessly consuming an endless stream of inconsequential content—perfectly aligns with the interests of the companies behind the attention economy, I pay for YouTube Premium and to me a “premium” experience is for them to leave me the fuck alone. They’ve added an “Up Next” box that overlays the video 30 seconds before it ends; huge banners show up promoting YouTube Playables, rentable films, or themed events; Shorts appear in new and unexpected ways like a malignant cancer; and there is now an algorithmic “Most Relevant” section in the Subscriptions page. All changes that are focused around less conscientious curation.

As much as this frustrates me, this is in the end a Google product, and data harvesting and user manipulation is how they built their empire. So any plea to let us disable these “features” will fall on deaf, disinterested ears. But I still want to keep watching these videos, and if I want to do so without having Google boiling me to death I have to get what I want to watch off of YouTube. Which I have now done thanks to ytdl-sub and Jellyfin.

ytdl-sub is a Python-based CLI tool that reads a YAML formatted config file and downloads videos using the venerated yt-dlp program. You give it a list of channels or playlists, set some preferences, point it at a directory and it’ll go out and get the videos for you. It keeps track of which videos have been downloaded to avoid duplicate work, spaces out requests to prevent the downloads getting throttled, and also retrieves screenshots and other metadata.

Its built on this idea of presets which determine how the channels/videos are handled and what data format the metadata is stored in. Two that I’ve found useful to combine are Jellyfin TV Show by Date and Chunk Downloads which results in folders containing filenames and NFO files formatted to be read by Jellyfin, both for the channel and the videos, where the videos are downloaded by one by one starting with the oldest.

__preset__:
  overrides:
    episode_title: "{title}"
    tv_show_directory: "/Volumes/media/YouTube/"  # where the videos will live
  match_filters:
    filters:
      - "original_url!*=/shorts/ & !is_live"  # no shorts or live videos

Jellyfin TV Show by Date | Chunk Downloads:
  = Gaming:  # the genre for the "TV show"
    "Civvie 11": "https://www.youtube.com/@Civvie11"
    "Grimbeard": "https://www.youtube.com/@gothgamernation"
    "Majuular": "https://www.youtube.com/@Majuular"
    "Moon Channel": "https://www.youtube.com/@moon-channel"
    "noclip": "https://www.youtube.com/@NoclipDocs"
  = Essays:
    "Folding Ideas": "https://www.youtube.com/@FoldingIdeas"
    "hbomberguy": "https://www.youtube.com/@hbomberguy"
    "Shaun": "https://www.youtube.com/@Shaun_vids"

There are other means to download YouTube videos for personal archival reasons, including Pinchflat and TubeArchivist, but I specifically wanted something more hands-on. I was leaning towards building something myself, but found that ytdl-sub does exactly what I need it to.

Jellyfin, which I am going to assume you’re familiar with, is the media server of choice if you want to build your own video collection. Pointing a TV Show library towards the same directory that ytdl-sub is using will result in the videos showing up as episodes of a TV Show with the same name as the channel/playlist.

A screenshot of my Jellyfin installation showing a list of YouTube channels as TV Shows.

The end result is that I have a script that I run periodically which populates a NAS with videos that I can watch at my leisure. I guess the question surrounding all of this is: is it all worth it? It sometimes feels like all this effort I put into blocking ads, skipping over “for you” sections, disallowing suggestions, unsubscribing from mailing lists, etc. is just evidence of some misguided mania. I want to watch the videos and read the articles and listen to the music, but I staunchly refuse to do it on these modern platforms. I feel like a hermit who comes down from the mountains once a week, pays for a handful of videos with torn and soggy bills, and drags them up the precarious path to my log cabin so I can watch them in solitude.

I also want to address an ethical consideration: The creators behind these videos chose to upload them to YouTube, so it may not be exactly appropriate that I am wilfully extracting them off the platform just because the platform infuriates me. They will be robbed of the potential revenue that my viewership brings, so it feels disrespectful to do what is essentially video piracy.

To ameliorate this I’ve decided that I will only download videos from channels which I support via Patreon or some other platform. I’m doing all this because I enjoy their videos, so I also want to make sure I’m supporting the creators for their work.

But I gotta say… it’s pretty nice out here. The experience of browsing through the videos I’ve curated myself without anything trying to grab my attention is a peaceful experience. There are no popups while the video is playing and when it’s done I am left to pick the next one at my leisure. The app also remembers which video I was previously on if I go back to the channel after watching it, meaning I don’t have to scroll again from the top as I have to do on every official YouTube app. At this point, I’m going to assume that is a feature instead of a bug meant to be abrasive for weirdos like me who don’t want to succumb to the Autoplay. Well, then fuck them; I’ll just make my own YouTube ♡


  1. These can be dismissed with a condescending “Got it! We’ll tune your recommendations”, but will inevitably return because Google and its contemporaries don’t understand what consent means.
  2. “Most relevant” to what?? I sure do love getting A/B tested for what will make me finally relent and let them decide for me what I should be watching.
  3. Like filtering out fucking Shorts.
  4. Trying very hard to not invoke the E word.
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论