{"id":48986313,"url":"https://github.com/peterdu1109/NotifySync","last_synced_at":"2026-05-04T16:01:03.797Z","repository":{"id":332555245,"uuid":"1129715147","full_name":"peterdu1109/NotifySync","owner":"peterdu1109","description":"NotifySync transforme l'interface de Jellyfin en ajoutant une icône de notification (cloche) native. Il permet à vos utilisateurs de voir instantanément les derniers ajouts (Films, Séries, Musique) sans quitter leur page actuelle, le tout avec un design fluide inspiré des plateformes de streaming majeures.","archived":false,"fork":false,"pushed_at":"2026-04-27T13:07:20.000Z","size":55814,"stargazers_count":13,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-27T15:09:45.901Z","etag":null,"topics":["dotnet9","jellyfin","jellyfin-plugin","jellyfin-ui","notifications","selfhosted"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peterdu1109.png","metadata":{"files":{"readme":"README.md","changelog":"HistoryScanTask.cs","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-07T13:35:06.000Z","updated_at":"2026-04-27T13:07:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/peterdu1109/NotifySync","commit_stats":null,"previous_names":["peterdu1109/notifysync"],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/peterdu1109/NotifySync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterdu1109%2FNotifySync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterdu1109%2FNotifySync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterdu1109%2FNotifySync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterdu1109%2FNotifySync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peterdu1109","download_url":"https://codeload.github.com/peterdu1109/NotifySync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterdu1109%2FNotifySync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32614385,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dotnet9","jellyfin","jellyfin-plugin","jellyfin-ui","notifications","selfhosted"],"created_at":"2026-04-18T13:00:27.678Z","updated_at":"2026-05-04T16:01:03.783Z","avatar_url":"https://github.com/peterdu1109.png","language":"C#","funding_links":[],"categories":["🧩 Plugins"],"sub_categories":["🔔 Notifications"],"readme":"\u003ch1 align=\"center\"\u003e🔔 NotifySync\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/version-5.5.9.1-blue\" alt=\"Version\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/.NET-9.0-purple\" alt=\".NET Framework\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Jellyfin-10.11.X-blueviolet\" alt=\"Jellyfin\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eThe modern notification center Jellyfin has been waiting for.\u003c/b\u003e\u003cbr\u003e\n  \u003ci\u003eLe centre de notifications moderne que Jellyfin attendait.\u003c/i\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003e🌐 Language / Langue\u003c/b\u003e\u003cbr\u003e\n  \u003ca href=\"#english\"\u003eEnglish\u003c/a\u003e | \u003ca href=\"#français\"\u003eFrançais\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\u003ca name=\"english\"\u003e\u003c/a\u003e\n# English\n\nNotifySync transforms the Jellyfin interface by adding a native notification bell, inspired by major streaming platforms. Your users instantly see the latest additions — Movies, Series, Music — without ever leaving their current page, through a sleek glass-morphism dropdown that feels like it was always part of Jellyfin.\n\n## ✨ Key Features\n\n### 🎨 User Experience\n*   **Netflix-Style Design** — A sleek dropdown with a frosted glass look. The red counter disappears as soon as you open the bell, but NEW/UPD badges stay visible for 72 hours so you can always spot recent additions.\n*   **Hero Section** — The latest addition is displayed large with its backdrop image. One click takes you straight to the content. You can also dismiss it directly.\n*   **Smart Grouping** — Episodes of the same series are grouped together (e.g. *\"3 new episodes\"*). Music tracks are grouped by album.\n*   **Category Filters** — Quick filters (All / Movies / Series / Music / custom) to focus on what matters to you.\n*   **Dismiss Notifications** — Remove any notification with a click, or swipe it left on mobile. The button at the bottom adapts to your filter: clear everything, or just the selected category.\n*   **File Upgrade Badge** — When you replace a media file (quality upgrade, re-encode), the notification comes back to the top with a blue **UPD** badge instead of **NEW**.\n*   **Collection Monitoring** — Track your Jellyfin collections (BoxSets): new additions to a monitored collection trigger a notification.\n*   **Deletion History** — Administrators can see a log of recently deleted media in the configuration page, with configurable retention.\n*   **Synced Across Devices** — Read/unread status is saved on the server and stays in sync across all your browsers and devices.\n*   **Bell Animation** — The bell shakes when new content arrives, so you never miss an update.\n*   **Clear List (Safe)** — Clear all notifications without affecting your Jellyfin watch history — nothing gets marked as \"Played\".\n*   **Bilingual Interface** — The bell and config page follow your Jellyfin language (French / English).\n*   **Relative Timestamps** — Dates show as *\"2 hours ago\"*, *\"yesterday\"*, *\"3 days ago\"*.\n*   **Theme Song Filtering** — Openings, endings, and NCOP/NCED are automatically excluded.\n*   **Responsive** — Works on desktop, tablet, and mobile (via the official Jellyfin app). *Note: Not supported on TV.*\n\n### 🚀 Performance\n*   **Real-Time Updates** — Notifications appear instantly thanks to Jellyfin's built-in WebSockets. No page refresh needed.\n*   **Smart Caching** — The plugin only transfers data when something has actually changed, saving bandwidth and keeping things fast.\n*   **Lazy Image Loading** — Thumbnails load as you scroll, keeping the interface snappy even with many notifications.\n*   **Lightweight Storage** — All data is stored in a fast SQLite database optimized for concurrent access.\n*   **Optimized for .NET 9** — Built for the latest Jellyfin runtime for maximum performance.\n\n### 🛡️ Security \u0026 Privacy\n*   **Respects Jellyfin Permissions** — Each user only sees content from the libraries they have access to. All restrictions (tags, ratings, folders) are enforced.\n*   **User Isolation** — No user can access another user's notifications or data. Admins can manage all users.\n*   **Safe Against Attacks** — All content is sanitized before display, and all database queries are protected against injection.\n*   **Anti-Spam** — 30-second cooldown on manual history regeneration to protect server resources.\n*   **Crash-Safe** — Data is written safely to prevent corruption even if the server stops unexpectedly.\n\n## 📦 Installation\n\n\u003e [!IMPORTANT]\n\u003e **Prerequisites:**\n\u003e * Jellyfin **10.11.X**\n\n### Steps\n1.  Open your Jellyfin dashboard \u003e **Plugins** \u003e **Repositories**.\n2.  Add a new repository:\n    ```\n    https://raw.githubusercontent.com/peterdu1109/NotifySync/refs/heads/main/repository.json\n    ```\n3.  Go to the **Catalog**, find **NotifySync** and click **Install**.\n4.  Restart your Jellyfin server.\n\n### 🔔 Enable the Bell\n\n\u003e [!TIP]\n\u003e **Method 1: File Transformation (Highly Recommended) ✅**\n\u003e Install the File Transformation plugin for automatic injection — no file editing required:\n\u003e 1.  Add repository: `https://www.iamparadox.dev/jellyfin/plugins/manifest.json`\n\u003e 2.  Install **File Transformation**.\n\u003e 3.  Restart Jellyfin → `Ctrl+F5`.\n\n#### Method 2: Manual Injection\nIf you prefer not to install another plugin, manually add the script tag to your `index.html`:\n\n| Platform | Command |\n|----------|---------|\n| **Linux** | `sudo sed -i 's\\|\u003c/body\u003e\\|    \u003cscript src=\"/NotifySync/client.js\"\u003e\u003c/script\u003e\\n\u003c/body\u003e\\|' /usr/share/jellyfin/web/index.html` |\n| **Docker** | `docker exec jellyfin sed -i 's\\|\u003c/body\u003e\\|    \u003cscript src=\"/NotifySync/client.js\"\u003e\u003c/script\u003e\\n\u003c/body\u003e\\|' /jellyfin/jellyfin-web/index.html` |\n| **Windows** | Add `\u003cscript src=\"/NotifySync/client.js\"\u003e\u003c/script\u003e` before `\u003c/body\u003e` in `C:\\Program Files\\Jellyfin\\Server\\jellyfin-web\\index.html` |\n\n## ⚙️ Configuration\n\nGo to **Dashboard \u003e Plugins \u003e NotifySync**.\n\n| Setting | Description |\n|---------|-------------|\n| **Quotas** | Maximum number of items to display per category (1–50). |\n| **Monitored Libraries** | Check the folders you want to appear in notifications. |\n| **Monitored Collections** | Select Jellyfin collections (BoxSets) to track for new additions. |\n| **Category Mapping** | Rename your libraries for display in the bell (e.g. *\"My Movies\"* → *\"Movies\"*). |\n| **Manual Library IDs** | Add library IDs or names manually for advanced setups (Channels, XFusion). |\n| **Deleted Items Tracking** | Enable/disable the deletion history log (admin only). |\n| **Deletion Retention** | Number of days to keep deleted item records (1–365, default 30). |\n| **Regenerate History** | Force a full rescan after changing libraries or quotas. |\n\n## ❓ Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| **Bell doesn't appear** | Check **File Transformation** is installed. Clear browser cache (`Ctrl+Shift+R`). |\n| **Badge count is wrong** | Click \"Regenerate history\" in config. Clear browser localStorage. |\n| **Music not synced** | Use \"Regenerate history\" to rescan audio tracks. |\n| **Content missing** | Ensure the library is checked in \"Monitored Libraries\". |\n| **Unauthorized content visible** | Plugin respects Jellyfin permissions — check user restrictions in the dashboard. |\n| **429 Error** | Wait 30 seconds between \"Regenerate history\" clicks (anti-spam). |\n| **Incompatible** | Ensure you are running Jellyfin **10.11.X**. |\n\n---\n\n\u003ca name=\"français\"\u003e\u003c/a\u003e\n# Français\n\nNotifySync transforme l'interface Jellyfin en y ajoutant une cloche de notifications native, inspirée des grandes plateformes de streaming. Vos utilisateurs voient instantanément les derniers ajouts — Films, Séries, Musique — sans jamais quitter leur page, via un menu déroulant en verre dépoli qui s'intègre naturellement dans Jellyfin.\n\n## ✨ Fonctionnalités\n\n### 🎨 Expérience Utilisateur\n*   **Design Netflix-Style** — Un menu déroulant élégant avec effet de verre dépoli. Le compteur rouge disparaît dès l'ouverture de la cloche, mais les badges NOUVEAU/MAJ restent visibles pendant 72 heures pour repérer facilement les nouveautés.\n*   **Section Hero** — Le dernier ajout s'affiche en grand avec son image de fond. Un clic mène directement au contenu. Vous pouvez aussi le supprimer directement.\n*   **Regroupement Intelligent** — Les épisodes d'une même série sont groupés (ex. *\"3 nouveaux épisodes\"*). Les musiques sont groupées par album.\n*   **Filtres par Catégorie** — Des filtres rapides (Tout / Films / Séries / Musique / personnalisé) pour cibler ce qui vous intéresse.\n*   **Supprimer des Notifications** — Retirez une notification d'un clic, ou glissez-la vers la gauche sur mobile. Le bouton en bas s'adapte à votre filtre : vider tout, ou seulement la catégorie sélectionnée.\n*   **Badge MAJ (Mise à Jour de Fichier)** — Quand vous remplacez un fichier média (upgrade qualité, ré-encodage), la notification remonte en haut avec un badge bleu **MAJ** au lieu de **NOUVEAU**.\n*   **Surveillance des Collections** — Suivez vos collections Jellyfin (BoxSets) : les nouveaux ajouts dans une collection surveillée déclenchent une notification.\n*   **Historique des Suppressions** — Les administrateurs peuvent consulter les médias récemment supprimés dans la page de configuration, avec rétention paramétrable.\n*   **Synchronisé entre Appareils** — L'état lu/non-lu est sauvegardé sur le serveur et reste synchronisé sur tous vos navigateurs et appareils.\n*   **Animation de la Cloche** — La cloche s'anime quand un nouveau contenu arrive, pour ne rien manquer.\n*   **Vider la Liste (Sans Risque)** — Effacez toutes les notifications sans toucher à votre historique Jellyfin — rien n'est marqué comme \"Vu\".\n*   **Interface Bilingue** — La cloche et la page de configuration suivent la langue de votre Jellyfin (Français / Anglais).\n*   **Horodatage Relatif** — Les dates s'affichent sous forme *\"il y a 2 heures\"*, *\"hier\"*, *\"il y a 3 jours\"*.\n*   **Filtrage des Génériques** — Les openings, endings et NCOP/NCED sont automatiquement exclus.\n*   **Responsive** — Fonctionne sur bureau, tablette et mobile (via l'app officielle Jellyfin). *Note : Non supporté sur TV.*\n\n### 🚀 Performance\n*   **Mises à Jour en Temps Réel** — Les notifications apparaissent instantanément grâce aux WebSockets intégrés de Jellyfin. Aucun rafraîchissement nécessaire.\n*   **Cache Intelligent** — Le plugin ne transfère des données que lorsqu'il y a un réel changement, économisant la bande passante.\n*   **Chargement Progressif des Images** — Les miniatures se chargent au fil du défilement pour garder l'interface fluide.\n*   **Stockage Léger** — Toutes les données sont stockées dans une base rapide optimisée pour les accès simultanés.\n*   **Optimisé pour .NET 9** — Conçu pour la dernière version de Jellyfin, pour des performances maximales.\n\n### 🛡️ Sécurité \u0026 Confidentialité\n*   **Respecte les Permissions Jellyfin** — Chaque utilisateur ne voit que le contenu des bibliothèques auxquelles il a accès. Toutes les restrictions (tags, classifications, dossiers) sont respectées.\n*   **Isolation des Utilisateurs** — Aucun utilisateur ne peut accéder aux notifications d'un autre. Les administrateurs peuvent gérer tous les utilisateurs.\n*   **Protection Contre les Attaques** — Tout le contenu est nettoyé avant affichage, et toutes les requêtes sont protégées contre les injections.\n*   **Anti-Spam** — Cooldown de 30 secondes sur la régénération manuelle pour protéger les ressources serveur.\n*   **Résistant aux Crashs** — Les données sont écrites de manière sécurisée pour éviter toute corruption même en cas d'arrêt inattendu.\n\n## 📦 Installation\n\n\u003e [!IMPORTANT]\n\u003e **Pré-requis :**\n\u003e * Jellyfin **10.11.X**\n\n### Étapes\n1.  Tableau de bord Jellyfin \u003e **Extensions** \u003e **Dépôts**.\n2.  Ajoutez un nouveau dépôt :\n    ```\n    https://raw.githubusercontent.com/peterdu1109/NotifySync/refs/heads/main/repository.json\n    ```\n3.  Allez dans le **Catalogue**, trouvez **NotifySync** et cliquez sur **Installer**.\n4.  Redémarrez votre serveur Jellyfin.\n\n### 🔔 Activer la Cloche\n\n\u003e [!TIP]\n\u003e **Méthode 1 : File Transformation (Recommandé) ✅**\n\u003e Injection automatique sans modification de fichier :\n\u003e 1.  Dépôt : `https://www.iamparadox.dev/jellyfin/plugins/manifest.json`\n\u003e 2.  Installez **File Transformation** et redémarrez Jellyfin → `Ctrl+F5`.\n\n#### Méthode 2 : Injection Manuelle\nSi vous préférez ne pas installer d'extension tierce :\n\n| Plateforme | Commande |\n|------------|----------|\n| **Linux** | `sudo sed -i 's\\|\u003c/body\u003e\\|    \u003cscript src=\"/NotifySync/client.js\"\u003e\u003c/script\u003e\\n\u003c/body\u003e\\|' /usr/share/jellyfin/web/index.html` |\n| **Docker** | `docker exec jellyfin sed -i 's\\|\u003c/body\u003e\\|    \u003cscript src=\"/NotifySync/client.js\"\u003e\u003c/script\u003e\\n\u003c/body\u003e\\|' /jellyfin/jellyfin-web/index.html` |\n| **Windows** | Ajoutez `\u003cscript src=\"/NotifySync/client.js\"\u003e\u003c/script\u003e` avant `\u003c/body\u003e` dans `index.html` |\n\n## ⚙️ Configuration\n\nAllez dans **Tableau de bord \u003e Extensions \u003e NotifySync**.\n\n| Paramètre | Description |\n|-----------|-------------|\n| **Quotas** | Nombre maximum d'éléments affichés par catégorie (1–50). |\n| **Bibliothèques Surveillées** | Cochez les dossiers que vous souhaitez voir apparaître dans la cloche. |\n| **Collections Surveillées** | Sélectionnez les collections Jellyfin (BoxSets) à surveiller pour les nouveaux ajouts. |\n| **Mappage des Catégories** | Renommez vos bibliothèques pour l'affichage (ex. *\"Mes Films\"* → *\"Films\"*). |\n| **IDs Manuels** | Ajoutez des IDs ou noms de bibliothèques manuellement pour les configurations avancées (Channels, XFusion). |\n| **Suivi des Suppressions** | Activer/désactiver le journal des suppressions (admin uniquement). |\n| **Rétention des Suppressions** | Nombre de jours de conservation des éléments supprimés (1–365, défaut 30). |\n| **Régénérer l'Historique** | Force un scan complet après modification des bibliothèques ou quotas. |\n\n## ❓ Dépannage\n\n| Problème | Solution |\n|----------|----------|\n| **La cloche n'apparaît pas** | Vérifiez que **File Transformation** est installé. Videz le cache (`Ctrl+Shift+R`). |\n| **Le badge est incorrect** | Cliquez sur \"Régénérer l'historique\". Videz le localStorage du navigateur. |\n| **Musique non synchronisée** | Utilisez \"Régénérer l'historique\" pour rescanner les pistes audio. |\n| **Contenu manquant** | Vérifiez que la bibliothèque est cochée dans \"Bibliothèques Surveillées\". |\n| **Contenu non autorisé visible** | Le plugin respecte les permissions Jellyfin — vérifiez les restrictions utilisateur. |\n| **Erreur 429** | Attendez 30 secondes entre chaque clic sur \"Régénérer l'historique\" (anti-spam). |\n| **Incompatible** | Vérifiez que vous utilisez Jellyfin **10.11.X**. |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterdu1109%2FNotifySync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeterdu1109%2FNotifySync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterdu1109%2FNotifySync/lists"}