Si vous êtes comme moi et que vous vivez dans Apple Notes parce que c'est fluide, synchronisé partout, et que ça marche sans qu'on ait à se poser de questions, cet outil va vous plaire.
Parce que oui, voilà, le jour où vous voulez bidouiller vos notes en ligne de commande, les exporter en Markdown, ou simplement éviter de vous retrouver coincé dans votre prison dorée Apple... Et bien c'est la galère. J'ai longtemps cherché une solution propre. Je me suis même dit à un moment que j'allais coder un script Python foireux pour scrapper la base SQLite locale, mais j'ai vite abandonné l'idée.
Pourquoi ? Parce que j'ai découvert
Stash
, un petit outil en ligne de commande qui fait le pont entre vos notes Apple et des fichiers Markdown.
Et le truc cool, c'est que ça marche dans les deux sens. Vous pouvez exporter vos notes Apple en Markdown (comme ici :
Exporter pour vos backups
), mais aussi éditer vos fichiers Markdown et renvoyer les changements directement dans Apple Notes. C'est une vrai synchro bidirectionnelle qui vous rend vraiment maître de vos données.
J'ai testé ça sur macOS Tahoe avec un dossier de notes en vrac. J'ai lancé le bousin, et ça m'a fait plaisir de voir mes fichiers .md popper proprement dans le terminal, prêts à être commités ensuite sur un GitHub ou édités dans VS Code.
L'installation est toute bête, via Homebrew :
brew tap shakedlokits/stash https://github.com/shakedlokits/stash
brew install shakedlokits/stash/stash
Et ensuite, c'est juste 2 commandes. Pour exporter une note Apple vers Markdown, c'est
stash pull "Ma Super Note"
Stash va chercher la note dans Apple Notes, la convertit en Markdown propre via Pandoc, et vous la balance dans un fichier local Ma Super Note.md.
Et la seconde commande c'est pour faire l'inverse (éditer votre Markdown et pousser les changements vers Apple Notes). Là faut faire
stash push "Ma Super Note.md"
Et là, magie !! Vos modifs se retrouvent dans l'app Notes, synchronisées sur tous vos appareils Apple (iPhone, iPad, Mac). C'est dommage que ça soit pas natif ce truc.
Stash c'est chouette (Oula pas facile à prononcer vite celle là) parce qu'il utilise du YAML front-matter pour lier chaque fichier Markdown à une note Apple spécifique (via un ID unique). Quand vous faites stash push, le contenu du fichier écrase la note. Quand vous faites stash pull, la note écrase le fichier.
Attention toutefois car c'est là que ça se corse... Stash écrase sans pitié !! Si vous modifiez votre note sur l'iPhone ET votre fichier Markdown en même temps, c'est le dernier qui parle qui a raison. Y'a pas de fusion intelligente à la Git, donc gaffe aux conflits. C'est un peu brut de décoffrage, mais au moins c'est clair et prévisible.
Bref, pour ceux qui veulent scripter leurs notes, automatiser des backups, ou simplement bosser en Markdown avec leur éditeur préféré, c'est le chaînon manquant. J'avais testé Obsidian et Joplin par le passé, mais la synchro iCloud ou WebDAV m'avait saoulé. Là, c'est le bon compromis avec l'interface Apple pour la saisie, le Markdown pour le stockage long terme.
Les *arrs c’est du « chinois » pour vous ? Vous n’avez pas de machine assez puissante pour les faire tourner en sus d’un lecteur ? Vous voulez faire simple ?
CineSync, qui s’installe en Docker et peut tourner sur des machines peu puissantes avec 1 core et 1GB de RAM, permet, via une clé API (gratuite) TMDB, d’indexer et trier un dossier de fichiers en vrac (films et séries uniquement). Ça trie et organise via des symlinks (liens qui ne prennent aucune place) pour pouvoir ensuite profiter de ça via Plex/Jellyfin/Emby/Kodi ou un lecteur type VLC. Ce n’est pas un lecteur, juste un organiseur.
Pratique si vous avez accès à un FTP, un remote rClone, des APIs RealDebrid, AllDebrid ou TorBox, un montage NFS/sshFS… enfin n’importe quel espace de stockage avec des films et séries.
EDIT 06.10.25 : DjNiklos insiste à juste titre sur le fait qu’on peut combiner les dossiers sources en les séparant par des ,
Monitoring manuel ou automatique évidemment.
Je le teste avec mon montage AllDebrid de Decypharr, le dossier _ _ all _ _ où tous les fichiers sont en vrac. Le travail peut prendre un peu de temps selon la quantité de fichiers à traiter, les ressources allouées (cores/RAM) et les options demandées.
Et ça donne ce genre de tri (j’ai aucun contenu pour enfants mais ça les met à part également)
root@StreamBox:/mnt/Bibliothèques# ls CineSync/
4KMovies 4KShows CineSync Movies Shows
Le dossier CineSync = Collections, quand on demande leur création
Y’a plus qu’à indexer ça avec son lecteur favoris ou y accéder avec VLC ou autre et c’est nickel !
Supervision et automatisation en temps réel
CineSync intègre des fonctions avancées de surveillance et d’automatisation en temps réel, assurant une bibliothèque multimédia toujours parfaitement organisée — sans aucune intervention manuelle. Son interface web moderne offre un contrôle complet sur les paramètres d’automatisation et la supervision en direct de toutes les activités de traitement.
Système de surveillance intelligent
Détection instantanée : des algorithmes avancés repèrent immédiatement les nouveaux fichiers via les événements du système de fichiers.
Mode auto-traitement : activez ou désactivez le traitement automatique directement depuis l’interface web, pour un fonctionnement totalement mains libres.
Intégration streaming : les serveurs multimédias (Plex, Jellyfin, Emby) sont mis à jour en temps réel pour des bibliothèques toujours à jour.
Prévention des doublons : le système évite intelligemment le retraitement des mêmes contenus.
Flux de travail automatisés
Analyse initiale intelligente : un scan complet et une réorganisation de la bibliothèque au démarrage.
Surveillance continue : détection en temps réel des nouveaux fichiers, avec intervalles configurables.
Traitement en lot : gestion efficace de multiples fichiers grâce au traitement parallèle.
Récupération automatique : nouvelle tentative sur les opérations échouées, avec temporisation exponentielle.
Tableau de bord en temps réel
Statistiques en direct : visualisez instantanément la progression et l’état de la bibliothèque.
Suivi des ajouts récents : traçabilité automatique des contenus récemment ajoutés.
File d’attente visible : surveillance graphique des opérations en cours et à venir.
La surveillance en temps réel de CineSync est désormais une fonctionnalité native des scripts et images Docker, assurant une intégration fluide dans votre flux de travail. Grâce à elle, la gestion de votre médiathèque devient automatique et sans effort.
Automatisation personnalisable
Planification flexible : configurez les intervalles de surveillance et les horaires de traitement.
Règles spécifiques par contenu : appliquez des logiques différentes pour les films, séries, animés ou contenus jeunesse.
Nettoyage intelligent : suppression automatique des liens symboliques cassés et des entrées orphelines dans la base de données.
Intégration avec les serveurs multimédias
Jellyfin / Emby : actualisation instantanée via des liens symboliques compatibles inotify.
Plex : mise à jour automatique des bibliothèques grâce à l’API Plex.
Streaming direct : accès en temps réel aux contenus organisés par plusieurs méthodes.
Le système d’automatisation de CineSync transforme la gestion des médias d’une corvée manuelle en un processus fluide, intelligent et permanent.
Séparation intelligente des contenus
Contenu jeunesse : détection automatique des médias familiaux via les classifications TMDB (G, PG, TV-Y, TV-G, TV-PG) et les genres familiaux.
Organisation 4K : détection et séparation automatique des contenus UHD dans des dossiers dédiés.
Classification animés : gestion spécifique pour les animés, avec tri distinct entre films et séries.
Tri par résolution : classement intelligent selon la qualité vidéo (720p, 1080p, 4K, etc.).
Options d’organisation flexibles
Structure CineSync : organisation simplifiée en dossiers Movies et Shows.
Préservation de la structure source : possibilité de conserver les arborescences d’origine.
Nommage personnalisé : configuration libre des noms de dossiers selon le type de contenu.
Regroupement par collections : organisation automatique des sagas et franchises dans des répertoires communs.
Plutôt que de tout configurer via l’interface Web, on peut y adjoindre un .env. Fichier à placer dans le dossier /home/aerya/docker/cinesync/db dans mon cas, le montage local de /app/db. Le fichier de base est ici et il faut surtout y configurer la clé API TMDB et les dossiers source/destination.
# Directory Paths
# ========================================
# Source directory for input files
SOURCE_DIR="/mnt/decypharr/alldebrid/__all__"
# Destination directory for output files
DESTINATION_DIR="/mnt/Bibliothèques/CineSync"
Comme les *arrs quand ils travaillent sur les fichiers hébergés chez AllDebrid, accessibles dans /mnt/decypharr/alldebrid/_ _ all _ _, CineSync va les organiser et structurer localement via des symlinks dans /mnt/Bibliothèques/CineSync où Plex/Jellyfin/whatever pourra les indexer et lire.
admin/admin si vous ne changez pas dans la config
si pas de .env, il faut tout configurer via la WebUI
Et il n’y qu’à le laisser travailler ensuite
On peut éditer chaque fiche de contenu indexé pour déplacer vers un autre dossier selon l’orga de chacun (moi je laisse CineSync faire par défaut) et/ou éditer les informations d’un média.
On peut suivre et éditer/corriger l’indexation
La configuration est entièrement éditable via la WebUI
Et il peut même se faire passer pour Radarr et Sonarr auprès de Bazarr pour la gestion automatisée des sous-titres !
C’est vraiment super bien fait et très pratique quand on récupère « juste » un accès à une API ou un montage rClone dont on ne maitrise pas le contenu…
Solution simple et efficace pour régler le problème de synchronisation des références dans Zotero lorsque le prénom d'un auteur est trop long (plus de 256 caractères) parce que les données importées ne sont pas propres.
Adapté pour le prénom à partir du script proposé dans le forum :
var items = ZoteroPane.getSelectedItems();
for (let item of items) {
if (!item.isRegularItem()) continue;
let modified = false;
for (let i = 0; i < item.getCreators().length; i++) {
if (item.getCreators()[i].firstName.length > 255) {
item.removeCreator(i);
i--;
modified = true;
}
}
if (modified) {
await item.saveTx();
}
}
Recopie les fichiers absents du dossier destination depuis le dossier source.
-rv : récursif + verbose
--size-only : ne prend en compte que la taille des fichiers