Between toxic algorithms, intrusive ads, and pervasive tracking, the YouTube viewing experience is untenable. Their greedy, single-minded focus on advertising dollars has corrupted the user experience to the point that intrepid open source developers created the tools below. The goal here is to download YouTube videos and consume them without suggestion algorithms or comments, and play them through the Jellyfin media player so a separate app (YouTube or otherwise) is not required.

Tools like yt-dl exist, but these are not user-friendly enough for family use. My requirements are:

  • Web-based interface, simple to use
  • Automatic downloading of new videos from subscribed channels
  • Automatic cleanup of old / watched videos to limit amount of space used
  • Compatibility with jellyfin-youtube-metadata-plugin format requirements (so that downloaded videos show in Jellyfin with thumbnails and pretty titles)

The end user experience should be: Open Jellyfin, Browse to “YouTube”, See lists of thumbnail’d videos, click, play.

Tubearchivist

  tubearchivist:
    container_name: tubearchivist
    restart: unless-stopped
    image: bbilly1/tubearchivist
    ports:
      - 8000:8000
    volumes:
      - /mnt/user/media/youtube:/youtube
      - cache:/cache
    environment:
      - ES_URL=http://archivist-es:9200     # needs protocol e.g. http and port
      - REDIS_HOST=archivist-redis          # don't add protocol
      - HOST_UID=1000
      - HOST_GID=1000
      - TA_HOST=10.0.50.10         # set your host name
      - TA_USERNAME=tubearchivist           # your initial TA credentials
      - TA_PASSWORD=verysecret              # your initial TA credentials
      - ELASTIC_PASSWORD=verysecret         # set password for Elasticsearch
      - TZ=America/New_York                 # set your time zone
    depends_on:
      - archivist-es
      - archivist-redis
  archivist-redis:
    image: redislabs/rejson                 # for arm64 use bbilly1/rejson
    container_name: archivist-redis
    restart: unless-stopped
    expose:
      - "6379"
    volumes:
      - redis:/data
    depends_on:
      - archivist-es
  archivist-es:
    image: bbilly1/tubearchivist-es         # only for amd64, or use official es 8.5.1
    container_name: archivist-es
    restart: unless-stopped
    environment:
      - "ELASTIC_PASSWORD=verysecret"       # matching Elasticsearch password
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "xpack.security.enabled=true"
      - "discovery.type=single-node"
      - "path.repo=/usr/share/elasticsearch/data/snapshot"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es:/usr/share/elasticsearch/data    # check for permission error when using bind mount, see readme
    expose:
      - "9200"

volumes:
  cache:
  redis:
  es: