The Free Software Media System - Server Backend & API
This report summarizes scanner evidence for jellyfin/jellyfin, a C# project with 58,846 GitHub stars. SynthScan examined 417,022 lines of code across 2560 source files, recording 1485 pattern matches distributed across 8 syntactic categories. The legacy adjusted pattern signal is 3.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1477 finding(s).
Are imports declared and package/API names verified? 8 finding(s).
Are wrappers, guards, and repeated structures necessary? 2 finding(s).
Which changes need focused human review? 1485 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1485 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | MediaBrowser.Providers/MediaInfo/ProbeProvider.cs | 61 | /// <param name="blurayExaminer">Instance of the <see cref="IBlurayExaminer"/> interface.</param> | COMMENT |
| LOW | MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs | 41 | /// <summary> | COMMENT |
| LOW | MediaBrowser.Providers/MediaInfo/MediaInfoResolver.cs | 381 | } | COMMENT |
| LOW | MediaBrowser.Providers/MediaInfo/AudioFileProber.cs | 41 | private readonly IMediaStreamRepository _mediaStreamRepository; | COMMENT |
| LOW | MediaBrowser.Providers/Music/AlbumMetadataService.cs | 21 | /// <summary> | COMMENT |
| LOW | …ders/Plugins/MusicBrainz/MusicBrainzQueryExtensions.cs | 101 | COMMENT | |
| LOW | …ders/Plugins/MusicBrainz/MusicBrainzQueryExtensions.cs | 121 | /// <param name="searchQuery">The search query.</param> | COMMENT |
| LOW | MediaBrowser.Providers/Plugins/MusicBrainz/Plugin.cs | 61 | public override string Name => "MusicBrainz"; | COMMENT |
| LOW | MediaBrowser.Providers/Plugins/Tmdb/TmdbUtils.cs | 21 | { | COMMENT |
| LOW | MediaBrowser.Providers/Plugins/Tmdb/TmdbUtils.cs | 101 | return TryParseTmdbId(value, out tmdbId); | COMMENT |
| LOW | MediaBrowser.Providers/Plugins/Tmdb/TmdbUtils.cs | 461 | /// Determines the language code to report for an image. | COMMENT |
| LOW | …diaBrowser.Providers/Plugins/Tmdb/TmdbClientManager.cs | 241 | COMMENT | |
| LOW | …diaBrowser.Providers/Plugins/Tmdb/TmdbClientManager.cs | 421 | /// <summary> | COMMENT |
| LOW | …diaBrowser.Providers/Plugins/Tmdb/TmdbClientManager.cs | 581 | /// <summary> | COMMENT |
| LOW | …diaBrowser.Providers/Plugins/Tmdb/TmdbClientManager.cs | 601 | /// Converts backdrop <see cref="ImageData"/>s into <see cref="RemoteImageInfo"/>s. | COMMENT |
| LOW | …diaBrowser.Providers/Plugins/Tmdb/TmdbClientManager.cs | 621 | /// <param name="images">The input images.</param> | COMMENT |
| LOW | …ders/Plugins/Tmdb/Configuration/PluginConfiguration.cs | 1 | #pragma warning disable CA1819 // Properties should not return arrays | COMMENT |
| LOW | …ders/Plugins/Tmdb/Configuration/PluginConfiguration.cs | 21 | public bool IncludeAdult { get; set; } | COMMENT |
| LOW | …ders/Plugins/Tmdb/Configuration/PluginConfiguration.cs | 41 | /// Enabling this will increase scan times. | COMMENT |
| LOW | …ders/Plugins/Tmdb/Configuration/PluginConfiguration.cs | 61 | /// libraries for which the unaired/missing episode provider is enabled. Whether episodes are | COMMENT |
| LOW | …ders/Plugins/Tmdb/Configuration/PluginConfiguration.cs | 81 | public int UpcomingEpisodeGracePeriodDays { get; set; } = 7; | COMMENT |
| LOW | …ders/Plugins/Tmdb/Configuration/PluginConfiguration.cs | 101 | public bool HideMissingCrewMembers { get; set; } | COMMENT |
| LOW | …roviders/Plugins/Tmdb/TV/TmdbMissingEpisodeProvider.cs | 501 | false); | COMMENT |
| LOW | …gins/ListenBrainz/Configuration/SimilarityAlgorithm.cs | 1 | namespace MediaBrowser.Providers.Plugins.ListenBrainz.Configuration; | COMMENT |
| LOW | MediaBrowser.Providers/Books/IComicProvider.cs | 21 | COMMENT | |
| LOW | …rs/Books/ComicBookInfo/Models/ComicBookInfoMetadata.cs | 61 | /// Gets or sets the number of volumes. | COMMENT |
| LOW | MediaBrowser.Providers/TV/SeriesMetadataService.cs | 21 | COMMENT | |
| LOW | MediaBrowser.Providers/TV/SeriesMetadataService.cs | 341 | COMMENT | |
| LOW | MediaBrowser.Providers/Manager/ItemImageProvider.cs | 261 | } | COMMENT |
| LOW | MediaBrowser.Providers/Manager/ImageSaver.cs | 341 | if (!saveLocally || (_config.Configuration.ImageSavingConvention == ImageSavingConvention.Legacy)) | COMMENT |
| LOW | MediaBrowser.Providers/Manager/ImageSaver.cs | 361 | private ItemImageInfo GetCurrentImage(BaseItem item, ImageType type, int imageIndex) | COMMENT |
| LOW | MediaBrowser.Providers/Manager/ImageSaver.cs | 381 | COMMENT | |
| LOW | …n.Server.Implementations/Trickplay/TrickplayManager.cs | 41 | private readonly IDbContextFactory<JellyfinDbContext> _dbProvider; | COMMENT |
| LOW | …ver.Implementations/Extensions/ExpressionExtensions.cs | 41 | COMMENT | |
| LOW | …rver.Implementations/FullSystemBackup/BackupService.cs | 601 | COMMENT | |
| LOW | Jellyfin.Server.Implementations/Item/BaseItemMapper.cs | 481 | /// Checks whether a type requires JSON deserialization. | COMMENT |
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 261 | /// <remarks> | COMMENT |
| LOW | Jellyfin.Server.Implementations/Item/OrderMapper.cs | 21 | public static class OrderMapper | COMMENT |
| LOW | Emby.Naming/Video/ExtraResult.cs | 1 | using MediaBrowser.Model.Entities; | COMMENT |
| LOW | Emby.Naming/Video/CleanDateTimeResult.cs | 21 | /// <summary> | COMMENT |
| LOW | Emby.Naming/Video/ExtraRuleType.cs | 1 | namespace Emby.Naming.Video | COMMENT |
| LOW | Emby.Naming/Video/VideoFileInfo.cs | 1 | using System; | COMMENT |
| LOW | Emby.Naming/Video/VideoFileInfo.cs | 41 | /// Gets or sets the path. | COMMENT |
| LOW | Emby.Naming/Video/VideoFileInfo.cs | 61 | /// <value>The year.</value> | COMMENT |
| LOW | Emby.Naming/Video/VideoFileInfo.cs | 81 | COMMENT | |
| LOW | Emby.Naming/Video/VideoInfo.cs | 21 | AlternateVersions = []; | COMMENT |
| LOW | Emby.Naming/AudioBook/AudioBookInfo.cs | 1 | using System.Collections.Generic; | COMMENT |
| LOW | Emby.Naming/AudioBook/AudioBookInfo.cs | 41 | /// <value>The files.</value> | COMMENT |
| LOW | Emby.Naming/AudioBook/AudioBookFileInfo.cs | 21 | PartNumber = partNumber; | COMMENT |
| LOW | Emby.Naming/TV/EpisodeInfo.cs | 1 | namespace Emby.Naming.TV | COMMENT |
| LOW | Emby.Naming/TV/EpisodeInfo.cs | 21 | public string Path { get; set; } | COMMENT |
| LOW | Emby.Naming/TV/EpisodeInfo.cs | 41 | /// <summary> | COMMENT |
| LOW | Emby.Naming/TV/EpisodeInfo.cs | 61 | /// </summary> | COMMENT |
| LOW | Emby.Naming/TV/SeriesResolver.cs | 1 | using System.IO; | COMMENT |
| LOW | Emby.Naming/TV/SeriesResolver.cs | 21 | private static partial Regex SeriesNameRegex(); | COMMENT |
| LOW | Emby.Naming/TV/SeasonPathParserResult.cs | 1 | namespace Emby.Naming.TV | COMMENT |
| LOW | Emby.Naming/TV/EpisodePathParserResult.cs | 1 | namespace Emby.Naming.TV | COMMENT |
| LOW | Emby.Naming/TV/EpisodePathParserResult.cs | 21 | public int? EndingEpisodeNumber { get; set; } | COMMENT |
| LOW | Emby.Naming/TV/SeriesInfo.cs | 1 | namespace Emby.Naming.TV | COMMENT |
| LOW | Emby.Naming/ExternalFiles/ExternalPathParserResult.cs | 21 | } | COMMENT |
| 1383 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | Jellyfin.Api/Controllers/AudioController.cs | 42 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/AudioController.cs | 206 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/DynamicHlsController.cs | 114 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/DynamicHlsController.cs | 353 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/DynamicHlsController.cs | 529 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/DynamicHlsController.cs | 696 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/DynamicHlsController.cs | 867 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/DynamicHlsController.cs | 1037 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/DynamicHlsController.cs | 1221 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/VideosController.cs | 266 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| MEDIUM | Jellyfin.Api/Controllers/VideosController.cs | 504 | /// <param name="deviceProfileId">Optional. The dlna device profile id to utilize.</param> | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 287 | // Step 1: Find the top N series with recently added content, ordered by most recent addition | COMMENT |
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 339 | // Step 3: Analyze each series to identify recent additions within the time window | COMMENT |
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 380 | // Step 4: Batch fetch counts - episodes per season and seasons per series | COMMENT |
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 402 | // Step 5: Apply the container selection logic for each series. | COMMENT |
| LOW⚡ | …er.Implementations/Item/BaseItemRepository.Querying.cs | 492 | // Step 6: Fetch the Season/Series entities we decided to return | COMMENT |
| LOW⚡ | …er.Implementations/Item/BaseItemRepository.Querying.cs | 501 | // Step 7: Build final results, preferring Season > Series > Episode. | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 55 | // Step 1: Find and remove duplicate database entries (same Path, different IDs) | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 58 | // Step 2: Clear incorrect OwnerId for video/movie items that are children of other video/movie items | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 61 | // Step 3: Reassign orphaned extras to correct parents | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 64 | // Step 4: Populate PrimaryVersionId for alternate version children | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 287 | // Step 1: Find the top N series with recently added content, ordered by most recent addition | COMMENT |
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 339 | // Step 3: Analyze each series to identify recent additions within the time window | COMMENT |
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 380 | // Step 4: Batch fetch counts - episodes per season and seasons per series | COMMENT |
| LOW | …er.Implementations/Item/BaseItemRepository.Querying.cs | 402 | // Step 5: Apply the container selection logic for each series. | COMMENT |
| LOW⚡ | …er.Implementations/Item/BaseItemRepository.Querying.cs | 492 | // Step 6: Fetch the Season/Series entities we decided to return | COMMENT |
| LOW⚡ | …er.Implementations/Item/BaseItemRepository.Querying.cs | 501 | // Step 7: Build final results, preferring Season > Series > Episode. | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 55 | // Step 1: Find and remove duplicate database entries (same Path, different IDs) | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 58 | // Step 2: Clear incorrect OwnerId for video/movie items that are children of other video/movie items | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 61 | // Step 3: Reassign orphaned extras to correct parents | COMMENT |
| LOW⚡ | …nes/20260115120000_FixIncorrectOwnerIdRelationships.cs | 64 | // Step 4: Populate PrimaryVersionId for alternate version children | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …fin.Api.Tests/Auth/CustomAuthenticationHandlerTests.cs | 138 | authorizationInfo.Token = "fake-token"; | CODE |
| LOW⚡ | tests/Jellyfin.LiveTv.Tests/RecordingHelperTests.cs | 89 | "Lorem ipsum dolor sit amet: consect 2018_12_06_21_06_00", | CODE |
| LOW⚡ | tests/Jellyfin.LiveTv.Tests/RecordingHelperTests.cs | 89 | "Lorem ipsum dolor sit amet: consect 2018_12_06_21_06_00", | CODE |
| LOW⚡ | tests/Jellyfin.LiveTv.Tests/RecordingHelperTests.cs | 92 | Name = "Lorem ipsum dolor sit amet: consect", | CODE |
| LOW⚡ | tests/Jellyfin.LiveTv.Tests/RecordingHelperTests.cs | 92 | Name = "Lorem ipsum dolor sit amet: consect", | CODE |
| LOW⚡ | tests/Jellyfin.LiveTv.Tests/RecordingHelperTests.cs | 96 | EpisodeTitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidi | CODE |
| LOW⚡ | tests/Jellyfin.LiveTv.Tests/RecordingHelperTests.cs | 96 | EpisodeTitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidi | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | Jellyfin.Api/Helpers/FileStreamResponseHelpers.cs | 51 | requestMessage.Headers.Range = System.Net.Http.Headers.RangeHeaderValue.Parse(rangeString); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ….Server.Implementations/Library/ExternalDataManager.cs | 17 | public class ExternalDataManager : IExternalDataManager | CODE |
| LOW | Emby.Server.Implementations/Library/UserDataManager.cs | 26 | public class UserDataManager : IUserDataManager | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …Server.Implementations/AppBase/BaseApplicationPaths.cs | 118 | + "# This file is a cache directory tag created by Jellyfin.\n" | CODE |