---
title: Pinchflat
created: 2026-06-07
updated: 2026-06-07
type: app
tags: [catalogue, downloads, youtube, yt-dlp, media-server, python, elixir]
confidence: high
contested: false
sources: [https://selfh.st/apps/?tag=downloads, https://github.com/kieraneglin/pinchflat]
---

# 📌 Pinchflat

> **Téléchargeur YouTube moderne** écrit en Elixir/Phoenix, conçu pour suivre des chaînes et playlists avec une **UI soignée**, des **profils de qualité**, un **système de notifications** (Discord, Telegram, Apprise) et une **intégration native Jellyfin/Plex**. Le petit nouveau qui monte face à TubeSync et ytdl-sub.

| Métadonnée | Valeur |
| :--- | :--- |
| **Site web** | [https://pinchflat.dev](https://pinchflat.dev) |
| **GitHub** | [https://github.com/kieraneglin/pinchflat](https://github.com/kieraneglin/pinchflat) |
| **License** | MIT |
| **Langage** | Elixir (Phoenix LiveView) |
| **Étoiles** | 144 ⭐ |
| **Dernière MAJ** | 2025-12 |
| **Catégorie** | [[cat-downloads\|Downloads]] |

## Description

**Pinchflat** est né d'un constat partagé par les self-hosters : `yt-dlp` est puissant mais **l'orchestration autour est pénible** — planifier les synchros, gérer les résolutions, nettoyer les vidéos déjà vues, notifier quand un fichier est prêt, déclencher le scan Jellyfin. Pinchflat encapsule tout ça dans une **seule application Elixir/Phoenix LiveView** élégante, sans la dette d'un vieux projet Python.

Chaque **MediaProfile** définit un couple (résolution, format, arguments `yt-dlp` supplémentaires) et chaque **Source** (chaîne, playlist, chaîne d'utilisateur, URL unique) y est rattachée. Pinchflat **surveille la source** selon une fréquence configurable, télécharge les nouvelles vidéos, et applique un **post-traitement** : déplacement, hardlink, déclenchement d'un webhook Jellyfin/Plex, notification Discord. Le tout avec un système de **progression en temps réel** dans l'UI (LiveView = WebSocket).

Fonctionnalités distinctives : **tasks concurrentes configurables** (par défaut 2, à monter selon la machine), **re-download** d'une vidéo si on change le profil, **blacklist** par mot-clé, **résolution minimale/maximale**, **cookies YouTube**, **SponsorBlock** (skip des sponsors), **sous-titres** (auto-download ou burn-in), **notifications Apprise** (90+ destinations), et **page de détails** riche (vignette, métadonnées, log de téléchargement).

**Points forts** : UI moderne (LiveView = pas de reload), très rapide (Elixir/OTP), bien documenté, MIT, **multi-utilisateurs** avec rôles.

**Points faibles** : encore jeune (~144 ⭐), Elixir est plus rare que Python (bus factor à surveiller), pas d'app mobile, pas de gestion native de podcasts/au-delà de YouTube.

## Installation

### Via Docker (recommandé)

```yaml
# docker-compose.yml
services:
  pinchflat:
    image: ghcr.io/kieraneglin/pinchflat:latest
    container_name: pinchflat
    restart: unless-stopped
    environment:
      - TZ=Europe/Paris
      - SECRET_KEY_BASE=change-me-very-long-random
      - DEFAULT_HOST=pinchflat.example.com
      - DATABASE_PATH=/app/data/pinchflat.db
    volumes:
      - ./config:/app/config
      - ./data:/app/data
      - /mnt/media/youtube:/downloads    # bibliothèque YouTube
    ports:
      - "8945:8945"
```

### Installation manuelle

Elixir 1.15+ et OTP 26+. `git clone`, `mix deps.get`, `mix ecto.migrate`, `mix phx.server`. Pour la prod, compilez une release `mix release` et lancez `./bin/pinchflat start`.

## Configuration

1. Créer le compte admin au premier lancement (`http://localhost:8945`).
2. **Media Profile** : créer au moins un profil (ex. "1080p H264" : `-f "bv*[height<=1080]+ba/b" --merge-output-format mp4`).
3. **Source** : coller l'URL d'une chaîne/playlist, choisir le MediaProfile, fréquence (60 min par défaut), dossier de sortie.
4. **Cookies YouTube** (recommandé) : `Settings → Cookies` → coller le contenu de `cookies.txt` (pas besoin de monter un fichier).
5. **Webhook Jellyfin** : `Settings → Webhooks` → `http://jellyfin:8096/Library/Refresh` sur événement `media_downloaded`.
6. **Notifications Apprise** : URL `Apprise://` (Discord, Telegram, Slack, Gotify…).
7. **Reverse proxy** : `pinchflat.example.com` via Caddy/Traefik + Authelia.

## Alternatives

### Open source
- [[app-tubesync]] — le "vétéran", Python + Go, plus mature
- [[app-ytdl-sub]] — orienté config YAML, idéal pour "subscriptions first"
- [[app-metube]] — UI web ponctuelle pour `yt-dlp`, pas de synchro
- [[app-hometube]] — pont YouTube ↔ Jellyfin, plus orienté player
- [[app-jellyfin]] — media server qui scanne la sortie de Pinchflat
- [[app-lidarr]] / [[app-radarr]] — pour la musique/films, orthogonal

### Propriétaires
- **YouTube Premium "Library"** — pas de feature équivalente,只能在 YouTube app
- **Plex Watch Later** — lié à un compte Plex, pas de gestion fine
- **iCloud + Raccourcis** — bricolage sans rapport

## Sécurité

- ⚠️ **SECRET_KEY_BASE** : 64 octets random, ne JAMAIS régénérer en prod (invalide les sessions).
- ⚠️ **Cookies YouTube** :泄露 = vol de compte Google. Pinchflat les stocke en DB — chiffrer le volume `./data`.
- ✅ **HTTPS obligatoire** via reverse-proxy + HSTS.
- ✅ **Authentification multi-utilisateurs** avec rôles (admin, viewer).
- ⚠️ **Rate-limit YouTube** : configurer des fréquences raisonnables (1h minimum par source).
- ⚠️ **Espace disque** : prévoir monitoring — une chaîne 4K peut consommer 50-100 Go/mois.
- ✅ **Sauvegardes** : `./data/pinchflat.db` (SQLite) — petit, à inclure dans le backup nocturne.

## Ressources
- [Site officiel](https://pinchflat.dev)
- [Documentation](https://docs.pinchflat.dev)
- [Wiki](https://github.com/kieraneglin/pinchflat/wiki)
- [selfh.st — Downloads](https://selfh.st/apps/?tag=downloads)

## Pages Liées
- [[cat-downloads]] — Catégorie parente
- [[app-tubesync]] — Concurrent mature Python
- [[app-ytdl-sub]] — Concurrent orienté subscriptions
- [[app-jellyfin]] — Media server cible
- [[app-plex]] — Media server cible alternatif
- [[recettes-docker-compose]] — Templates Docker
- [[securisation-home-lab]] — Bonnes pratiques
