From 0a6737add577a66ad9d5d802d4cf3b98b9daf326 Mon Sep 17 00:00:00 2001 From: Johnny Date: Mon, 13 Jul 2026 09:51:56 +0200 Subject: [PATCH] Initial --- .gitignore | 1 + CHANGELOG.md | 17 +++++++ Makefile | 94 ++++++++++++++++++++++++++++++------- README.md | 64 ++++++++++++++++--------- assembly_player/__init__.py | 2 +- 5 files changed, 136 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index 255c255..35097b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build/ +dist/ __pycache__/ *.pyc diff --git a/CHANGELOG.md b/CHANGELOG.md index b2d4117..6e0267c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 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__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 ### Ajouté diff --git a/Makefile b/Makefile index 1603701..af4fc66 100644 --- a/Makefile +++ b/Makefile @@ -5,36 +5,55 @@ SHAREDIR := $(PREFIX)/share/assembly-player APPDIR := $(PREFIX)/share/applications ICONDIR := $(PREFIX)/share/icons/hicolor BUILDDIR := build +DISTDIR := dist 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 -.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 -help: ## Afficher cette aide - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ - awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' +help: ## 📖 Afficher cette aide + @echo "" + @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" \ || { echo "❌ GTK3 / WebKit2GTK (4.1) introuvables. Lancez 'make deps'."; exit 1; } @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; } sudo apt-get update 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')" \ || { echo "❌ gir1.2-rsvg-2.0 introuvable. Lancez 'make deps'."; exit 1; } $(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) 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 install -m 755 $(BUILDDIR)/assembly-player $(BINDIR)/assembly-player 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 @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 - @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 " \ + "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 -rf $(SHAREDIR) 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 @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 -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 @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)" @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)" @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 {} + diff --git a/README.md b/README.md index 8279bc7..eb9cbe9 100644 --- a/README.md +++ b/README.md @@ -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 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 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. > 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é, > 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). -- 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. -- **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. -- **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 tâches), avec reprise automatique. -- **Mode plein écran** (bouton dédié, touche `F11`, ou menu de l'icône) ; `F10` - ouvre les Paramètres même en plein écran. -- **Icône dans la barre des tâches** (system tray / AppIndicator, compatible +- 🖥️ **Mode plein écran** (bouton dédié, touche `F11`, ou menu de l'icône) ; + `F10` ouvre les Paramètres même en plein écran. +- 🔔 **Icône dans la barre des tâches** (system tray / AppIndicator, compatible GNOME sur Wayland) avec Lecture/Pause, session précédente/suivante, plein é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. -- 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. +- 📦 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 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 — 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 : @@ -66,7 +73,7 @@ Installation en une commande : make deps ``` -## Installation +## 📥 Installation ``` make install @@ -82,7 +89,17 @@ Pour une installation système (tous les utilisateurs) : 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__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 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 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 → « 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 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 ▶ 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. @@ -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. -## Emplacement des données +## 🗂️ Emplacement des données - Configuration (lien, options) : `~/.config/assembly-player/config.json` - Progression de lecture (par assemblée) : `~/.local/state/assembly-player/state.json` - Démarrage automatique : `~/.config/autostart/assembly-player.desktop` -## Désinstallation +## 🗑️ Désinstallation ``` make uninstall ``` -## Développement +## 💻 Développement ``` make test # vérifie que le code Python compile make run # lance l'application depuis les sources 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`. -## Dépannage +## 🛠️ Dépannage - **L'icône n'apparaît pas dans la barre des tâches** : sur GNOME/Wayland, l'extension GNOME Shell « AppIndicator and KStatusNotifierItem Support » diff --git a/assembly_player/__init__.py b/assembly_player/__init__.py index a82b376..c68196d 100644 --- a/assembly_player/__init__.py +++ b/assembly_player/__init__.py @@ -1 +1 @@ -__version__ = "1.1.1" +__version__ = "1.2.0"