This commit is contained in:
Johnny
2026-07-13 09:51:56 +02:00
parent 55684ec37c
commit 0a6737add5
5 changed files with 136 additions and 42 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
build/ build/
dist/
__pycache__/ __pycache__/
*.pyc *.pyc

View File

@@ -4,6 +4,23 @@ Toutes les modifications notables de ce projet sont documentées ici.
Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et ce Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et ce
projet suit le [Semantic Versioning](https://semver.org/lang/fr/). projet suit le [Semantic Versioning](https://semver.org/lang/fr/).
## [1.2.0] - 2026-07-13
### Ajouté
- Cible `make deb` : génère un paquet Debian autonome
(`dist/assembly-player_<version>_all.deb`, dépendances déclarées,
architecture `all`), installable via `sudo apt install ./dist/*.deb`.
- Aide (`make help`) réorganisée par catégories (🔧 Installation, 💻
Développement, ⏰ Démarrage automatique), avec bannière et emoji sur chaque
commande.
- README : étiquettes (badges) et emoji ajoutés pour une lecture plus rapide.
### Corrigé
- Les paquets générés (`make install` et `make deb`) n'embarquent plus de
fichiers `__pycache__` residuels du poste de développement.
## [1.1.1] - 2026-07-13 ## [1.1.1] - 2026-07-13
### Ajouté ### Ajouté

View File

@@ -5,36 +5,55 @@ SHAREDIR := $(PREFIX)/share/assembly-player
APPDIR := $(PREFIX)/share/applications APPDIR := $(PREFIX)/share/applications
ICONDIR := $(PREFIX)/share/icons/hicolor ICONDIR := $(PREFIX)/share/icons/hicolor
BUILDDIR := build BUILDDIR := build
DISTDIR := dist
APT_PACKAGES := python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-webkit2-4.1 \ APT_PACKAGES := python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-webkit2-4.1 \
gir1.2-ayatanaappindicator3-0.1 gir1.2-notify-0.7 gir1.2-rsvg-2.0 gir1.2-ayatanaappindicator3-0.1 gir1.2-notify-0.7 gir1.2-rsvg-2.0
.PHONY: help deps check-deps icons install uninstall run test clean autostart-enable autostart-disable # Paquets requis à l'EXÉCUTION seulement (pas gir1.2-rsvg-2.0/gi-cairo, qui ne
# servent qu'à générer les icônes au moment du build, déjà incluses dans le .deb).
DEB_DEPENDS := python3-gi, gir1.2-gtk-3.0, gir1.2-webkit2-4.1, gir1.2-ayatanaappindicator3-0.1, gir1.2-notify-0.7
DEB_VERSION := $(shell $(PYTHON) -c "from assembly_player import __version__; print(__version__)")
DEB_ARCH := all
DEB_STAGE := $(BUILDDIR)/deb
DEB_PKG := $(DISTDIR)/assembly-player_$(DEB_VERSION)_$(DEB_ARCH).deb
.PHONY: help deps check-deps icons install uninstall deb run test clean autostart-enable autostart-disable
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
help: ## Afficher cette aide help: ## 📖 Afficher cette aide
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ @echo ""
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' @echo " 🎬 \033[1mLecteur de sessions\033[0m — commandes disponibles (v$(DEB_VERSION))"
@echo " 📂 Préfixe d'installation : \033[2m$(PREFIX)\033[0m (make install PREFIX=... pour changer)"
@awk 'BEGIN {FS = ":.*?## "} \
/^##@/ {printf "\n\033[1m%s\033[0m\n", substr($$0, 5); next} \
/^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-22s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
@echo ""
check-deps: ## Vérifier que les bibliothèques système requises sont installées ##@ 🔧 Installation
check-deps: ## 🔍 Vérifier que les bibliothèques système requises sont installées
@$(PYTHON) -c "import gi; gi.require_version('Gtk','3.0'); gi.require_version('WebKit2','4.1'); from gi.repository import Gtk, WebKit2" \ @$(PYTHON) -c "import gi; gi.require_version('Gtk','3.0'); gi.require_version('WebKit2','4.1'); from gi.repository import Gtk, WebKit2" \
|| { echo "❌ GTK3 / WebKit2GTK (4.1) introuvables. Lancez 'make deps'."; exit 1; } || { echo "❌ GTK3 / WebKit2GTK (4.1) introuvables. Lancez 'make deps'."; exit 1; }
@echo "✅ Dépendances Python/GTK présentes." @echo "✅ Dépendances Python/GTK présentes."
deps: ## Installer les paquets système requis (Debian/Ubuntu, sudo) deps: ## 📥 Installer les paquets système requis (Debian/Ubuntu, sudo)
@command -v apt-get >/dev/null || { echo "❌ apt-get introuvable ; installez manuellement : $(APT_PACKAGES)"; exit 1; } @command -v apt-get >/dev/null || { echo "❌ apt-get introuvable ; installez manuellement : $(APT_PACKAGES)"; exit 1; }
sudo apt-get update sudo apt-get update
sudo apt-get install -y $(APT_PACKAGES) sudo apt-get install -y $(APT_PACKAGES)
@echo "✅ Dépendances système installées."
icons: ## Générer les icônes PNG (hicolor) à partir du SVG source icons: ## 🎨 Générer les icônes PNG (hicolor) à partir du SVG source
@$(PYTHON) -c "import gi; gi.require_version('Rsvg','2.0')" \ @$(PYTHON) -c "import gi; gi.require_version('Rsvg','2.0')" \
|| { echo "❌ gir1.2-rsvg-2.0 introuvable. Lancez 'make deps'."; exit 1; } || { echo "❌ gir1.2-rsvg-2.0 introuvable. Lancez 'make deps'."; exit 1; }
$(PYTHON) tools/gen_icons.py $(BUILDDIR)/icons $(PYTHON) tools/gen_icons.py $(BUILDDIR)/icons
@echo "✅ Icônes générées dans $(BUILDDIR)/icons."
install: check-deps icons ## Installer l'application pour l'utilisateur courant (PREFIX=$(PREFIX)) install: check-deps icons ## 🚀 Installer l'application (voir PREFIX ci-dessus)
install -d $(BINDIR) $(SHAREDIR) $(APPDIR) install -d $(BINDIR) $(SHAREDIR) $(APPDIR)
cp -r assembly_player $(SHAREDIR)/ cp -r assembly_player $(SHAREDIR)/
find $(SHAREDIR)/assembly_player -name '__pycache__' -type d -exec rm -rf {} +
sed -e 's#__PYTHONPATH__#$(SHAREDIR)#' packaging/assembly-player.in > $(BUILDDIR)/assembly-player sed -e 's#__PYTHONPATH__#$(SHAREDIR)#' packaging/assembly-player.in > $(BUILDDIR)/assembly-player
install -m 755 $(BUILDDIR)/assembly-player $(BINDIR)/assembly-player install -m 755 $(BUILDDIR)/assembly-player $(BINDIR)/assembly-player
install -m 644 packaging/assembly-player.desktop $(APPDIR)/assembly-player.desktop install -m 644 packaging/assembly-player.desktop $(APPDIR)/assembly-player.desktop
@@ -46,9 +65,43 @@ install: check-deps icons ## Installer l'application pour l'utilisateur courant
install -m 644 $(BUILDDIR)/icons/scalable/apps/assembly-player.svg $(ICONDIR)/scalable/apps/assembly-player.svg install -m 644 $(BUILDDIR)/icons/scalable/apps/assembly-player.svg $(ICONDIR)/scalable/apps/assembly-player.svg
@command -v update-desktop-database >/dev/null && update-desktop-database $(APPDIR) 2>/dev/null || true @command -v update-desktop-database >/dev/null && update-desktop-database $(APPDIR) 2>/dev/null || true
@command -v gtk-update-icon-cache >/dev/null && gtk-update-icon-cache -f -t $(ICONDIR) 2>/dev/null || true @command -v gtk-update-icon-cache >/dev/null && gtk-update-icon-cache -f -t $(ICONDIR) 2>/dev/null || true
@echo "✅ Installé. Lancez 'assembly-player' (vérifiez que $(BINDIR) est dans votre PATH)." @echo "✅ Installé ! Lancez \033[1massembly-player\033[0m (vérifiez que $(BINDIR) est dans votre PATH)."
uninstall: ## Désinstaller l'application (PREFIX=$(PREFIX)) deb: check-deps icons ## 📦 Générer un paquet .deb dans dist/
@command -v dpkg-deb >/dev/null || { echo "❌ dpkg-deb introuvable (paquet dpkg)."; exit 1; }
rm -rf $(DEB_STAGE)
install -d $(DEB_STAGE)/DEBIAN $(DEB_STAGE)/usr/bin $(DEB_STAGE)/usr/share/assembly-player $(DEB_STAGE)/usr/share/applications
cp -r assembly_player $(DEB_STAGE)/usr/share/assembly-player/
find $(DEB_STAGE)/usr/share/assembly-player/assembly_player -name '__pycache__' -type d -exec rm -rf {} +
sed -e 's#__PYTHONPATH__#/usr/share/assembly-player#' packaging/assembly-player.in > $(DEB_STAGE)/usr/bin/assembly-player
chmod 755 $(DEB_STAGE)/usr/bin/assembly-player
install -m 644 packaging/assembly-player.desktop $(DEB_STAGE)/usr/share/applications/assembly-player.desktop
@for size in 16 22 24 32 48 64 128 256 512; do \
install -d $(DEB_STAGE)/usr/share/icons/hicolor/$${size}x$${size}/apps; \
install -m 644 $(BUILDDIR)/icons/$${size}x$${size}/apps/assembly-player.png $(DEB_STAGE)/usr/share/icons/hicolor/$${size}x$${size}/apps/assembly-player.png; \
done
install -d $(DEB_STAGE)/usr/share/icons/hicolor/scalable/apps
install -m 644 $(BUILDDIR)/icons/scalable/apps/assembly-player.svg $(DEB_STAGE)/usr/share/icons/hicolor/scalable/apps/assembly-player.svg
printf '%s\n' \
"Package: assembly-player" \
"Version: $(DEB_VERSION)" \
"Section: video" \
"Priority: optional" \
"Architecture: $(DEB_ARCH)" \
"Depends: $(DEB_DEPENDS)" \
"Maintainer: Johnny <infocpea@gmail.com>" \
"Description: Lecteur automatise de sessions d'assemblee (stream.jw.org)" \
" Lit automatiquement, dans l'ordre, les sessions video d'une assemblee sur" \
" un lien stream.jw.org configurable, avec reprise de lecture, demarrage" \
" automatique et icone dans la barre des taches (GNOME/Wayland)." \
" Projet non officiel, non affilie a jw.org / stream.jw.org." \
> $(DEB_STAGE)/DEBIAN/control
install -d $(DISTDIR)
dpkg-deb --build --root-owner-group $(DEB_STAGE) $(DEB_PKG)
@echo "✅ Paquet généré : \033[1m$(DEB_PKG)\033[0m"
@echo " 📀 Installation : sudo apt install ./$(DEB_PKG)"
uninstall: ## 🗑️ Désinstaller l'application (voir PREFIX ci-dessus)
rm -f $(BINDIR)/assembly-player rm -f $(BINDIR)/assembly-player
rm -rf $(SHAREDIR) rm -rf $(SHAREDIR)
rm -f $(APPDIR)/assembly-player.desktop rm -f $(APPDIR)/assembly-player.desktop
@@ -59,21 +112,26 @@ uninstall: ## Désinstaller l'application (PREFIX=$(PREFIX))
rm -f $(HOME)/.config/autostart/assembly-player.desktop rm -f $(HOME)/.config/autostart/assembly-player.desktop
@echo "✅ Désinstallé." @echo "✅ Désinstallé."
run: check-deps ## Lancer l'application depuis les sources (développement) ##@ 💻 Développement
run: check-deps ## ▶️ Lancer l'application depuis les sources (développement)
$(PYTHON) -m assembly_player $(PYTHON) -m assembly_player
test: ## Vérifier que les modules Python compilent test: ## 🧪 Vérifier que les modules Python compilent
$(PYTHON) -m py_compile assembly_player/*.py tools/gen_icons.py $(PYTHON) -m py_compile assembly_player/*.py tools/gen_icons.py
@echo "✅ Compilation OK." @echo "✅ Compilation OK."
autostart-enable: ## Activer le lancement automatique au démarrage du PC clean: ## 🧹 Supprimer les fichiers générés
rm -rf $(BUILDDIR)
find . -name '__pycache__' -type d -exec rm -rf {} +
@echo "✅ Nettoyé."
##@ ⏰ Démarrage automatique
autostart-enable: ## ✅ Activer le lancement automatique au démarrage du PC
@$(PYTHON) -c "from assembly_player import config; config.set_autostart(True)" @$(PYTHON) -c "from assembly_player import config; config.set_autostart(True)"
@echo "✅ Démarrage automatique activé." @echo "✅ Démarrage automatique activé."
autostart-disable: ## Désactiver le lancement automatique au démarrage du PC autostart-disable: ## 🚫 Désactiver le lancement automatique au démarrage du PC
@$(PYTHON) -c "from assembly_player import config; config.set_autostart(False)" @$(PYTHON) -c "from assembly_player import config; config.set_autostart(False)"
@echo "✅ Démarrage automatique désactivé." @echo "✅ Démarrage automatique désactivé."
clean: ## Supprimer les fichiers générés
rm -rf $(BUILDDIR)
find . -name '__pycache__' -type d -exec rm -rf {} +

View File

@@ -1,4 +1,10 @@
# Lecteur de sessions — Assembly Session Player # 🎬 Lecteur de sessions — Assembly Session Player
![Version](https://img.shields.io/badge/version-1.2.0-blue)
![Python](https://img.shields.io/badge/python-3-yellow)
![Plateforme](https://img.shields.io/badge/plateforme-GNOME_%2F_Wayland-4A90D9)
![Paquet](https://img.shields.io/badge/paquet-.deb_disponible-success)
![Statut](https://img.shields.io/badge/statut-projet_non_officiel-orange)
Application de bureau (GNOME / Wayland) **très simple à utiliser**, qui lit Application de bureau (GNOME / Wayland) **très simple à utiliser**, qui lit
automatiquement, **dans l'ordre**, toutes les sessions vidéo disponibles sur un automatiquement, **dans l'ordre**, toutes les sessions vidéo disponibles sur un
@@ -11,34 +17,35 @@ https://stream.jw.org/9021-8224-3277-8078
Elle retient où vous en étiez (session + position exacte) pour reprendre la Elle retient où vous en étiez (session + position exacte) pour reprendre la
lecture pile où vous vous êtes arrêté·e, y compris après un redémarrage du PC. lecture pile où vous vous êtes arrêté·e, y compris après un redémarrage du PC.
> **Projet non officiel**, réalisé pour un usage personnel. Il n'est ni > ⚠️ **Projet non officiel**, réalisé pour un usage personnel. Il n'est ni
> développé, ni approuvé, ni affilié à watchtower.org / jw.org / stream.jw.org. > développé, ni approuvé, ni affilié à watchtower.org / jw.org / stream.jw.org.
> Il se contente d'afficher la page officielle telle quelle dans une fenêtre > Il se contente d'afficher la page officielle telle quelle dans une fenêtre
> (WebKitGTK) et de l'automatiser via le DOM — aucun contenu n'est téléchargé, > (WebKitGTK) et de l'automatiser via le DOM — aucun contenu n'est téléchargé,
> copié ou redistribué par l'application. > copié ou redistribué par l'application.
## Fonctionnalités ## Fonctionnalités
- Lien d'assemblée **configurable** (Paramètres, ou menu de l'icône de la - 🔗 Lien d'assemblée **configurable** (Paramètres, ou menu de l'icône de la
barre des tâches). barre des tâches).
- Détection automatique de la liste des sessions et **lecture dans le bon - 📋 Détection automatique de la liste des sessions et **lecture dans le bon
ordre**, enchaînement automatique d'une session à l'autre. ordre**, enchaînement automatique d'une session à l'autre.
- **Reprise de lecture** exacte (session + position en secondes), même après - ⏯️ **Reprise de lecture** exacte (session + position en secondes), même après
fermeture complète de l'application ou redémarrage du PC. fermeture complète de l'application ou redémarrage du PC.
- **Démarrage automatique** au démarrage du PC (option dans les Paramètres ou - **Démarrage automatique** au démarrage du PC (option dans les Paramètres ou
le menu de l'icône), en arrière-plan (fenêtre réduite dans la barre des le menu de l'icône), en arrière-plan (fenêtre réduite dans la barre des
tâches), avec reprise automatique. tâches), avec reprise automatique.
- **Mode plein écran** (bouton dédié, touche `F11`, ou menu de l'icône) ; `F10` - 🖥️ **Mode plein écran** (bouton dédié, touche `F11`, ou menu de l'icône) ;
ouvre les Paramètres même en plein écran. `F10` ouvre les Paramètres même en plein écran.
- **Icône dans la barre des tâches** (system tray / AppIndicator, compatible - 🔔 **Icône dans la barre des tâches** (system tray / AppIndicator, compatible
GNOME sur Wayland) avec Lecture/Pause, session précédente/suivante, plein GNOME sur Wayland) avec Lecture/Pause, session précédente/suivante, plein
écran, démarrage automatique et changement de lien. écran, démarrage automatique et changement de lien.
- Icône d'application dédiée, utilisée dans la fenêtre, le lanceur et la - 🎨 Icône d'application dédiée, utilisée dans la fenêtre, le lanceur et la
barre des tâches. barre des tâches.
- Bouton discret « À propos » (barre du haut ou menu de l'icône) : nom, - Bouton discret « À propos » (barre du haut ou menu de l'icône) : nom,
version et rappel du caractère non officiel de l'application. version et rappel du caractère non officiel de l'application.
- 📦 Paquet `.deb` prêt à l'emploi (`make deb`).
## Limitation connue (sécurité navigateur, pas un bug) ## ⚠️ Limitation connue (sécurité navigateur, pas un bug)
Les navigateurs (et WebKitGTK) bloquent le démarrage automatique du son/vidéo Les navigateurs (et WebKitGTK) bloquent le démarrage automatique du son/vidéo
tant qu'aucun **clic réel** n'a eu lieu dans la page. Concrètement : **au tant qu'aucun **clic réel** n'a eu lieu dans la page. Concrètement : **au
@@ -49,7 +56,7 @@ suivante) sans autre action, tant que la fenêtre reste ouverte. C'est une
protection standard des navigateurs contre la lecture automatique intempestive protection standard des navigateurs contre la lecture automatique intempestive
— l'application ne peut pas (et ne doit pas) la contourner. — l'application ne peut pas (et ne doit pas) la contourner.
## Prérequis ## 📋 Prérequis
Testé sur Ubuntu/GNOME (Wayland). Paquets système nécessaires : Testé sur Ubuntu/GNOME (Wayland). Paquets système nécessaires :
@@ -66,7 +73,7 @@ Installation en une commande :
make deps make deps
``` ```
## Installation ## 📥 Installation
``` ```
make install make install
@@ -82,7 +89,17 @@ Pour une installation système (tous les utilisateurs) :
sudo make install PREFIX=/usr/local sudo make install PREFIX=/usr/local
``` ```
## Utilisation ### 📦 Paquet .deb
```
make deb
sudo apt install ./dist/assembly-player_*.deb
```
Génère un paquet Debian autonome (`dist/assembly-player_<version>_all.deb`)
avec toutes les dépendances déclarées, prêt à installer ou à partager.
## ▶️ Utilisation
Lancez `assembly-player` depuis le terminal, le menu d'applications, ou Lancez `assembly-player` depuis le terminal, le menu d'applications, ou
cliquez sur l'icône **Lecteur de sessions**. cliquez sur l'icône **Lecteur de sessions**.
@@ -99,12 +116,12 @@ cliquez sur l'icône **Lecteur de sessions**.
utilisez « Masquer la fenêtre » dans le menu de l'icône (au lieu de la utilisez « Masquer la fenêtre » dans le menu de l'icône (au lieu de la
croix) ; « Afficher la fenêtre » la fait réapparaître. croix) ; « Afficher la fenêtre » la fait réapparaître.
### Changer le lien de l'assemblée ### 🔗 Changer le lien de l'assemblée
Bouton ☰ dans la fenêtre, ou clic droit sur l'icône de la barre des tâches → Bouton ☰ dans la fenêtre, ou clic droit sur l'icône de la barre des tâches →
« Changer le lien de l'assemblée… ». « Changer le lien de l'assemblée… ».
### Démarrage automatique au démarrage du PC ### Démarrage automatique au démarrage du PC
Cochez « Lancer automatiquement au démarrage du PC » dans les Paramètres (ou Cochez « Lancer automatiquement au démarrage du PC » dans les Paramètres (ou
le menu de l'icône), ou en ligne de commande : le menu de l'icône), ou en ligne de commande :
@@ -118,7 +135,7 @@ Au démarrage du PC, l'application se lance réduite dans la barre des tâches e
reprend automatiquement à l'endroit où vous vous étiez arrêté (un clic sur ▶ reprend automatiquement à l'endroit où vous vous étiez arrêté (un clic sur ▶
reste nécessaire, voir plus haut). reste nécessaire, voir plus haut).
### Plein écran ### 🖥️ Plein écran
Bouton dédié dans la fenêtre, touche `F11`, ou menu de l'icône. Bouton dédié dans la fenêtre, touche `F11`, ou menu de l'icône.
@@ -132,29 +149,30 @@ revenir en fenêtré ou ouvrir les Paramètres sans repasser par la souris :
Une notification rappelle ces deux raccourcis à chaque entrée en plein écran. Une notification rappelle ces deux raccourcis à chaque entrée en plein écran.
## Emplacement des données ## 🗂️ Emplacement des données
- Configuration (lien, options) : `~/.config/assembly-player/config.json` - Configuration (lien, options) : `~/.config/assembly-player/config.json`
- Progression de lecture (par assemblée) : `~/.local/state/assembly-player/state.json` - Progression de lecture (par assemblée) : `~/.local/state/assembly-player/state.json`
- Démarrage automatique : `~/.config/autostart/assembly-player.desktop` - Démarrage automatique : `~/.config/autostart/assembly-player.desktop`
## Désinstallation ## 🗑️ Désinstallation
``` ```
make uninstall make uninstall
``` ```
## Développement ## 💻 Développement
``` ```
make test # vérifie que le code Python compile make test # vérifie que le code Python compile
make run # lance l'application depuis les sources make run # lance l'application depuis les sources
make icons # régénère les icônes PNG depuis le SVG source make icons # régénère les icônes PNG depuis le SVG source
make deb # génère un paquet .deb dans dist/
``` ```
Icône source (vecteur) : `assembly_player/icons/assembly-player.svg`. Icône source (vecteur) : `assembly_player/icons/assembly-player.svg`.
## Dépannage ## 🛠️ Dépannage
- **L'icône n'apparaît pas dans la barre des tâches** : sur GNOME/Wayland, - **L'icône n'apparaît pas dans la barre des tâches** : sur GNOME/Wayland,
l'extension GNOME Shell « AppIndicator and KStatusNotifierItem Support » l'extension GNOME Shell « AppIndicator and KStatusNotifierItem Support »

View File

@@ -1 +1 @@
__version__ = "1.1.1" __version__ = "1.2.0"