#1 Le 05/05/2026, à 21:39
- BBS
pOpcOrn - Client YouTube léger (GTK4 + MPV)
Salut,
Je cherche des volontaires pour tester la bêta de BBS pOpcOrn, un client YouTube pour Linux orienté simplicité et performance.
Readme
Retrouver une expérience de visionnage fluide sans dépendre d’un navigateur lourd ou d’une application Electron.
Approche technique
Interface : GTK4 + WebKitGTK (navigation YouTube)
Lecture vidéo : extraction via yt-dlp puis lecture dans MPV
Communication : IPC socket avec MPV
Pourquoi cette approche
Décodage matériel natif via MPV
Consommation CPU réduite
Séparation claire UI / lecture
Vie privée
Aucune télémétrie
Données locales uniquement (cookies, historique)
Pas de compte requis
Licence : GPL-3.0
Installation (Flatpak)
Prérequis MPV :
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install -y flathub io.mpv.MpvAjouter le dépôt :
flatpak remote-add --if-not-exists --from bbs-popcorn https://blacksamdev.github.io/BBS-Popcorn/bbs-popcorn.flatpakrepoInstaller :
flatpak install bbs-popcorn io.github.blacksamdev.PopcornRetours recherchés
Stabilité globale (GNOME / KDE)
Communication avec MPV (IPC)
Bugs graphiques (plein écran, transitions)
Comportement selon les configs matérielles
Code source
https://github.com/blacksamdev/BBS-Popcorn
Note : le nom est un clin d’œil personnel, mais le projet reste volontairement simple et transparent.
Dernière modification par BBS (Le 06/05/2026, à 00:20)
Hors ligne
#2 Le 06/05/2026, à 02:09
- tycooon

Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
Bonsoir
Installation OK aussi en "user" pour être cohérent avec l'ensemble de mes flatpak
flatpak remote-add --user --if-not-exists --from bbs-popcorn https://blacksamdev.github.io/BBS-Popcorn/bbs-popcorn.flatpakrepoflatpak install --user bbs-popcorn io.github.blacksamdev.PopcornHors ligne
#3 Le 06/05/2026, à 02:17
- krodelabestiole

Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
chouette projet ! (et bon choix de technos)
je teste demain (avec flatpak ceci dit ça m'étonnerait que le fonctionnement diffère beaucoup d'une machine à l'autre).
pour info il y a pas mal de projets pop corn (je ne sais pas si ça peut nuire au référencement ou apporter des embêtements) :
https://popcorntime.app/fr (en particulier) https://github.com/popcorntime
https://popcornflix.com/
https://pipoca.app/
https://play.google.com/store/apps/deta … ik.popcorn
https://play.google.com/store/apps/deta … ls.popcorn
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
Hors ligne
#4 Le 06/05/2026, à 03:43
- tycooon

Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
La fermeture de l'appli BBS pOpcOrn , mpv reste en arrière plan et l'appli aussi.
Il faut fermer mpv en arrière plan pour que tous les processus s'arrêtent
Peut être prévoir une amélioration pour klller tous les process en cours
Sinon la solution graphique de gnome fait le job :
MPV est toujours actif (--idle=yes)
olivier@olivier:~$ pgrep -a mpv
547345 mpv-bin --ytdl-format=bestvideo[height<=1080][vcodec^=avc1]+bestaudio/best[height<=1080] --cookies --hwdec=auto-safe --vo=gpu --gpu-api=opengl --force-window=no --idle=yes --input-ipc-server=/tmp/bbs-popcorn-mpv.sock --ontop=yes --title=BBS pOpcOrn - ${media-title} --volume=100 --msg-level=osd/libass=no --fullscreen=no --window-scale=0.80 --cookies-file=/home/olivier/.var/app/io.github.blacksamdev.Popcorn/data/bbs-popcorn/cookies.txtio.mpv.Mpv est toujours actif
io.github.blacksamdev.Popcorn est toujours actif
olivier@olivier:~$ flatpak ps
Instance PID Application Runtime
1300282473 547307 io.mpv.Mpv org.freedesktop.Platform
2232316736 547230 io.github.blacksamdev.Popcorn org.gnome.PlatformPopcorn lance MPV
MPV reste ouvert (--idle=yes)
socket /tmp/bbs-popcorn-mpv.sock reste actif
Popcorn attend
Flatpak considère tout encore actif
boucle jamais fermée
olivier@olivier:~$ ps aux | grep -i bbs
olivier 547245 0.0 0.0 3672 1632 ? S 02:26 0:00 bwrap --args 39 -- bbs-popcorn
olivier 547300 0.0 0.0 167124 6268 ? Sl 02:26 0:00 flatpak-spawn --host flatpak run --filesystem=/home/olivier/.var/app/io.github.blacksamdev.Popcorn/data/bbs-popcorn/cookies.txt:ro io.mpv.Mpv --ytdl-format=bestvideo[height<=1080][vcodec^=avc1]+bestaudio/best[height<=1080] --cookies --hwdec=auto-safe --vo=gpu --gpu-api=opengl --force-window=no --idle=yes --input-ipc-server=/tmp/bbs-popcorn-mpv.sock --ontop=yes --title=BBS pOpcOrn - ${media-title} --volume=100 --msg-level=osd/libass=no --fullscreen=no --window-scale=0.80 --cookies-file=/home/olivier/.var/app/io.github.blacksamdev.Popcorn/data/bbs-popcorn/cookies.txt
olivier 547307 0.0 0.0 3588 2104 ? Ss 02:26 0:00 bwrap --args 37 -- mpv --ytdl-format=bestvideo[height<=1080][vcodec^=avc1]+bestaudio/best[height<=1080] --cookies --hwdec=auto-safe --vo=gpu --gpu-api=opengl --force-window=no --idle=yes --input-ipc-server=/tmp/bbs-popcorn-mpv.sock --ontop=yes --title=BBS pOpcOrn - ${media-title} --volume=100 --msg-level=osd/libass=no --fullscreen=no --window-scale=0.80 --cookies-file=/home/olivier/.var/app/io.github.blacksamdev.Popcorn/data/bbs-popcorn/cookies.txt
olivier 547342 0.0 0.0 3704 1644 ? S 02:26 0:00 bwrap --args 37 -- mpv --ytdl-format=bestvideo[height<=1080][vcodec^=avc1]+bestaudio/best[height<=1080] --cookies --hwdec=auto-safe --vo=gpu --gpu-api=opengl --force-window=no --idle=yes --input-ipc-server=/tmp/bbs-popcorn-mpv.sock --ontop=yes --title=BBS pOpcOrn - ${media-title} --volume=100 --msg-level=osd/libass=no --fullscreen=no --window-scale=0.80 --cookies-file=/home/olivier/.var/app/io.github.blacksamdev.Popcorn/data/bbs-popcorn/cookies.txt
olivier 547345 0.0 0.5 1479864 69072 ? Sl 02:26 0:00 mpv-bin --ytdl-format=bestvideo[height<=1080][vcodec^=avc1]+bestaudio/best[height<=1080] --cookies --hwdec=auto-safe --vo=gpu --gpu-api=opengl --force-window=no --idle=yes --input-ipc-server=/tmp/bbs-popcorn-mpv.sock --ontop=yes --title=BBS pOpcOrn - ${media-title} --volume=100 --msg-level=osd/libass=no --fullscreen=no --window-scale=0.80 --cookies-file=/home/olivier/.var/app/io.github.blacksamdev.Popcorn/data/bbs-popcorn/cookies.txt
olivier 548400 0.0 0.0 9112 2452 pts/0 S+ 02:41 0:00 grep --color=auto -i bbsHors ligne
#5 Le 09/05/2026, à 00:49
- BBS
Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
Bonjour Olivier,
Merci pour ce retour très détaillé et les logs, c'est d'une aide précieuse.
Le problème venait effectivement de l'instance MPV en mode --idle=yes qui ne recevait pas l'ordre de se fermer, bloquant ainsi le processus parent de l'application.
Je viens de pousser un correctif qui gère proprement la fermeture de MPV et empêche le lancement de sessions multiples. Tu peux mettre à jour l'application avec la commande suivante :
flatpak update io.github.blacksamdev.PopcornN'hésite pas à me dire si tout rentre dans l'ordre de ton côté !
Hors ligne
#6 Le 09/05/2026, à 02:44
- tycooon

Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
OUI je testerai...
Hors ligne
#7 Le 09/05/2026, à 18:11
- tycooon

Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
Non rien à changer , en quittant popcorn l'appliaction mpv reste toujours en arrière plan.
Par ailleurs, pourquoi l’application ouvre 4 streams stéréo distincts vers pipeWire.
C'est peut être normal en termes d'architecture , c'est donc juste un constat afin de s'assurer que cette logique est bien celle attendue:
- 1 vrai stream mpv principal
- 4 streams WebKit auxiliaires
olivier@olivier:~$ pw-cli info 71 | grep -E "client|process|application"
* client.api = "pipewire-pulse"
* pipewire.client.access = "flatpak"
* application.name = "BBS pOpcOrn"
* application.process.id = "2"
* application.process.user = "olivier"
* application.process.host = "olivier"
* application.process.binary = "WebKitWebProcess"
* application.language = "fr_FR.UTF-8"
* application.process.machine-id = "50374720d1c64cd59dbefb4e15fb7e4e"
* client.id = "79"
olivier@olivier:~$ pw-cli info 77 | grep -E "client|process|application"
* client.api = "pipewire-pulse"
* pipewire.client.access = "flatpak"
* application.name = "BBS pOpcOrn"
* application.process.id = "2"
* application.process.user = "olivier"
* application.process.host = "olivier"
* application.process.binary = "WebKitWebProcess"
* application.language = "fr_FR.UTF-8"
* application.process.machine-id = "50374720d1c64cd59dbefb4e15fb7e4e"
* client.id = "79"
olivier@olivier:~$ pw-cli info 85 | grep -E "client|process|application"
* client.api = "pipewire-pulse"
* pipewire.client.access = "flatpak"
* application.name = "BBS pOpcOrn"
* application.process.id = "2"
* application.process.user = "olivier"
* application.process.host = "olivier"
* application.process.binary = "WebKitWebProcess"
* application.language = "fr_FR.UTF-8"
* application.process.machine-id = "50374720d1c64cd59dbefb4e15fb7e4e"
* client.id = "79"
olivier@olivier:~$ pw-cli info 86 | grep -E "client|process|application"
* client.api = "pipewire-pulse"
* pipewire.client.access = "flatpak"
* application.name = "BBS pOpcOrn"
* application.process.id = "2"
* application.process.user = "olivier"
* application.process.host = "olivier"
* application.process.binary = "WebKitWebProcess"
* application.language = "fr_FR.UTF-8"
* application.process.machine-id = "50374720d1c64cd59dbefb4e15fb7e4e"
* client.id = "79"
olivier@olivier:~$ $ wpctl status
PipeWire 'pipewire-0' [1.0.5, olivier@olivier, cookie:1305304185]
└─ Clients:
32. pipewire [1.0.5, olivier@olivier, pid:2532]
34. WirePlumber [1.0.5, olivier@olivier, pid:2525]
35. WirePlumber [export] [1.0.5, olivier@olivier, pid:2525]
60. gnome-shell [1.0.5, olivier@olivier, pid:2792]
61. GNOME Shell Volume Control [1.0.5, olivier@olivier, pid:2792]
62. GNOME Volume Control Media Keys [1.0.5, olivier@olivier, pid:2989]
63. xdg-desktop-portal [1.0.5, olivier@olivier, pid:3351]
64. qpwgraph [1.0.5, olivier@olivier, pid:8740]
65. wpctl [1.0.5, olivier@olivier, pid:8868]
79. BBS pOpcOrn [1.0.5, olivier@olivier, pid:2]
82. Terminal [1.0.5, olivier@olivier, pid:8719]
96. Mutter [1.0.5, olivier@olivier, pid:2792]
Audio
├─ Devices:
│ 43. Built-in Audio [alsa]
│ 44. Loopback [alsa]
│
├─ Sinks:
│ 33. Loopback Stéréo analogique [vol: 0.40]
│ * 49. Built-in Audio Stéréo analogique [vol: 0.25]
│
├─ Sink endpoints:
│
├─ Sources:
│ 48. Loopback Stéréo analogique [vol: 1.00]
│ * 50. Built-in Audio Stéréo analogique [vol: 1.00]
│
├─ Source endpoints:
│
└─ Streams:
71. BBS pOpcOrn
75. output_FL > SN6140 Analog:playback_FL [init]
88. output_FR > SN6140 Analog:playback_FR [init]
77. BBS pOpcOrn
73. output_FR > SN6140 Analog:playback_FR [init]
90. output_FL > SN6140 Analog:playback_FL [init]
85. BBS pOpcOrn
69. output_FL > SN6140 Analog:playback_FL [init]
83. output_FR > SN6140 Analog:playback_FR [init]
86. BBS pOpcOrn
70. output_FL > SN6140 Analog:playback_FL [init]
80. output_FR > SN6140 Analog:playback_FR [init]
Video
├─ Devices:
│ 42. Iriun Webcam [v4l2]
│
├─ Sinks:
│
├─ Sink endpoints:
│
├─ Sources:
│
├─ Source endpoints:
│
└─ Streams:
Settings
└─ Default Configured Node Names:
0. Audio/Sink gnome_network_displays_gnome-ne
1. Audio/Source bluez_input.C0_86_B3_85_4F_4A.0Dernière modification par tycooon (Le 09/05/2026, à 20:10)
Hors ligne
#8 Le 10/05/2026, à 17:44
- BBS
Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
Bonne observation, et merci pour le temps que tu y consacres — les retours détaillés avec logs et commandes comme les tiens sont vraiment précieux pour ce genre de projet.
Sur MPV en arrière-plan : le bug avait effectivement été corrigé une première fois, mais il est réapparu lors du travail sur la reprise de lecture. La cause technique : l'architecture utilise un socket IPC Unix pour communiquer avec MPV. En déplaçant ce socket de /tmp (privé dans le sandbox Flatpak) vers ~/.var/app/io.mpv.Mpv/ (accessible par les deux sandboxes), la reprise de lecture a pu être implémentée — mais cela a cassé la commande pkill qui ciblait l'ancien chemin. Le tout est maintenant stabilisé.
Sur les 4 streams WebKit : la question est légitime. En théorie on pourrait limiter le nombre de WebProcess via WebKit.WebContext.set_process_count_limit(1), ce qui réduirait potentiellement ces contextes audio. Mais en pratique ces 4 streams sont tous en état [init] — ils sont enregistrés auprès de PipeWire mais ne traitent aucun audio. La consommation réelle est négligeable. Toucher à l'architecture multi-process de WebKit pour un gain marginal présente plus de risques de stabilité que de bénéfices. En mode éco (WebAudio désactivé), ils persistent quand même — c'est WebKit qui les crée, pas le code.
Hors ligne
#9 Le 11/05/2026, à 01:41
- tycooon

Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
Excellent, très belle prouesse ! L'application fonctionne parfaitement et la fermeture de l’application ne laisse plus aucun processus en arrière-plan.
J’ai bien compris la problématique liée à WebKit : s’il y a effectivement plus de risques que de bénéfices, le jeu n’en vaut pas la chandelle.
Je me plaçais simplement du point de vue d’un utilisateur lambda et, d’un point de vue esthétique, dans les paramètres audio avec l’extension Quick Settings Audio Panel, le nombre de streams peut être un peu déroutant. Mais personnellement, je n’en fais pas une affaire d’État au vu de ce que réalise cette application.
Hors ligne
#10 Le 11/05/2026, à 03:39
- BBS
Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
Merci beaucoup pour ce retour, ça fait vraiment plaisir !
Tu soulèves un point pertinent concernant l’aspect visuel dans les paramètres audio. L’expérience utilisateur est effectivement importante. Même si cela n’a pas d’impact fonctionnel, voir quatre streams “BBS pOpcOrn” peut prêter à confusion. C’est typiquement le genre de détail difficile à repérer seul, et c’est précisément pour cela que ce type de retour est utile.
Je vais garder cela en tête et voir s’il est possible de limiter ces workers de manière propre, sans introduire de régression.
N’hésite pas à signaler d’autres points ou à proposer des améliorations de fonctionnalités.
Hors ligne
#11 Le 13/05/2026, à 23:27
- BBS
Re : pOpcOrn - Client YouTube léger (GTK4 + MPV)
Première version stable — toutes les fonctionnalités prévues sont implémentées et les bugs connus de la bêta sont corrigés.
Corrections
Fermeture de l'application
MPV restait actif en arrière-plan après fermeture — corrigé via kill_all_mpv() et signal close-request GTK (merci tycooon)
Le processus pOpcOrn lui-même ne se terminait pas — corrigé avec self.quit() + Gio.ApplicationFlags
Plusieurs instances de MPV pouvaient s'accumuler — le socket IPC est maintenant ciblé précisément
Communication IPC avec MPV
Le socket IPC utilisait /tmp (privé dans le sandbox Flatpak) — déplacé vers ~/.var/app/io.mpv.Mpv/ accessible par les deux sandboxes
Broken pipe lors du chargement d'un fichier traité comme une erreur — corrigé, c'est un comportement normal de MPV
La fenêtre WebKit ne revenait pas après fin naturelle d'une vidéo — corrigé via un événement _playback_ended déclenché par le tracking IPC
Historique
Le titre affiché était "YouTube" au lieu du titre de la vidéo — remplacé par une récupération asynchrone via yt-dlp
yt-dlp dans le sandbox Flatpak utilisait un mauvais wrapper — remplacé par le binaire standalone officiel
Reprise de lecture
Les URLs YouTube contiennent des paramètres de tracking (pp=, si=) qui changeaient à chaque session — normalisées via urllib.parse pour ne conserver que v= et list=
La position n'était pas appliquée au relancement via IPC — corrigé avec un seek absolute après le premier time-pos valide
Stabilité
Instance unique : plusieurs lancements simultanés pouvaient créer plusieurs fenêtres — corrigé avec Gio.ApplicationFlags.DEFAULT_FLAGS
Nouvelles fonctionnalités
Mode éco WebKit : WebGL et WebAudio désactivés, Shorts redirigés vers MPV — accessible dans les réglages ⚙
Installation native : Makefile + wrapper-native.sh pour une installation sans Flatpak
Détection automatique Flatpak/natif dans updater.py — plus besoin de patch pour les builds natifs (merci Christophe !)
README bilingue français / anglais
Améliorations
La fenêtre WebKit se cache uniquement quand MPV joue réellement — supprime le gap visuel noir entre les deux fenêtres
Détection de fin de lecture accélérée (polling 1s au lieu de 5s) — la fenêtre WebKit revient en ~2s
Socket IPC pré-chauffé utilisé systématiquement — délai de lancement réduit
Navigation
Interface YouTube complète via WebKitGTK — recherche, recommandations, chaînes, Shorts, tout fonctionne comme dans un navigateur classique.
Lecture vidéo
La lecture est déléguée à MPV avec décodage matériel automatique (VAAPI/VDPAU). MPV étant un lecteur natif, les publicités YouTube ne sont pas lues — effet de bord bienvenu, non garanti selon les évolutions de YouTube.
Qualité cible configurable : 480p / 720p / 1080p / 1440p / 2160p
Mode fenêtré ou plein écran, taille ajustable
Retour automatique à l'interface YouTube après la lecture
Historique et reprise
Fonctionne quelle que soit la page YouTube d'origine (page d'accueil, recherche, chaîne...)
Confidentialité
Aucune télémétrie, aucun serveur tiers. Tout reste local : cookies, historique, positions de reprise.
SponsorBlock : Saut automatique des segments sponsorisés dans les vidéos (désactivé par défaut, activable dans les réglages ⚙).
Dernière modification par BBS (Le 13/05/2026, à 23:37)
Hors ligne

