github peterdu1109/NotifySync v5.5.12.0-beta1
🧪 NotifySync v5.5.12.0-beta1

pre-release6 hours ago

🧪 Beta channel — This release is opt-in. The standard repository feed still points to 5.5.11.12. To install this build, add the beta repository URL: https://raw.githubusercontent.com/peterdu1109/NotifySync/main/repository-beta.json. Bug reports welcome at github.com/peterdu1109/NotifySync/issues.

🇬🇧 English

📝 In Short

The UPD / MAJ badge now carries an accurate sub-label (Quality, Codec, or Audio) whenever a file is replaced with one that differs in those dimensions — and stays silent when nothing meaningful changed.

✨ What's New / 🐛 What's Fixed

  • The replacement badge tells you what actually changed — When a file is replaced (in place or via delete + re-add), the bell labels it MAJ • Quality, MAJ • Codec, or MAJ • Audio based on the filename. Previously most replacements ended up as a generic MAJ • Mineur or no sub-label at all.
  • Quality changes are detected in both directions — A 1080p file replaced by a 4K release shows MAJ • Quality, and so does the reverse (4K → 1080p). Same for source (BluRay ↔ WEBRip). You get notified when the quality tier changed, regardless of direction.
  • Audio-track detection is broader — Any release that adds a new audio track triggers MAJ • Audio. Covers French dubs (VFF, VFQ, VFI, TRUEFRENCH, FRENCH), multi-language markers (MULTI, DUAL), and generic dub markers (DUBBED, DUB). Examples: [VOSTFR][FRENCH]/[VFF], or [JA][MULTI], both surface as MAJ • Audio.
  • No more noise from harmless changes — Metadata refreshes, subtitle file additions, file moves to a different folder with the same name, and in-place re-encodes that don't change the filename are now silent. The item stays where it is in the list with no badge change. Stale MAJ • Mineur badges left by earlier internal beta builds are cleared automatically on first startup.

🧪 What to test

If you can, exercise these paths and let me know if the labels match reality:

  • A movie deleted and re-imported within the same week (Sonarr/Radarr workflow) with a higher-quality release.
  • An episode going from [VOSTFR] to [FRENCH] or [VFF].
  • A codec swap in the filename (x264HEVC/AV1).
  • A pure metadata refresh, subtitle add, or file move to a new folder — should stay silent.

🔧 Technical details for the curious

ClassifyUpgrade is now purely filename-based and returns one of three kinds (KindQuality, KindCodec, KindAudio) or null. Tokens are matched with a word-boundary regex ((?:^|[^a-z0-9])tag(?:$|[^a-z0-9])) to avoid false matches like vf inside vfx.

Detection signals (all symmetric, except Audio which only flags additions):

  • Quality — resolution token differs (1080p vs 2160p/4k/uhd) or source token differs (web/hdtv vs bluray/remux), in either direction.
  • Codec — codec family changed in either direction (x264/h264/avchevc/x265/h265av1).
  • Audio — single unified AudioAddedTokens = { vff, vfq, vfi, vf, truefrench, french, multi, dual, dubbed, dub } list. Any token present in the new path but absent in the old triggers KindAudio. Asymmetric on purpose: removing an audio track isn't an "upgrade" worth surfacing in this UI.

Removed in this build (vs. earlier internal iterations):

  • Phase B Lite signals: pixel-dimension delta, derived bitrate jump, container change, raw size growth.
  • Generic (sizeChanged && dateChanged) upgrade trigger (too noisy on Sonarr atomic moves and metadata refreshes).
  • legacyFallback for pre-5.5.7.3 databases (those rows have rotated out of the 2000-row global cap by now).
  • KindMinor — anything that classified as minor is now treated as "no upgrade".
  • NotificationItem.Size and NotificationItem.DateModifiedTicks (both were only consumed by the removed (sizeChanged && dateChanged) branch).

Schema migration on startup:

  • Notifications and DeletedItems keep FilePath (essential for path-based detection).
  • Phase B Lite columns (VideoWidth, VideoHeight, Container, MediaBitrate) plus Size and DateModifiedTicks are dropped via a new MigrateDropColumn helper. Requires SQLite ≥ 3.35; Jellyfin embeds a much newer build.
  • One-time UPDATE Notifications SET UpgradeKind = NULL, IsUpgrade = 0 WHERE UpgradeKind = 'minor' clears stale "minor" rows from earlier beta1 builds so the UI doesn't show ghost MAJ • Mineur badges.

Behavior matrix:

Scenario Behavior
[VOSTFR][FRENCH] / [VFF] MAJ • Audio
[JA][MULTI] MAJ • Audio
[1080p][2160p] MAJ • Quality
[2160p][1080p] MAJ • Quality
[WEBRip][BluRay] MAJ • Quality
[BluRay][WEBRip] MAJ • Quality
[x264][HEVC] MAJ • Codec
[HEVC][x264] MAJ • Codec
Subtitle file added silent
Metadata refresh silent
File moved to another folder, same name silent
In-place re-encode, no filename change silent
[VOSTFR][VOSTFR] (re-encode) silent

The internal plugin version is 5.5.12.0 (System.Version-parsable). The -beta1 suffix appears only in the GitHub tag, release title, README badge, admin-page badge, and client.js banner.


🇫🇷 Français

📝 En bref

Le badge UPD / MAJ porte maintenant une sous-étiquette précise (Quality, Codec ou Audio) à chaque fois qu'un fichier est remplacé par un autre qui diffère sur ces dimensions — et reste silencieux quand rien de significatif n'a changé.

✨ Quoi de Neuf / 🐛 Corrections

  • Le badge de remplacement indique enfin ce qui a vraiment changé — Quand un fichier est remplacé (en place ou via suppression + réimport), la cloche affiche MAJ • Quality, MAJ • Codec ou MAJ • Audio selon le nom du fichier. Avant, la plupart des remplacements finissaient en MAJ • Mineur générique ou sans sous-étiquette du tout.
  • Les changements de qualité sont détectés dans les deux sens — Un fichier 1080p remplacé par une version 4K affiche MAJ • Quality, et l'inverse aussi (4K → 1080p). Pareil pour la source (BluRay ↔ WEBRip). Vous êtes notifié quand le palier de qualité a changé, peu importe le sens.
  • La détection audio est plus large — Tout release qui ajoute une nouvelle piste audio déclenche MAJ • Audio. Couvre les doublages français (VFF, VFQ, VFI, TRUEFRENCH, FRENCH), les marqueurs multi-langues (MULTI, DUAL) et les marqueurs génériques (DUBBED, DUB). Exemples : [VOSTFR][FRENCH]/[VFF], ou [JA][MULTI], donnent MAJ • Audio.
  • Plus de bruit sur les changements anodins — Les rafraîchissements de métadonnées, ajouts de sous-titres, déplacements de fichier vers un autre dossier (même nom) et ré-encodages en place sans changement de nom sont maintenant silencieux. L'item reste à sa place dans la liste, sans badge. Les anciens badges MAJ • Mineur laissés par les builds beta internes précédents sont nettoyés automatiquement au premier démarrage.

🧪 À tester

Si vous pouvez, exercez ces parcours et faites-moi savoir si les étiquettes collent :

  • Un film supprimé puis réimporté dans la même semaine (workflow Sonarr/Radarr) avec une meilleure qualité.
  • Un épisode passant de [VOSTFR] à [FRENCH] ou [VFF].
  • Un changement de codec dans le nom (x264HEVC/AV1).
  • Un simple rafraîchissement de métadonnées, ajout de sous-titres ou déplacement de fichier — doit rester silencieux.

🔧 Détails techniques pour les curieux

ClassifyUpgrade est désormais purement basée sur le nom de fichier et retourne un des trois kinds (KindQuality, KindCodec, KindAudio) ou null. Les tokens sont matchés avec un regex word-boundary ((?:^|[^a-z0-9])tag(?:$|[^a-z0-9])) pour éviter les faux positifs type vf à l'intérieur de vfx.

Signaux de détection (tous symétriques, sauf Audio qui ne flag que les ajouts) :

  • Quality — token de résolution différent (1080p vs 2160p/4k/uhd) ou token de source différent (web/hdtv vs bluray/remux), dans n'importe quel sens.
  • Codec — famille de codec changée dans n'importe quelle direction (x264/h264/avchevc/x265/h265av1).
  • Audio — une seule liste unifiée AudioAddedTokens = { vff, vfq, vfi, vf, truefrench, french, multi, dual, dubbed, dub }. Tout token présent dans le nouveau path et absent de l'ancien déclenche KindAudio. Asymétrique exprès : retirer une piste audio n'est pas un "upgrade" intéressant à remonter dans cette UI.

Retiré dans ce build (par rapport aux itérations internes précédentes) :

  • Signaux Phase B Lite : delta de dimensions pixel, saut de bitrate dérivé, changement de container, croissance brute de taille.
  • Trigger générique (sizeChanged && dateChanged) (trop bruyant avec les atomic-moves de Sonarr et les rafraîchissements de métadonnées).
  • legacyFallback pour les bases pré-5.5.7.3 (ces lignes ont déjà tourné hors du cap global de 2000).
  • KindMinor — tout ce qui se classait en mineur est désormais traité comme "pas une mise à jour".
  • NotificationItem.Size et NotificationItem.DateModifiedTicks (tous deux n'étaient consommés que par la branche (sizeChanged && dateChanged) retirée).

Migration de schéma au démarrage :

  • Notifications et DeletedItems conservent FilePath (essentiel pour la détection basée nom).
  • Les colonnes Phase B Lite (VideoWidth, VideoHeight, Container, MediaBitrate) plus Size et DateModifiedTicks sont supprimées via un nouveau helper MigrateDropColumn. Nécessite SQLite ≥ 3.35 ; Jellyfin embarque bien plus récent.
  • Un UPDATE Notifications SET UpgradeKind = NULL, IsUpgrade = 0 WHERE UpgradeKind = 'minor' one-shot nettoie les anciennes lignes "minor" des builds beta1 précédents pour que l'UI n'affiche pas de badges MAJ • Mineur fantômes.

Matrice de comportement :

Scénario Comportement
[VOSTFR][FRENCH] / [VFF] MAJ • Audio
[JA][MULTI] MAJ • Audio
[1080p][2160p] MAJ • Quality
[2160p][1080p] MAJ • Quality
[WEBRip][BluRay] MAJ • Quality
[BluRay][WEBRip] MAJ • Quality
[x264][HEVC] MAJ • Codec
[HEVC][x264] MAJ • Codec
Sous-titres ajoutés silencieux
Rafraîchissement de métadonnées silencieux
Fichier déplacé dans un autre dossier, même nom silencieux
Ré-encodage en place, sans changement de nom silencieux
[VOSTFR][VOSTFR] (ré-encodage) silencieux

La version interne du plugin est 5.5.12.0 (parseable par System.Version). Le suffixe -beta1 n'apparaît que dans le tag GitHub, le titre du release, le badge du README, le badge de la page d'admin et la bannière de client.js.

Don't miss a new NotifySync release

NewReleases is sending notifications on new releases.