github peterdu1109/NotifySync v5.5.12.2-beta3
🧪 NotifySync v5.5.12.2-beta3

pre-release3 hours ago

🧪 Beta channel — Pre-release. Add the beta repo URL to install: https://raw.githubusercontent.com/peterdu1109/NotifySync/main/repository-beta.json. If you're on 5.5.12.1-beta2, Jellyfin will offer this as a regular update.

🇬🇧 English

📝 In Short

The bell now tells you which season(s) a batch of episodes belongs to, and the admin Deletions tab gained a file path column plus a matched / orphan status pill so you can debug what NotifySync saw vs what it correlated.

✨ What's New

  • Season-aware grouping in the bell — When you import a batch of episodes (Sonarr season pack, etc.), the dropdown card now reads "Solo Leveling — Saison 4 — 24 épisodes" instead of the generic "24 new episodes". If multiple seasons land at once, they're shown as a compact range:
    • 1 season → Season 4
    • 2-3 consecutive → S1-S3
    • Mixed → S1-S2 S4
  • File path in Deletions tab — Previously you only saw the title and date of deleted items. Now the admin tab includes the full path of each deleted file (truncated with ellipsis, full path on hover). Makes it easy to spot why a re-import didn't correlate — "the old path was /disk1/Movies/A.WEB-DL.1080p.mkv but the new one is /disk2/Movies/A 1080p.mkv — the filename diverged too much for the matcher".
  • Matched / Orphan status — Each deletion now carries a status pill: green Replaced if a new file was correlated as an upgrade for it, grey Orphan otherwise. Helps answer the common question "why didn't I get a MAJ badge?" — if the line is "Orphan", NotifySync saw the deletion but couldn't find a matching re-import within 7 days.

🧪 What to test

  • Import a season via Sonarr/Radarr → the bell should show "Saison X — N épisodes", not just "N new episodes".
  • Delete + re-import a file → the Deletions tab should show that line as Replaced, and the corresponding notification in the bell should carry a MAJ badge.
  • Delete a file without re-importing → the Deletions tab should keep it as Orphan.

🔧 Technical details for the curious

Season grouping (client-side, no server changes). processGrouping in client.js now collects the set of distinct ParentIndexNumber values per group and attaches them as Seasons on the group object. A new formatSeasons(seasons) helper compresses sorted unique seasons into a string: single → Saison N (localized), multiple consecutive → S{first}-S{last}, mixed → space-separated runs. Specials (season 0) and non-positive integers are filtered out. The rendering paths for the hero card and list items both prepend the season label with an em-dash separator when present.

FilePath exposure. Already in the SQL schema from beta1. GetDeletedItems now selects it (along with IndexNumber, ParentIndexNumber) and returns it in the DeletedItemRecord DTO. The admin tab adds a "Path" column with text-overflow: ellipsis + title attribute for the tooltip.

MatchedNotificationId. New TEXT NULL column on DeletedItems. Populated by _db.MarkDeletedAsMatched(deletedId, notificationId) from two call sites: ProcessBuffer (new-item path) and OnItemUpdated's metadata-refresh recovery path, both after ClassifyUpgrade returned a non-null kind. The admin tab renders it as a pill: .ns-status-pill.matched (green) or .ns-status-pill.orphan (grey). No backfill for existing rows — past deletions stay marked as "Orphan" until they age out via the retention policy (default 30 days).

Migrations. MigrateAddColumn(DeletedItems, MatchedNotificationId, TEXT) runs at startup. Idempotent for fresh installs.

No backward-compat issue. Old notifications display as before (no Seasons field → fallback to plain "X new episodes"). Old deletions show as Orphan + "—" for the path (FilePath stored but null on pre-beta1 rows).

Internal plugin version is 5.5.12.2 (System.Version-parsable). User-facing strings (tag, release title, README badge, admin badge, client.js banner) read 5.5.12.2-beta3.


🇫🇷 Français

📝 En bref

La cloche indique maintenant quelle(s) saison(s) correspondent à un lot d'épisodes ajoutés, et l'onglet admin Suppressions a gagné une colonne chemin plus une étiquette matché / orphelin pour debug ce que NotifySync a vu vs ce qu'il a corrélé.

✨ Quoi de Neuf

  • Regroupement par saison dans la cloche — Quand tu importes un lot d'épisodes (saison Sonarr, etc.), la carte du dropdown affiche désormais "Solo Leveling — Saison 4 — 24 épisodes" au lieu du générique "24 nouveaux épisodes". Si plusieurs saisons arrivent en même temps, elles s'affichent en notation compacte :
    • 1 saison → Saison 4
    • 2-3 consécutives → S1-S3
    • Mixte → S1-S2 S4
  • Chemin de fichier dans l'onglet Suppressions — Avant tu ne voyais que le titre et la date d'un item supprimé. L'onglet admin inclut maintenant le chemin complet de chaque fichier (tronqué avec ellipsis, chemin complet en tooltip au survol). Permet de comprendre rapidement pourquoi un réimport n'a pas corrélé — "l'ancien chemin était /disk1/Movies/A.WEB-DL.1080p.mkv mais le nouveau est /disk2/Movies/A 1080p.mkv — le nom de fichier a trop divergé pour la détection".
  • Statut matché / orphelin — Chaque suppression porte maintenant une étiquette : vert Remplacé si un nouveau fichier a été corrélé comme upgrade, gris Orphelin sinon. Aide à répondre à la question classique "pourquoi je n'ai pas eu de badge MAJ ?" — si la ligne est "Orphelin", NotifySync a vu la suppression mais n'a trouvé aucun réimport correspondant dans les 7 jours.

🧪 À tester

  • Importe une saison via Sonarr/Radarr → la cloche doit afficher "Saison X — N épisodes", pas juste "N nouveaux épisodes".
  • Supprime + réimporte un fichier → l'onglet Suppressions doit montrer la ligne en Remplacé, et la notification correspondante dans la cloche doit porter un badge MAJ.
  • Supprime un fichier sans réimporter → l'onglet Suppressions doit la garder en Orphelin.

🔧 Détails techniques pour les curieux

Grouping par saison (côté client, aucun changement serveur). processGrouping dans client.js collecte maintenant l'ensemble des ParentIndexNumber distincts par groupe et les attache comme Seasons sur l'objet groupe. Un nouveau helper formatSeasons(seasons) compresse les saisons triées uniques en string : single → Saison N (localisé), plusieurs consécutives → S{first}-S{last}, mixte → runs séparés par espaces. Les specials (saison 0) et entiers non-positifs sont filtrés. Les chemins de rendu pour la carte hero et les items de la liste préfixent tous deux le label saison avec un tiret cadratin comme séparateur quand il est présent.

Exposition FilePath. Déjà en schéma SQL depuis beta1. GetDeletedItems le sélectionne maintenant (avec IndexNumber, ParentIndexNumber) et le retourne dans le DTO DeletedItemRecord. L'onglet admin ajoute une colonne "Chemin" avec text-overflow: ellipsis + attribut title pour le tooltip.

MatchedNotificationId. Nouvelle colonne TEXT NULL sur DeletedItems. Populée par _db.MarkDeletedAsMatched(deletedId, notificationId) depuis deux endroits : ProcessBuffer (chemin nouvel-item) et le chemin de récupération metadata-refresh de OnItemUpdated, tous deux après que ClassifyUpgrade ait retourné un kind non-null. L'onglet admin la rend comme une pill : .ns-status-pill.matched (vert) ou .ns-status-pill.orphan (gris). Aucun backfill pour les lignes existantes — les anciennes suppressions restent marquées "Orphelin" jusqu'à ce qu'elles expirent via la politique de rétention (30 jours par défaut).

Migrations. MigrateAddColumn(DeletedItems, MatchedNotificationId, TEXT) s'exécute au démarrage. Idempotent sur les fresh installs.

Pas de problème de backward-compat. Les anciennes notifications s'affichent comme avant (pas de champ Seasons → fallback au "X nouveaux épisodes" classique). Les anciennes suppressions s'affichent en Orphelin + "—" pour le chemin (FilePath stocké mais null sur les lignes pré-beta1).

La version interne du plugin est 5.5.12.2 (parseable par System.Version). Les strings user-facing (tag, titre release, badge README, badge admin, bannière client.js) affichent 5.5.12.2-beta3.

Don't miss a new NotifySync release

NewReleases is sending notifications on new releases.