Skip to content

Releases: Generator/jellyfin-plugin-multify

v0.0.11

Choose a tag to compare

@github-actions github-actions released this 15 Sep 15:00
  • Pin Jellyfin.Controller/Data to 12.0.0 (catalog 0.0.10.0 resolved floating 12.- to 12.1.0, unloadable on 12.0.0 servers with ReflectionTypeLoadException)

  • Bump version to 0.0.11 (net10.0, Jellyfin 12.0)

v0.0.10

Choose a tag to compare

@github-actions github-actions released this 15 Sep 14:34
  • TelegramMessageStore cleanup/disposal race (drop, don't dispose, per-key locks; shutdown guards)

  • MultifyTestService library names (shared CorrectLibraryInfo helper)

  • Telegram MarkdownV2 escaping scoped to known URL keys

  • DeepCopyDict nested-list gap; GetMediaType default fallback

  • Plugin test-data/docs variable parity (PluginVersion, SourceUrl)

  • Debounced Telegram store writes (version-tracked trailing save)

  • LibraryCache virtual-folder TTL cache (30s); bounded _notifiedItems eviction (48h)

  • Generic webhook destinations: Music Playback Started, Library Correction Test, Plugin Events

  • FAQ Secrets & Credentials section

  • Bump version to 0.0.10 (net10.0, Jellyfin 12.0)

v0.0.9

Choose a tag to compare

@github-actions github-actions released this 10 Sep 15:00
  • Hot-reload plugin configuration without server restart: MultifySender now reads MultifyPlugin.Instance.Configuration per call (like jellyfin-plugin-webhook WebhookSender) instead of injected stale instance; LibraryEventHostedService (Singleton) now resolves IWebhookSender/DashboardAlert via IServiceProvider.CreateScope() per ItemAdded/ItemDeleted queue item, so OnlySelected/AllExcept changes apply instantly after UI Save (validated: Thunderbolts* private movie sent to Telegram id 3696 and Ntfy without restart after 15:48 save)

  • {{LibraryName}} now correctly shows CollectionFolder (Private - Filmes 04f64be…) instead of physical Folder (movies a186…) via CorrectLibraryInfo() path-prefix against ILibraryManager.GetVirtualFolders() (validated on generic webhookd catchall for Jurassic World Rebirth and Thunderbolts*)

  • MdbList quota burn: per-key SemaphoreSlim single-flight + 1h negative cache for 404 in MdbListService prevents thundering herd on 1Hz PlaybackProgress and re-query of invalid ids

  • GetMediaType exact lower switch with Contains fallback for custom subclass names

  • DeepCopyDict deep-copies nested IDictionary/IList, downgraded DEBUG-ENRICH to LogDebug

  • TelegramMessageStore: per-key SemaphoreSlim (GetKeyLock) makes Get→Edit/Send→Store atomic, preventing duplicate messages; TelegramClient holds per-key lock for edit path

  • Bump version to 0.0.9 / 0.0.9.0 (build.yaml, Directory.Build.props)

  • REPORT.md (catalog sanitizer report, no longer needed after 4-part version fix in v0.0.8)

v0.0.8

Choose a tag to compare

@github-actions github-actions released this 09 Sep 15:03
  • MDBList now queried only when a matched destination template actually references an MDBList variable (MdblistScore/ImdbRating/etc.) or SendAllProperties is set — prevents 1Hz PlaybackProgress hot-loop burning daily quota (4012 calls, 3016× 429 in log_20260908)

  • Library Filter OnlySelected blocking: normalize GUIDs (N vs D, case-insensitive) for LibraryId/UserId and resolve CollectionFolder vs physical Folder alias via VirtualFolders path prefix (AF92 Filmes vs F7E7 movies)

  • Test notification fallback now respects LibraryFilter — sets LibraryId/LibraryName/Path to the filter's VirtualFolder instead of N/A, so "Test" with a filter is actually sent

  • ItemDeleted never sent: HandleItemRemoved now uses e.Item directly (upstream webhook ItemDeletedHandler pattern) and skips virtual items — GetItemById after removal always returned null

  • Packaging: normalize version to 4-part (0.0.8 -> 0.0.8.0) and validate version matches sourceUrl tag per catalog REPORT.md — prevents 0.0.6.0 vs v0.0.7 mismatch

  • MultifySender reuses matched destination lists for MDBList guard and send phase to avoid double LINQ enumeration

  • FilterService now optionally injects ILibraryManager for path-based library resolution

  • REPORT.md added with catalog sanitizer analysis

v0.0.7

Choose a tag to compare

@github-actions github-actions released this 25 Aug 19:16
  • Telegram edit-on-duplicate: when the same item (matched by TmdbId) is notified again, the existing Telegram message is edited instead of sending a new one.

  • Ignore Trailer items from all notification types.

  • Defer ItemAdded/ItemUpdated notifications via an internal queue until remote metadata is available, so messages are no longer sent before Jellyfin populates details.

  • Readiness check now requires a real content field (Overview, Genres, OfficialRating, or CommunityRating) in addition to a provider ID, preventing "(Unknown)"/"N/A" placeholders in sent messages.

  • Map MDBList "tomatoes" source to RottenTomatoesRating so Rotten Tomatoes ratings populate correctly.

  • Removed manifest.json from the main branch.

  • Revised README for installation and message customization.

v0.0.6

Choose a tag to compare

@github-actions github-actions released this 07 Aug 14:35
  • SubtitleDownloadFailureNotifier — new Subtitle Download Failure notification type

  • Playback data template variables (play method, position, volume, playback bitrate) via shared PlaybackBitrateService

  • Stream info and metadata variables (VideoCodec, AudioCodec, VideoResolution, VideoRange, Framerate, AudioChannels, SubtitleLanguages, Width/Height, PlayCount, IsFavorite, Played)

  • People variables (Director, Writers, CastList, CastJson)

  • Parent poster URLs: SeasonPoster, SeriesPoster, TmdbSeasonPosterUrl, TmdbSeriesPosterUrl

  • TMDB image URL enrichment via IProviderManager (replaces custom TmdbService), including test-notification flow

  • PhotoUrlTemplate options for Gotify and ntfy destinations

  • Select All / Select None buttons on Item Type checkboxes

  • Real library items used for test notifications with realistic fallback

  • UserDataService for per-user PlayCount/IsFavorite/Played/UserRating

  • Version bump to 0.0.6

  • MDBList authentication: ?apikey= query param instead of Bearer header; null score handling

  • FormatResolution bug for non-16:9 aspect ratios

  • MarkdownV2 escaping: URLs skipped from escaping, un-escaped after template substitution, escaped values preserve formatting markers

  • Telegram: return API error description instead of generic 400; message editing only for ItemAdded/ItemUpdated

  • UserFilter/LibraryFilter changed from Guid[] to string[] to fix JSON deserialization

  • Generic webhook header/field pairing and malformed Content-Type handling

  • ntfy URL join double-slash, priority clamp (1-5), header hardening (RFC 2047 encoding)

  • LibraryCache sync dispose, timer leak, culture-aware ToString for JSON (invariant)

  • Release workflow: manifest branch history preserved; changelog now extracted from the annotated tag message into both the Jellyfin manifest and GitHub release body

  • scripts/package.py: numeric semver sort, prerelease sort order, Jellyfin 12.0 default target

  • Numerous StyleCop/build errors and dead code removal across notifiers and services

  • Target framework net9.0 → net10.0 for Jellyfin 12 compatibility

  • Jellyfin NuGet packages to 12.*-* with targetAbi 12.0.0.0

  • Config UI to tabbed layout with section-based destination cards

  • Jellyfin ImageUrl template variables renamed (dropped 'Url' suffix)

  • Removed TVDB URLs, OriginalLanguage, and HomePageUrl template variables

  • Unused workflow files (build.yaml, publish.yaml, publish-unstable.yaml)