Introducción a Invidious

Seguindo co proxecto de aplicacións auto aloxadas, vamos a instalar o Invidious. Trátase dun servidor para buscar e mostrar contenidos de Youtube. Podemos facer que os vídeos de Youtube se amosen a través deste aplicativo.
Pero, por qué é isto interesante? Para comezar, como de costume, por privacidade. Xa que por un lado non almacenaremos cookies, nin nos autobombardearemos con videos relacionados. Ademais ao telo da nosa man, podemos igualmente suscribirnos a canles ou crear listas de reproducción, sen precisar unha conta de Google. Por outra banda, dun tempo a esta parte, está demostrado que Youtube penaliza o rendemento cando usamos Firefox, ralentizando a carga dos vídeos e disparando a CPU. Así pois deste xeito podemos evitar estes inconvintes. Ademais ca axuda un complemento do Firefox, podemos ver a través das instancias de invidious ata os vídeos incrustrados noutras webs. O complemento en cuestión é Privacy Redirect. Este complemento non só redirixe de Youtube a Invidious, tamén o fai con Twitter, Instagram e Google Maps. Aínda que supoño que a redirección de Twitter a Nitter xa non funcionará, polas restriccións de X. Google Maps, será redirixido a OpenStreetMap.

Xa presentado por riba Invidious e comentado o complemento, imos ver como instalaremos a nosa instancia.

Instalación de Invidious usando Docker-compose

Para o proxecto de aplicacións auto aloxadas, instalaremos o Invidious usando docker. Durante a instalación e probas da aplicación, tiven problemas ca carga de vídeos. Podía buscar videos e ver as miniaturas. Pero cando tentaba cargar un vídeo obtiña un erro que indicaba que o vídeo cargado non era o que buscaba. Facendo unha busca por internet do erro, parece que é algo que pode ocorrer por cambios na API de Youtube. Pero soe ser rapidamente solucionado polo equipo de Invidious. Así que ao igual que con SearXNG, usarei a imaxe máis actual do proxecto, é dicir latest.
Cabe sinalar ademais que as imaxes de Invidious non están aloxadas en Docker Hub, se non en Quay. Segúndo dín na propia documentación, isto fano porque Quay é Software libre e aberto. Así pois usarei a imaxe oficial.

Como nota engadir simplemente o seguinte. Cando me dou o erro ao reproducir vídeos, non foi suficiente con tirar e erguer o contenedor. Para que nos colla a última versión da imaxe, temos que forzar que constrúa as imaxes. Xa sexa con docker-compose up -d --build, ou aproveitando a facer limpeza e borrando as imaxes vellas que teñamos descargadas.

Finalmente, entón, o noso docker-compose.yaml quedaría do seguinte xeito.

version: "3.7"
services:
  invidious:
    # image: quay.io/invidious/invidious:latest
    image: quay.io/invidious/invidious:latest-arm64 # ARM64/AArch64 devices
    container_name: invidious
    init: true
    restart: unless-stopped
    mem_limit: 1024M
    cpus: 0.5
    environment:
      INVIDIOUS_CONFIG: |
        channel_threads: 1
        check_tables: true
        feed_threads: 1
        db:
          dbname: ${DATABASE_NAME:-invidious}
          user: ${DATABASE_USER:-invidious}
          password: ${DATABASE_PASSWORD:-invidious}
          host: invidious-db
          port: ${DATABASE_PORT:-5432}
        full_refresh: false
        https_only: false
        popular_enable: false
        statistics_enable: false
        domain: ${DOMAIN:-localhost}
        port: ${BASE_PORT:-8081}
        external_port: ${EXTERNAL_PORT:-8081}
        registration_enabled: ${ALLOW_NEW_USERS:-false}
        login_enabled: true
        captcha_enabled: false
        admins: []
        disable_proxy: false
        geo_bypass: false
        hmac_key: ${HMAC_KEY:-CHANGEME}
        playlist_length_limt: ${PLAYLIST_MAX_LENGTH:-500}
        default_home: Subscriptions
        # Loads next video
        continue: true
        # Autoplays next video
        continue_autoplay: true
        # Play videos in Audio-only mode by default
        listen: ${AUDIO_ONLY_DEFAULT:-false}        
        feed_menu: ["Subscriptions", "Playlists"]
    logging:
      options:
        max-size: "1G"
        max-file: "2"
    depends_on:
      - invidious-db
    networks:
      - proxy
      - invidious
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.invidious.entrypoints=http"
      - "traefik.http.routers.invidious.rule=Host(`${DOMAIN:-localhost}`)"

  invidious-db:
    image: docker.io/library/postgres:14
    container_name: invidious-db
    init: true
    restart: unless-stopped
    volumes:
      - ../../invidious/postgresdata:/var/lib/postgresql/data
      - ../../invidious/config/sql:/config/sql
      - ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
    environment:
      POSTGRES_DB: ${DATABASE_NAME:-invidious}
      POSTGRES_USER: ${DATABASE_USER:-invidious}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD:-invidious}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
    networks:
      - invidious

volumes:
  postgresdata:

networks:
  proxy:
    name: proxy
    external: true
  invidious:
    name: invidious

Desta vez é un ficheiro un tanto longo, pero imos proceder a explícalo. Coma sempre a primeira liña indica a versión de docker-compose a usar. Rematarei por quitala de todo-los contenedores, xa que hoxe en día están a avisar de que vai quedar obsoleta (deprecated). Neste caso precisamos de dous servizos, que serán o propio invidious e a base de datos para o mesmo, neste caso unha postgresql. Voume saltar algunhas liñas que xa foron explicadas, repetidamente, noutros artigos.

Servizo Invidious: configuración

  • image: como podemos ver teño unha comentada, esta será por se quero erguer o contenedor no meu equipo, pero temos xa descomentada a que se vai utilizar na Raspberry.
  • mem_limit: limitamos o consumo do contenedor a 1GB de memoria.
  • cpus: limitamos o consumo do contenedor a 0.5 CPU.

No tocante a imaxe, as variáveis de entorno de invidious, tamén me cinguirei a aquelas máis interesantes e menos obvias.

  • domain: será o host no que está aloxada a instancia.
  • port: o porto no que a aplicación escoitará as peticións.
  • external_port: en caso de que esteamos tras un proxy, este será o porto exporto no mesmo.
  • registration_enabled: activa o registo de novos usuarios.
  • login_enabled: activa o login de usuarios existentes.
  • captcha_enabled: activa o captcha para novos usuarios.
  • admins: lista de usuarios adminitrativos, con permisos para mudar as configuracións do servidor.
  • disable_proxy: desactiva o proxy.
  • geo_bypass: desactiva o bypass de geolocalización.
  • hmac_key: clave HMAC para encriptar os datos de sesión. Será unha cadea de texto plano, no meu caso xeréi un UUID.
  • playlist_length_limt: limita o número de elementos na playlist.
  • default_home: menu por defecto cando entramos na web, no meu caso escollín as subscripcións.
  • continue: habilita a carga do seguinte vídeo ao rematar o actual.
  • continue_autoplay: activa o autoplay do seguinte video.
  • listen: habilita o modo de só audio por defecto.
  • feed_menu: indica que opcións queremos que saian na pantalla inicial. No meu caso elimino Popular e Trending, xa que non me soen interesar os vídeos recomendados por algoritmos.

Para rexistrar erros e funcionamento, por se queremos revisar algo, activo o login que almacenará dous arquivos de ata 1GB cada un.

As opcións para Traefik neste caso son as básicas. Habilitar Traefik, indicar que imos acceder por http (a miña Raspberry non está aberta ao mundo) e o host. Desafortunadamente, non puiden facer que Invidious fose accesible por ruta, tipo http://raspberry.local:8081/invidious. Xa que no proxecto non o soportan, aducindo que hoxe en día os subdominios son de balde e que requeriría moito traballo habilitalo. Máis información sobre isto neste fío.

Servizo invidious-db: configuración

Sobre a base de datos pouco que comentar, veñen ser as configuracións de sempre. Así que resaltaremos únicamente o apartado healthcheck. Que executa unha proba para comprobar que a base de datos está operativa.

Ficheiro .env.dist

BASE_PORT=3000
EXTERNAL_PORT=8081
BASE_HOSTNAME=127.0.0.1
DATABASE_NAME=invidious
DATABASE_USER=invidious
DATABASE_PASSWORD=invidious
DATABASE_PORT=5432
DOMAIN=localhost
DOMAIN_PATH=videos
ALLOW_NEW_USERS=false
PLAYLIST_MAX_LENGTH=500
AUDIO_ONLY_DEFAULT=true
HMAC_KEY=CHANGEME

Con esta configuración para acceder ao servizo web dende outro equipo, na nosa rede, escribiríamos http://raspberry.local:8081/. E xa estaríamos dentro, como podemos ver na seguinte imaxe:
Imaxe de Invidious

Conclusión

Con esta aplicación teño case toda a funcionalidade de Youtube, sen os inconvintes como sobrecargar a CPU ou o rastrexo das miñas preferencias. Ata o momento a única pega que lle vexo é que no caso dos shorts estes non aparecen nas subscripcións. Pero non me amola, porque no meu caso nas canles sigo, soen usar as curtas como avance para vídeos maiores.

Bibliografía

Artigo de Invidious na Wikipedia: https://en.wikipedia.org/wiki/Invidious
Wikidata de Invidious: https://www.wikidata.org/wiki/Q16868796
Sitio oficial Invidious: https://invidious.io/
Repositorio de imaxes de Invidious: https://quay.io/repository/invidious/invidious
Exemplo de configuración de Invidious: https://github.com/iv-org/invidious/blob/master/config/config.example.yml