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.
@@ -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
+ [![CI](https://github.com/boubou666/doot/actions/workflows/ci.yml/badge.svg)](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.