Forum Programmation.python [v0.1.0] BBS pOpcOrn 🍿 – Client YouTube lĂ©ger (GTK4 + MPV)

Posté par  . Licence CC By‑SA.
Étiquettes :
3
5
mai
2026

Salut Ă  tous,

Je cherche quelques volontaires pour tester la bĂȘta de BBS pOpcOrn, un client YouTube pour Linux orientĂ© simplicitĂ© et performance.

Readme

L'Objectif

Retrouver une expĂ©rience de visionnage fluide sans dĂ©pendre d’un navigateur lourd ou d’une application Electron.

La technique

L'approche est hybride pour maximiser l'efficacité :

  • Interface : GTK4 + WebKitGTK (navigation Youtube)
  • Lecture : extraction via yt-dlp puis lecture dans MPV
  • SponsorBlock supportĂ© (dĂ©sactivĂ© par dĂ©faut)

Points clés

  • AccĂ©lĂ©ration matĂ©rielle via MPV
  • Faible consommation CPU
  • DonnĂ©es locales uniquement (pas de tĂ©lĂ©mĂ©trie, pas de compte)
  • Licence GPL-3.0

Installation (via Flatpak)

. Installer MPV (prérequis)

flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak install -y flathub io.mpv.Mpv

. Ajouter le dépÎt BBS pOpcOrn

flatpak remote-add --if-not-exists --from bbs-popcorn https://blacksamdev.github.io/BBS-Popcorn/bbs-popcorn.flatpakrepo

. Installer et lancer l'application

flatpak install bbs-popcorn io.github.blacksamdev.Popcorn

đŸ§Ș Tests recherchĂ©s

  • Communication GTK ↔ MPV (IPC socket).
  • StabilitĂ© GNOME / KDE.
  • Bugs graphiques (fullscreen, transitions)
  • Comportement selon les configs matĂ©rielles

DépÎt GitHub : https://github.com/blacksamdev/BBS-Popcorn

Merci d'avance pour vos retours et bons tests ! đŸżđŸŽâ€â˜ ïž

  • # Alternative Ă  Flatpak ?

    Posté par  . Évalué à 9 (+7/-0).

    Bonne idĂ©e, en effet les apps Electrons peuvent ĂȘtre assez lourdes


    Mais du coup, serait-il possible de proposer une autre méthode d'installation que Flatpak ? Personnellement je ne l'utilise pas, et du coup installer toute la base Gnome (et donc charger ses libs en mémoire) ne me tente pas plus qu'une app Electron.

    Apparemment le triptique mpv/yt-dlp/bbs-popcorn s'installe plutĂŽt simplement, il y a peut-ĂȘtre moyen de juste proposer un Makefile (ou Ă©quivalent cmake ou meson, peu importe), histoire d'encourager des gens Ă  proposer des paquets de distrib ?

    • [^] # Re: Alternative Ă  Flatpak ?

      Posté par  . Évalué à 2 (+1/-0).

      Bonjour Christophe,

      J'ai bien pris en compte ta remarque. J'ai ajouté un Makefile ainsi qu'un script wrapper-native.sh au dépÎt pour faciliter l'installation manuelle et la création de paquets natifs par la communauté.

      Pour l'instant, je privilĂ©gie officiellement le format Flatpak durant cette phase bĂȘta afin de garantir un environnement d'exĂ©cution stable et contrĂŽlĂ©.

      Est-ce que cela répond à tes attentes ?

      • [^] # Re: Alternative Ă  Flatpak ?

        Posté par  . Évalué à 2 (+0/-0).

        Merci, ça me semble trÚs bien !

        Et en fait je n'ai pas résisté: j'ai tenté le coup avec un petit PKGBUILD pour Archlinux. Il a fallu patcher un peu update.py pour éviter de lancer "flatpak info" et "flatpak run", mais ensuite ça marche plutÎt bien !

        Note: de mon cÎté j'ai dû lancer bbs-popcorn avec WEBKIT_DISABLE_DMABUF_RENDERER=1 , sans doute un souci avec webkit2gtk et Xorg.

        Voici le PKGBUILD:

        # $Id: pkgbuild-mode.el,v 1.23 2007/10/20 16:02:14 juergen Exp $
        # Maintainer: Christophe
        pkgname=bbs-popcorn-git
        pkgver=0.1.0beta
        pkgrel=1
        pkgdesc="Light Youtube wrapper with MPV player - BBS Suite"
        arch=('i686' 'x86_64')
        url="https://github.com/blacksamdev/BBS-Popcorn"
        license=('GPL-3.0')
        depends=('mpv' 'yt-dlp' 'python-gobject' 'webkit2gtk-4.1')
        makedepends=('make' 'python-pip' 'git')
        source=('git+https://github.com/blacksamdev/BBS-Popcorn.git'
                'patch_for_native_run.patch')
        md5sums=('SKIP'
                 'e7303d91f5d375c76fa210632c247ea4')
        
        build() {
        
          cd $srcdir/BBS-Popcorn
          patch -p1 < $srcdir/patch_for_native_run.patch
        }
        
        package() {
        
          cd $srcdir/BBS-Popcorn
        
          make PREFIX=$pkgdir/usr/local install
        }
        
        # vim:set ts=2 sw=2 et:

        et le patch:

        diff --git a/src/bbs_popcorn/updater.py b/src/bbs_popcorn/updater.py
        index a7e14df..a4703bf 100644
        --- a/src/bbs_popcorn/updater.py
        +++ b/src/bbs_popcorn/updater.py
        @@ -26,17 +26,25 @@ class Updater:
        
             @staticmethod
             def run_host(args: list, quiet: bool = False):
        +        run_args = args
        +        if "io.mpv.Mpv" in args:
        +          run_args = [ "mpv" ] + args[args.index("io.mpv.Mpv")+1:]
        +
                 if quiet:
                     return subprocess.run(
        -                ["flatpak-spawn", "--host"] + args,
        +                run_args,
                         stdout=subprocess.DEVNULL,
                         stderr=subprocess.DEVNULL
                     )
        -        return subprocess.run(["flatpak-spawn", "--host"] + args)
        +        return subprocess.run(run_args)
        
             @staticmethod
             def popen_host(args: list):
        -        return subprocess.Popen(["flatpak-spawn", "--host"] + args)
        +        run_args = args
        +        if "io.mpv.Mpv" in args:
        +          run_args = [ "mpv" ] + args[args.index("io.mpv.Mpv")+1:]
        +
        +        return subprocess.Popen(run_args)
        
             # ----------------------------
             # MPV

        Vu que c'est encore en bĂȘta je ne vais pas mettre ça sur l'AUR, afin de continuer Ă  privilĂ©gier Flatpak en cible principale.

        • [^] # Re: Alternative Ă  Flatpak ?

          Posté par  . Évalué à 2 (+2/-1).

          Merci encore pour le PKGBUILD, ça a vraiment lancé la dynamique pour l'installation native !
          Depuis ton test, pas mal de choses ont Ă©voluĂ© — voici un rĂ©sumĂ© des changements qui impactent directement ton build :
          updater.py — la dĂ©tection Flatpak/natif est intĂ©grĂ©e proprement avec _IS_FLATPAK = os.path.exists("/app") et une mĂ©thode _build_cmd() qui adapte les appels automatiquement. Plus besoin de patch.
          player.py — le plus important : le socket IPC MPV est maintenant dans ~/.var/app/io.mpv.Mpv/ en mode Flatpak (accessible par les deux sandboxes), et dans XDG_RUNTIME_DIR en mode natif. Ce changement a dĂ©bloquĂ© la reprise de lecture et le retour de la fenĂȘtre WebKit aprĂšs la fin naturelle d'une vidĂ©o. Plusieurs correctifs importants : fermeture propre de l'app et de MPV, titre dans l'historique via yt-dlp, dĂ©tection de fin de lecture par Ă©vĂ©nement IPC.
          app.py — signal close-request ajoutĂ© pour la fermeture propre, instance unique via Gio.ApplicationFlags, mode Ă©co WebKit (WebGL/WebAudio dĂ©sactivĂ©s, Shorts redirigĂ©s vers MPV).
          Tout est dans le dĂ©pĂŽt. Le Makefile et wrapper-native.sh sont inchangĂ©s. Pour ton PKGBUILD, seul le patch updater.py peut ĂȘtre retirĂ© — le reste du build devrait fonctionner tel quel.

  • # Mise Ă  jour et v0.1.0

    Posté par  . Évalué à 1 (+0/-0).

    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 ⚙).

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent Ă  celles et ceux qui les ont postĂ©s. Nous n’en sommes pas responsables.