spooky-doot 1.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- spooky_doot-1.3.0/LICENSE +21 -0
- spooky_doot-1.3.0/PKG-INFO +448 -0
- spooky_doot-1.3.0/README.md +415 -0
- spooky_doot-1.3.0/doot/__init__.py +7 -0
- spooky_doot-1.3.0/doot/__main__.py +4 -0
- spooky_doot-1.3.0/doot/art.py +85 -0
- spooky_doot-1.3.0/doot/assets/doot.mp3 +0 -0
- spooky_doot-1.3.0/doot/assets/doot.png +0 -0
- spooky_doot-1.3.0/doot/cli.py +450 -0
- spooky_doot-1.3.0/doot/image.py +53 -0
- spooky_doot-1.3.0/doot/png.py +462 -0
- spooky_doot-1.3.0/doot/screens.py +324 -0
- spooky_doot-1.3.0/doot/season.py +55 -0
- spooky_doot-1.3.0/doot/sound.py +437 -0
- spooky_doot-1.3.0/doot/update.py +377 -0
- spooky_doot-1.3.0/doot/window.py +430 -0
- spooky_doot-1.3.0/doot/x11.py +397 -0
- spooky_doot-1.3.0/pyproject.toml +52 -0
- spooky_doot-1.3.0/setup.cfg +4 -0
- spooky_doot-1.3.0/spooky_doot.egg-info/PKG-INFO +448 -0
- spooky_doot-1.3.0/spooky_doot.egg-info/SOURCES.txt +31 -0
- spooky_doot-1.3.0/spooky_doot.egg-info/dependency_links.txt +1 -0
- spooky_doot-1.3.0/spooky_doot.egg-info/entry_points.txt +2 -0
- spooky_doot-1.3.0/spooky_doot.egg-info/top_level.txt +1 -0
- spooky_doot-1.3.0/tests/test_art.py +122 -0
- spooky_doot-1.3.0/tests/test_cli.py +164 -0
- spooky_doot-1.3.0/tests/test_png.py +161 -0
- spooky_doot-1.3.0/tests/test_png_fabrique.py +597 -0
- spooky_doot-1.3.0/tests/test_screens.py +299 -0
- spooky_doot-1.3.0/tests/test_season.py +93 -0
- spooky_doot-1.3.0/tests/test_sound.py +311 -0
- spooky_doot-1.3.0/tests/test_update.py +256 -0
- spooky_doot-1.3.0/tests/test_window.py +108 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 boubou666
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: spooky-doot
|
|
3
|
+
Version: 1.3.0
|
|
4
|
+
Summary: Un squelette trompettiste qui surgit au hasard sur ton ecran, du 1er septembre au 31 octobre.
|
|
5
|
+
License: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/boubou666/doot
|
|
7
|
+
Project-URL: Repository, https://github.com/boubou666/doot
|
|
8
|
+
Project-URL: Changelog, https://github.com/boubou666/doot/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Issues, https://github.com/boubou666/doot/issues
|
|
10
|
+
Keywords: doot,skeleton,halloween,spooky,prank,desktop
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Environment :: X11 Applications
|
|
13
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
14
|
+
Classifier: Environment :: MacOS X
|
|
15
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Natural Language :: French
|
|
18
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
19
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
20
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
21
|
+
Classifier: Programming Language :: Python :: 3
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
27
|
+
Classifier: Topic :: Games/Entertainment
|
|
28
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
29
|
+
Requires-Python: >=3.9
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# doot
|
|
35
|
+
|
|
36
|
+
[](https://github.com/boubou666/doot/actions/workflows/ci.yml)
|
|
37
|
+
|
|
38
|
+
Un squelette trompettiste surgit au hasard sur ton écran, joue son petit air, puis disparaît.
|
|
39
|
+
|
|
40
|
+
**Uniquement du 1er septembre au 31 octobre inclus.** Le reste de l'année, le programme
|
|
41
|
+
tourne mais reste sagement endormi : le squelette range sa trompette.
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
d o o t !
|
|
45
|
+
.-"""""""-.
|
|
46
|
+
.' '.
|
|
47
|
+
/ .-. .-. \
|
|
48
|
+
| ( o ) ( o ) | .-----.
|
|
49
|
+
| ___ | ,--'' '.
|
|
50
|
+
| / \ | / \
|
|
51
|
+
| |=====| | ,-------' |
|
|
52
|
+
\ |||||||========( |
|
|
53
|
+
'. ||||| .' '------. |
|
|
54
|
+
'-._____.-' \ /
|
|
55
|
+
/| |\ '--. ,'
|
|
56
|
+
/ | | \ '-----'
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- **Multiplateforme** : Windows 10/11, macOS, Linux (Arch, Debian/Ubuntu, Fedora, openSUSE…)
|
|
60
|
+
- **Zéro dépendance** : uniquement la bibliothèque standard de Python 3.8+
|
|
61
|
+
- **Discret** : overlay sans bordure, qui ne vole jamais le focus et — sous Windows —
|
|
62
|
+
laisse passer les clics de souris. Il ne bloque rien, il fait juste *doot*.
|
|
63
|
+
- **Multi-écrans** : les moniteurs sont énumérés pour de vrai (Win32, xrandr,
|
|
64
|
+
CoreGraphics), le squelette surgit sur l'un d'eux au hasard, jamais à cheval
|
|
65
|
+
entre deux dalles ni sous la barre des tâches.
|
|
66
|
+
- **Deux façons d'arriver**, tirées au sort : il surgit au milieu de l'écran,
|
|
67
|
+
ou il glisse depuis l'un des quatre bords en pivotant pour avoir les pieds sur
|
|
68
|
+
le bord d'où il vient — entré par le haut, il arrive tête en bas.
|
|
69
|
+
- **Son spatialisé** : le doot sort du côté où le squelette est apparu, calculé
|
|
70
|
+
sur l'ensemble du bureau — collé à droite de l'écran de droite, il sonne
|
|
71
|
+
franchement à droite.
|
|
72
|
+
- **Prêt à l'emploi** : le squelette et son *doot* sont livrés avec ; dépose ton
|
|
73
|
+
propre PNG/GIF ou mp3 pour les remplacer, sans toucher au code.
|
|
74
|
+
- **Saisonnier** : la fenêtre du 1er septembre au 31 octobre est appliquée par le
|
|
75
|
+
programme lui-même, pas seulement par le planificateur.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 🛑 Au secours, faites-le taire
|
|
80
|
+
|
|
81
|
+
Pas de panique, rien n'est installé en profondeur et aucun droit administrateur n'a
|
|
82
|
+
été demandé. Trois niveaux, du plus doux au plus définitif :
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
doot --stop # arrête le programme qui tourne, tout de suite
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
./uninstall.sh # Linux / macOS : désinstalle tout, y compris le démarrage auto
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```powershell
|
|
93
|
+
powershell -ExecutionPolicy Bypass -File .\uninstall.ps1 # Windows
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Ajoute `--purge` (Linux/macOS) ou `-Purge` (Windows) pour effacer aussi le dossier de
|
|
97
|
+
données. Tu n'as plus le dépôt sous la main ? Tout se retire à la main :
|
|
98
|
+
|
|
99
|
+
| Système | Ce qu'il faut supprimer |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| **Linux** | `systemctl --user disable --now doot.service` puis `rm -rf ~/.config/systemd/user/doot.service ~/.config/autostart/doot.desktop ~/.local/bin/doot ~/.local/share/doot` |
|
|
102
|
+
| **macOS** | `launchctl unload ~/Library/LaunchAgents/com.doot.skeleton.plist` puis `rm -rf ~/Library/LaunchAgents/com.doot.skeleton.plist ~/.local/bin/doot ~/Library/Application\ Support/doot` |
|
|
103
|
+
| **Windows** | supprime le raccourci `doot` dans `shell:startup` (Win+R → `shell:startup`), puis les dossiers `%LOCALAPPDATA%\Programs\doot` et `%LOCALAPPDATA%\doot` |
|
|
104
|
+
|
|
105
|
+
Envie de le garder mais en plus discret ? `doot --min 7200 --max 28800` espace les
|
|
106
|
+
apparitions de 2 à 8 heures, et `--no-sound` le rend muet.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Installation
|
|
111
|
+
|
|
112
|
+
### Depuis PyPI, sur les trois systèmes
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
pipx install spooky-doot
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Le paquet s'appelle `spooky-doot` parce que `doot` était déjà pris ; la commande
|
|
119
|
+
reste `doot`. `pip install spooky-doot` marche aussi, mais `pipx` l'isole dans
|
|
120
|
+
son propre environnement, ce qui vaut mieux pour un outil qu'on lance.
|
|
121
|
+
|
|
122
|
+
Ça installe la commande et les médias, mais **pas** le démarrage automatique.
|
|
123
|
+
Pour que le squelette revienne tout seul à chaque session, il faut les scripts
|
|
124
|
+
ci-dessous — ou lancer `doot` toi-même.
|
|
125
|
+
|
|
126
|
+
### Linux (dont Arch) et macOS
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
git clone https://github.com/boubou666/doot.git
|
|
130
|
+
cd doot
|
|
131
|
+
./install.sh
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Le script copie le code dans `~/.local/share/doot/app`, crée la commande
|
|
135
|
+
`~/.local/bin/doot`, puis configure le démarrage automatique :
|
|
136
|
+
`systemd --user` si disponible, sinon une entrée XDG autostart, et un
|
|
137
|
+
LaunchAgent sur macOS.
|
|
138
|
+
|
|
139
|
+
Options : `./install.sh --no-autostart`, `--min 300`, `--max 1800`.
|
|
140
|
+
|
|
141
|
+
**Prérequis système** (`install.sh` te le dira si quelque chose manque) :
|
|
142
|
+
|
|
143
|
+
| Distribution | Affichage (tkinter) | Son (au choix) |
|
|
144
|
+
| ------------- | ---------------------------------- | ------------------------------------------------ |
|
|
145
|
+
| Arch/Manjaro | `sudo pacman -S python tk` | `pipewire-audio`, `libpulse`, `alsa-utils`, `mpv` |
|
|
146
|
+
| Debian/Ubuntu | `sudo apt install python3-tk` | déjà là (`paplay` / `aplay`) |
|
|
147
|
+
| Fedora | `sudo dnf install python3-tkinter` | déjà là |
|
|
148
|
+
| openSUSE | `sudo zypper install python3-tk` | déjà là |
|
|
149
|
+
| macOS | `brew install python-tk` | `afplay`, intégré |
|
|
150
|
+
|
|
151
|
+
Pour lire des **mp3** sous Linux il faut un lecteur qui gère le compressé :
|
|
152
|
+
`mpv`, `ffmpeg` (ffplay), `sox` ou `vlc`. Les `.wav` passent partout.
|
|
153
|
+
|
|
154
|
+
### Arch Linux, via un paquet
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
cd packaging
|
|
158
|
+
makepkg -si
|
|
159
|
+
systemctl --user enable --now doot.service
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Windows
|
|
163
|
+
|
|
164
|
+
```powershell
|
|
165
|
+
git clone https://github.com/boubou666/doot.git
|
|
166
|
+
cd doot
|
|
167
|
+
powershell -ExecutionPolicy Bypass -File .\install.ps1
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Python 3.8+ est requis (`winget install -e --id Python.Python.3.12`, en cochant
|
|
171
|
+
« tcl/tk »). Le script installe dans `%LOCALAPPDATA%\Programs\doot`, ajoute la
|
|
172
|
+
commande `doot` au PATH utilisateur et place un raccourci dans le dossier
|
|
173
|
+
Démarrage. Aucun droit administrateur, aucun composant système modifié.
|
|
174
|
+
|
|
175
|
+
### Sans installer (test rapide)
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
python3 -m doot --once --ignore-season
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Versions
|
|
182
|
+
|
|
183
|
+
Les évolutions sont consignées dans le [CHANGELOG](CHANGELOG.md), au format
|
|
184
|
+
[Keep a Changelog](https://keepachangelog.com/fr/1.1.0/). Chaque étiquette `vX.Y.Z`
|
|
185
|
+
publie une [release](https://github.com/boubou666/doot/releases) automatiquement,
|
|
186
|
+
avec les notes tirées du changelog et les paquets Python construits.
|
|
187
|
+
|
|
188
|
+
## Mettre à jour
|
|
189
|
+
|
|
190
|
+
Une fois installé, doot se met à jour tout seul, sur les trois systèmes :
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
doot --check-update # dit si une version plus récente existe
|
|
194
|
+
doot --update # récupère, réinstalle, relance le daemon
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
`--update` relit la fiche déposée par l'installeur (`install.json`, dans le
|
|
198
|
+
dossier de données) pour retrouver d'où le code vient et avec quelles options
|
|
199
|
+
il avait été installé, puis rejoue l'installeur avec les mêmes réglages. Le
|
|
200
|
+
daemon est arrêté le temps de l'opération et redémarré derrière.
|
|
201
|
+
|
|
202
|
+
Deux façons de récupérer le code, dans cet ordre : si le dépôt cloné est
|
|
203
|
+
toujours là, un `git pull --ff-only` ; sinon l'archive de la branche
|
|
204
|
+
principale est téléchargée depuis GitHub. La seconde voie ne demande ni git ni
|
|
205
|
+
le clone d'origine, donc une installation dont tu as effacé le dossier depuis
|
|
206
|
+
se met à jour quand même.
|
|
207
|
+
|
|
208
|
+
Tes sons, tes images et ton journal ne sont pas touchés : ils vivent dans le
|
|
209
|
+
dossier de données, l'installeur ne remplace que le code.
|
|
210
|
+
|
|
211
|
+
Si doot a été installé par un gestionnaire de paquets (le `PKGBUILD` d'Arch,
|
|
212
|
+
par exemple), `--update` refuse et te renvoie vers `pacman -Syu` plutôt que
|
|
213
|
+
d'écraser des fichiers qui ne lui appartiennent pas.
|
|
214
|
+
|
|
215
|
+
## Utilisation
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
doot # lance le daemon (c'est ce que fait le démarrage auto)
|
|
219
|
+
doot --once # un doot tout de suite, puis on quitte
|
|
220
|
+
doot --once --ignore-season # idem, même hors saison : pratique pour tester
|
|
221
|
+
doot --status # saison, daemon, son et image utilisés
|
|
222
|
+
doot --stop # arrête le daemon
|
|
223
|
+
doot --paths # où sont les fichiers
|
|
224
|
+
doot --screens # liste les écrans détectés
|
|
225
|
+
doot --check-update # une version plus récente existe-t-elle ?
|
|
226
|
+
doot --update # met à jour et réinstalle
|
|
227
|
+
doot --art # imprime le squelette dans le terminal
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
| Option | Défaut | Description |
|
|
231
|
+
| --- | --- | --- |
|
|
232
|
+
| `--min` / `--max` | `600` / `3600` | bornes du délai aléatoire entre deux doot, en secondes |
|
|
233
|
+
| `--duration` | durée du son | durée d'affichage, en secondes (au moins 2.8) |
|
|
234
|
+
| `--image` | — | un PNG/GIF précis à afficher |
|
|
235
|
+
| `--no-image` | — | force l'ASCII art même si une image est disponible |
|
|
236
|
+
| `--scale` | auto | échelle de l'image (par défaut ajustée à l'écran) |
|
|
237
|
+
| `--volume` | `0.55` | volume du jingle synthétisé, de `0.0` à `1.0` |
|
|
238
|
+
| `--opacity` | `1.0` | opacité maximale de l'overlay |
|
|
239
|
+
| `--font-size` | `15` | taille du squelette ASCII |
|
|
240
|
+
| `--center` | — | se pose au centre, au lieu d'une position aléatoire |
|
|
241
|
+
| `--slide-chance` | `0.5` | proportion de doots qui entrent par un bord ; le reste surgit au milieu |
|
|
242
|
+
| `--side` | au hasard | bord d'entrée : `left`, `right`, `top`, `bottom` (impose l'entrée) |
|
|
243
|
+
| `--slide-ms` | `420` | durée de l'entrée, en millisecondes |
|
|
244
|
+
| `--no-slide` | — | jamais d'entrée par un bord, tout surgit sur place |
|
|
245
|
+
| `--screen` | `random` | écran d'apparition : `random`, `primary`, ou un index (`0`, `1`…) |
|
|
246
|
+
| `--no-sound` | — | mode muet |
|
|
247
|
+
| `--no-pan` | — | son au centre, au lieu de suivre la position du squelette |
|
|
248
|
+
| `--regen-sound` | — | régénère le jingle |
|
|
249
|
+
| `--ignore-season` | — | ignore la fenêtre saisonnière (tests) |
|
|
250
|
+
| `--quiet` | — | n'écrit que dans le journal |
|
|
251
|
+
|
|
252
|
+
## Les médias
|
|
253
|
+
|
|
254
|
+
doot est livré avec le squelette et le son qu'on attend : `doot/assets/doot.png`
|
|
255
|
+
et `doot/assets/doot.mp3`, installés d'office. C'est le mème *skull trumpet*
|
|
256
|
+
(« doot doot »), qui circule un peu partout depuis 2010 ; il est inclus pour que
|
|
257
|
+
ça marche du premier coup. Si tu es l'ayant droit et que ça te dérange, ouvre une
|
|
258
|
+
issue et je les retire.
|
|
259
|
+
|
|
260
|
+
Trois niveaux de repli, dans cet ordre : tes fichiers → les fichiers fournis →
|
|
261
|
+
l'ASCII art et le jingle synthétisé maison (harmoniques, vibrato, enveloppe ADSR),
|
|
262
|
+
utilisés notamment sur un Linux sans lecteur mp3.
|
|
263
|
+
|
|
264
|
+
### Mettre les tiens
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
doot --paths # affiche les deux dossiers ci-dessous
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
- **Image** → dossier `image/` : un `.png` ou un `.gif` (les GIF animés sont joués
|
|
271
|
+
en boucle). Prends une image détourée, à fond transparent : sous Windows le fond
|
|
272
|
+
disparaît complètement et le squelette flotte sur le bureau. Plusieurs fichiers ?
|
|
273
|
+
Un est tiré au hasard à chaque apparition.
|
|
274
|
+
- **Son** → dossier `sound/` : `.wav`, `.mp3`, `.ogg`, `.flac`, `.m4a`, `.opus`.
|
|
275
|
+
L'affichage s'allonge automatiquement pour couvrir toute la durée du son.
|
|
276
|
+
|
|
277
|
+
Tes fichiers passent devant ceux fournis, et ils sont relus à chaque apparition :
|
|
278
|
+
tu peux les changer pendant que le daemon tourne. Pour revenir au dessin ASCII et
|
|
279
|
+
au jingle synthétisé : `doot --no-image --regen-sound` (ou vide les deux dossiers
|
|
280
|
+
et supprime `doot/assets/`).
|
|
281
|
+
|
|
282
|
+
## Les deux façons d'arriver
|
|
283
|
+
|
|
284
|
+
Il y en a deux, tirées au sort à chaque apparition :
|
|
285
|
+
|
|
286
|
+
- **au milieu**, comme depuis toujours : il surgit sur place, à un endroit
|
|
287
|
+
quelconque de l'écran, droit, en fondu ;
|
|
288
|
+
- **par un bord**, en glissant depuis l'extérieur.
|
|
289
|
+
|
|
290
|
+
Une fois sur deux par défaut. `--slide-chance` règle la proportion — `0` pour
|
|
291
|
+
n'avoir que des apparitions sur place, `1` que des entrées par un bord, `0.8`
|
|
292
|
+
pour surtout des entrées :
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
doot --slide-chance 0.8
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### L'entrée par un bord
|
|
299
|
+
|
|
300
|
+
Le squelette glisse depuis un bord de l'écran jusqu'à sa position de repos. Le
|
|
301
|
+
mouvement est vif au départ et se pose en douceur — une décélération cubique
|
|
302
|
+
sur 420 ms par défaut.
|
|
303
|
+
|
|
304
|
+
L'image **pivote** pour que son bas se pose contre le bord par lequel elle
|
|
305
|
+
entre : le squelette a toujours les pieds sur le bord d'où il vient.
|
|
306
|
+
|
|
307
|
+
| Bord d'entrée | Rotation | Résultat |
|
|
308
|
+
| --- | --- | --- |
|
|
309
|
+
| gauche | un quart horaire | pieds à gauche, tête vers la droite |
|
|
310
|
+
| droite | un quart antihoraire | pieds à droite, tête vers la gauche |
|
|
311
|
+
| haut | demi-tour | pieds en haut, tête vers le bas |
|
|
312
|
+
| bas | aucune | image droite |
|
|
313
|
+
|
|
314
|
+
Il s'arrête **contre ce bord**, à quelques pixels près. Il ne s'enfonce pas
|
|
315
|
+
dans l'écran : ce serait une traversée, pas une entrée.
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
doot --once --side left # entre par la gauche
|
|
319
|
+
doot --once --side top # tombe du haut, tête en bas
|
|
320
|
+
doot --once --slide-ms 900 # entrée plus lente
|
|
321
|
+
doot --once --no-slide # apparaît sur place, comme avant
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Le squelette ASCII, lui, ne pivote pas : des glyphes à chasse fixe tournés d'un
|
|
325
|
+
quart de tour ne veulent plus rien dire. Il est simplement retourné quand il
|
|
326
|
+
entre par la droite — les obliques et les parenthèses basculent, et les lettres
|
|
327
|
+
du *doot* changent de côté sans cesser d'être lisibles.
|
|
328
|
+
|
|
329
|
+
Pendant le glissement il n'y a pas de fondu d'apparition : le bord de l'écran
|
|
330
|
+
révèle déjà le squelette, et les deux ensemble font bouillie.
|
|
331
|
+
|
|
332
|
+
## Le son spatialisé
|
|
333
|
+
|
|
334
|
+
Le doot sort du côté où le squelette est apparu. La position est calculée sur
|
|
335
|
+
**tout le bureau virtuel**, pas sur un écran isolé : avec deux dalles côte à
|
|
336
|
+
côte, un squelette collé au bord droit de celle de droite sonne franchement à
|
|
337
|
+
droite, et pas au centre comme s'il était seul au monde.
|
|
338
|
+
|
|
339
|
+
Le canal dominant reste à plein volume, seul le canal opposé est atténué. Un
|
|
340
|
+
doot centré rend donc exactement le son d'origine, sans les 3 dB qu'un
|
|
341
|
+
panoramique à puissance constante lui aurait coûtés.
|
|
342
|
+
|
|
343
|
+
Comment c'est appliqué, selon ce que la plateforme sait faire :
|
|
344
|
+
|
|
345
|
+
| Format | Windows | macOS | Linux |
|
|
346
|
+
| --- | --- | --- | --- |
|
|
347
|
+
| `.wav` | panoramisé dans les échantillons | idem | idem |
|
|
348
|
+
| `.mp3` et compressés | volume par canal via MCI | non spatialisé | `mpv` ou `ffplay` si présent, sinon non spatialisé |
|
|
349
|
+
|
|
350
|
+
Les WAV sont traités par doot lui-même, ce qui marche partout et avec n'importe
|
|
351
|
+
quel lecteur. Pour les formats compressés il faut un intermédiaire capable de
|
|
352
|
+
le faire : MCI sous Windows, un filtre `pan` sous Linux. Quand rien ne sait,
|
|
353
|
+
le son est joué au centre plutôt que pas du tout.
|
|
354
|
+
|
|
355
|
+
`--no-pan` désactive tout ça.
|
|
356
|
+
|
|
357
|
+
## Où sont les fichiers
|
|
358
|
+
|
|
359
|
+
`doot --paths` affiche tout. Par défaut :
|
|
360
|
+
|
|
361
|
+
| Système | Dossier de données |
|
|
362
|
+
| --- | --- |
|
|
363
|
+
| Linux | `~/.local/share/doot` |
|
|
364
|
+
| macOS | `~/Library/Application Support/doot` |
|
|
365
|
+
| Windows | `%LOCALAPPDATA%\doot` |
|
|
366
|
+
|
|
367
|
+
Il contient `image/` et `sound/` (tes médias), `doot.wav` (le jingle en cache),
|
|
368
|
+
`doot.log` (le journal) et `doot.pid`.
|
|
369
|
+
|
|
370
|
+
## Dépannage
|
|
371
|
+
|
|
372
|
+
**Rien ne s'affiche** → `doot --status`. Si tkinter manque, installe le paquet
|
|
373
|
+
du tableau ci-dessus. Sous Wayland, l'overlay passe par XWayland ; si ton
|
|
374
|
+
compositeur le refuse, lance la session en X11 ou utilise `--center`.
|
|
375
|
+
|
|
376
|
+
**Pas de son** → `doot --status` indique le lecteur détecté. Sous Linux il faut
|
|
377
|
+
au moins un de `mpv`, `ffplay`, `play`, `cvlc` (tous formats) ou `pw-play`,
|
|
378
|
+
`paplay`, `aplay` (wav). Sans aucun, doot s'affiche en silence plutôt que de planter.
|
|
379
|
+
|
|
380
|
+
**Mon image ne s'affiche pas** → tkinter ne lit que le PNG et le GIF. Convertis
|
|
381
|
+
ton jpg/webp, par exemple avec `ffmpeg -i image.webp image.png`. Une image
|
|
382
|
+
illisible fait simplement revenir l'ASCII art.
|
|
383
|
+
|
|
384
|
+
**Il n'apparaît que sur un seul écran** → `doot --screens` liste ce que doot
|
|
385
|
+
détecte. Sous Linux la détection passe par `xrandr` : sans lui (ou sous Wayland
|
|
386
|
+
pur), tout le bureau est vu comme un seul écran. Installe `xorg-xrandr`, ou fixe
|
|
387
|
+
la cible avec `doot --screen 0`. Avec des écrans à facteurs d'échelle différents
|
|
388
|
+
sous Windows, la position peut se décaler un peu : `--screen primary` évite le
|
|
389
|
+
problème.
|
|
390
|
+
|
|
391
|
+
**Le fond n'est pas transparent** (Linux) → il faut un compositeur actif
|
|
392
|
+
(`picom`, KWin, Mutter…). Sinon le squelette s'affiche sur un fond sombre.
|
|
393
|
+
|
|
394
|
+
**Ça ne se déclenche jamais** → on est peut-être hors saison. `doot --status`
|
|
395
|
+
te dit la date de réouverture. Pour vérifier que tout marche :
|
|
396
|
+
`doot --once --ignore-season`.
|
|
397
|
+
|
|
398
|
+
**Le daemon ne redémarre pas à la session** →
|
|
399
|
+
`systemctl --user status doot` (Linux), `launchctl list | grep doot` (macOS),
|
|
400
|
+
ou vérifie le raccourci dans `shell:startup` (Windows).
|
|
401
|
+
|
|
402
|
+
## Tests
|
|
403
|
+
|
|
404
|
+
La suite est en `unittest`, donc elle tourne sans rien installer :
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
python -m unittest discover -s tests -v
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
Elle couvre les bornes de la saison, le placement multi-écrans, la synthèse du
|
|
411
|
+
jingle et le choix du son. Les tests du décodeur PNG comparent sa sortie à celle
|
|
412
|
+
de Pillow, octet pour octet, sur neuf variantes de fichier (RGBA, RGB, gris,
|
|
413
|
+
gris+alpha, palette 1/2/4/8 bits, avec et sans `tRNS`) ; ils se mettent en pause
|
|
414
|
+
si Pillow ou `doot/png.py` est absent :
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
python -m pip install pillow # pour activer les tests PNG
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
La CI rejoue tout ça sur Linux, Windows et macOS à chaque push et chaque pull
|
|
421
|
+
request, vérifie qu'aucun doot ne s'affiche hors saison, et contrôle la syntaxe
|
|
422
|
+
des quatre installeurs.
|
|
423
|
+
|
|
424
|
+
## Comment ça marche
|
|
425
|
+
|
|
426
|
+
| Fichier | Rôle |
|
|
427
|
+
| --- | --- |
|
|
428
|
+
| `doot/season.py` | la fenêtre 1er septembre → 31 octobre |
|
|
429
|
+
| `doot/art.py` | l'ASCII art et les images de l'animation |
|
|
430
|
+
| `doot/image.py` | le choix du PNG/GIF déposé par l'utilisateur |
|
|
431
|
+
| `doot/screens.py` | l'énumération des écrans (Win32 / xrandr / CoreGraphics) |
|
|
432
|
+
| `doot/sound.py` | synthèse du jingle, durée et lecture selon l'OS |
|
|
433
|
+
| `doot/window.py` | l'overlay tkinter, la transparence, le fondu |
|
|
434
|
+
| `doot/cli.py` | la CLI, la boucle aléatoire, l'instance unique |
|
|
435
|
+
|
|
436
|
+
Le daemon tire un délai au hasard entre `--min` et `--max`, dort, vérifie que la
|
|
437
|
+
saison est toujours ouverte, affiche le squelette, recommence. Hors saison, il
|
|
438
|
+
se contente de revérifier la date toutes les heures.
|
|
439
|
+
|
|
440
|
+
## Licence
|
|
441
|
+
|
|
442
|
+
Le **code** est sous licence MIT, ainsi que l'ASCII art et le jingle synthétisé,
|
|
443
|
+
qui sont originaux.
|
|
444
|
+
|
|
445
|
+
Les fichiers de `doot/assets/` sont l'exception : le mème *skull trumpet* n'est
|
|
446
|
+
pas de moi et n'est pas couvert par la licence MIT du projet. Il est inclus par
|
|
447
|
+
commodité ; retire-le si ton usage l'exige, et les médias que tu ajoutes toi-même
|
|
448
|
+
restent soumis à leurs propres droits.
|