Copy disabled (too large)
Download .txt
Showing preview only (12,544K chars total). Download the full file to get everything.
Repository: jellyfin/jellyfin
Branch: master
Commit: 995d56d5ff37
Files: 2329
Total size: 11.5 MB
Directory structure:
gitextract_vipu_rbm/
├── .config/
│ └── dotnet-tools.json
├── .devcontainer/
│ ├── devcontainer.json
│ └── install-ffmpeg.sh
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── feature_request.md
│ │ └── issue report.yml
│ ├── pull_request_template.md
│ ├── renovate.json
│ └── workflows/
│ ├── ci-codeql-analysis.yml
│ ├── ci-compat.yml
│ ├── ci-openapi.yml
│ ├── ci-tests.yml
│ ├── commands.yml
│ ├── issue-stale.yml
│ ├── issue-template-check.yml
│ ├── project-automation.yml
│ ├── pull-request-conflict.yml
│ ├── pull-request-stale.yaml
│ └── release-bump-version.yaml
├── .gitignore
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ ├── settings.json
│ └── tasks.json
├── BannedSymbols.txt
├── CONTRIBUTORS.md
├── Directory.Build.props
├── Directory.Packages.props
├── Emby.Naming/
│ ├── Audio/
│ │ ├── AlbumParser.cs
│ │ └── AudioFileParser.cs
│ ├── AudioBook/
│ │ ├── AudioBookFileInfo.cs
│ │ ├── AudioBookFilePathParser.cs
│ │ ├── AudioBookFilePathParserResult.cs
│ │ ├── AudioBookInfo.cs
│ │ ├── AudioBookListResolver.cs
│ │ ├── AudioBookNameParser.cs
│ │ ├── AudioBookNameParserResult.cs
│ │ └── AudioBookResolver.cs
│ ├── Book/
│ │ ├── BookFileNameParser.cs
│ │ └── BookFileNameParserResult.cs
│ ├── Common/
│ │ ├── EpisodeExpression.cs
│ │ ├── MediaType.cs
│ │ └── NamingOptions.cs
│ ├── Emby.Naming.csproj
│ ├── ExternalFiles/
│ │ ├── ExternalPathParser.cs
│ │ └── ExternalPathParserResult.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── TV/
│ │ ├── EpisodeInfo.cs
│ │ ├── EpisodePathParser.cs
│ │ ├── EpisodePathParserResult.cs
│ │ ├── EpisodeResolver.cs
│ │ ├── SeasonPathParser.cs
│ │ ├── SeasonPathParserResult.cs
│ │ ├── SeriesInfo.cs
│ │ ├── SeriesPathParser.cs
│ │ ├── SeriesPathParserResult.cs
│ │ ├── SeriesResolver.cs
│ │ └── TvParserHelpers.cs
│ └── Video/
│ ├── CleanDateTimeParser.cs
│ ├── CleanDateTimeResult.cs
│ ├── CleanStringParser.cs
│ ├── ExtraResult.cs
│ ├── ExtraRule.cs
│ ├── ExtraRuleResolver.cs
│ ├── ExtraRuleType.cs
│ ├── FileStack.cs
│ ├── FileStackRule.cs
│ ├── Format3DParser.cs
│ ├── Format3DResult.cs
│ ├── Format3DRule.cs
│ ├── StackResolver.cs
│ ├── StubResolver.cs
│ ├── StubTypeRule.cs
│ ├── VideoFileInfo.cs
│ ├── VideoInfo.cs
│ ├── VideoListResolver.cs
│ └── VideoResolver.cs
├── Emby.Photos/
│ ├── Emby.Photos.csproj
│ ├── PhotoProvider.cs
│ └── Properties/
│ └── AssemblyInfo.cs
├── Emby.Server.Implementations/
│ ├── AppBase/
│ │ ├── BaseApplicationPaths.cs
│ │ ├── BaseConfigurationManager.cs
│ │ └── ConfigurationHelper.cs
│ ├── ApplicationHost.cs
│ ├── Branding/
│ │ └── BrandingConfigurationFactory.cs
│ ├── Chapters/
│ │ └── ChapterManager.cs
│ ├── Collections/
│ │ ├── CollectionImageProvider.cs
│ │ └── CollectionManager.cs
│ ├── Configuration/
│ │ └── ServerConfigurationManager.cs
│ ├── ConfigurationOptions.cs
│ ├── Cryptography/
│ │ └── CryptographyProvider.cs
│ ├── Data/
│ │ ├── CleanDatabaseScheduledTask.cs
│ │ ├── ItemTypeLookup.cs
│ │ ├── SqliteExtensions.cs
│ │ └── TypeMapper.cs
│ ├── Devices/
│ │ └── DeviceId.cs
│ ├── Dto/
│ │ └── DtoService.cs
│ ├── Emby.Server.Implementations.csproj
│ ├── EntryPoints/
│ │ ├── LibraryChangedNotifier.cs
│ │ └── UserDataChangeNotifier.cs
│ ├── HttpServer/
│ │ ├── Security/
│ │ │ └── AuthService.cs
│ │ ├── WebSocketConnection.cs
│ │ └── WebSocketManager.cs
│ ├── IO/
│ │ ├── FileRefresher.cs
│ │ ├── LibraryMonitor.cs
│ │ ├── ManagedFileSystem.cs
│ │ └── MbLinkShortcutHandler.cs
│ ├── IStartupOptions.cs
│ ├── Images/
│ │ ├── ArtistImageProvider.cs
│ │ ├── BaseDynamicImageProvider.cs
│ │ ├── BaseFolderImageProvider.cs
│ │ ├── CollectionFolderImageProvider.cs
│ │ ├── DynamicImageProvider.cs
│ │ ├── FolderImageProvider.cs
│ │ ├── GenreImageProvider.cs
│ │ ├── MusicAlbumImageProvider.cs
│ │ ├── MusicGenreImageProvider.cs
│ │ ├── PhotoAlbumImageProvider.cs
│ │ └── PlaylistImageProvider.cs
│ ├── Library/
│ │ ├── CoreResolutionIgnoreRule.cs
│ │ ├── DotIgnoreIgnoreRule.cs
│ │ ├── ExternalDataManager.cs
│ │ ├── IgnorePatterns.cs
│ │ ├── KeyframeManager.cs
│ │ ├── LibraryManager.cs
│ │ ├── LiveStreamHelper.cs
│ │ ├── MediaSourceManager.cs
│ │ ├── MediaStreamSelector.cs
│ │ ├── MusicManager.cs
│ │ ├── PathExtensions.cs
│ │ ├── PathManager.cs
│ │ ├── ResolverHelper.cs
│ │ ├── Resolvers/
│ │ │ ├── Audio/
│ │ │ │ ├── AudioResolver.cs
│ │ │ │ ├── MusicAlbumResolver.cs
│ │ │ │ └── MusicArtistResolver.cs
│ │ │ ├── BaseVideoResolver.cs
│ │ │ ├── Books/
│ │ │ │ └── BookResolver.cs
│ │ │ ├── ExtraResolver.cs
│ │ │ ├── FolderResolver.cs
│ │ │ ├── GenericFolderResolver.cs
│ │ │ ├── GenericVideoResolver.cs
│ │ │ ├── Movies/
│ │ │ │ ├── BoxSetResolver.cs
│ │ │ │ └── MovieResolver.cs
│ │ │ ├── PhotoAlbumResolver.cs
│ │ │ ├── PhotoResolver.cs
│ │ │ ├── PlaylistResolver.cs
│ │ │ ├── SpecialFolderResolver.cs
│ │ │ └── TV/
│ │ │ ├── EpisodeResolver.cs
│ │ │ ├── SeasonResolver.cs
│ │ │ └── SeriesResolver.cs
│ │ ├── SearchEngine.cs
│ │ ├── SplashscreenPostScanTask.cs
│ │ ├── UserDataManager.cs
│ │ ├── UserViewManager.cs
│ │ └── Validators/
│ │ ├── ArtistsPostScanTask.cs
│ │ ├── ArtistsValidator.cs
│ │ ├── CollectionPostScanTask.cs
│ │ ├── GenresPostScanTask.cs
│ │ ├── GenresValidator.cs
│ │ ├── MusicGenresPostScanTask.cs
│ │ ├── MusicGenresValidator.cs
│ │ ├── PeopleValidator.cs
│ │ ├── StudiosPostScanTask.cs
│ │ └── StudiosValidator.cs
│ ├── Localization/
│ │ ├── Core/
│ │ │ ├── ab.json
│ │ │ ├── af.json
│ │ │ ├── ar.json
│ │ │ ├── as.json
│ │ │ ├── be.json
│ │ │ ├── bg-BG.json
│ │ │ ├── bn.json
│ │ │ ├── ca.json
│ │ │ ├── chr.json
│ │ │ ├── cs.json
│ │ │ ├── cy.json
│ │ │ ├── da.json
│ │ │ ├── de.json
│ │ │ ├── el.json
│ │ │ ├── en-GB.json
│ │ │ ├── en-US.json
│ │ │ ├── enm.json
│ │ │ ├── eo.json
│ │ │ ├── es-AR.json
│ │ │ ├── es-MX.json
│ │ │ ├── es.json
│ │ │ ├── es_419.json
│ │ │ ├── es_DO.json
│ │ │ ├── et.json
│ │ │ ├── eu.json
│ │ │ ├── fa.json
│ │ │ ├── fi.json
│ │ │ ├── fil.json
│ │ │ ├── fo.json
│ │ │ ├── fr-CA.json
│ │ │ ├── fr.json
│ │ │ ├── ga.json
│ │ │ ├── gl.json
│ │ │ ├── gsw.json
│ │ │ ├── he.json
│ │ │ ├── he_IL.json
│ │ │ ├── hi.json
│ │ │ ├── hr.json
│ │ │ ├── ht.json
│ │ │ ├── hu.json
│ │ │ ├── hy.json
│ │ │ ├── id.json
│ │ │ ├── is.json
│ │ │ ├── it.json
│ │ │ ├── ja.json
│ │ │ ├── jbo.json
│ │ │ ├── ka.json
│ │ │ ├── kab.json
│ │ │ ├── kk.json
│ │ │ ├── km.json
│ │ │ ├── kn.json
│ │ │ ├── ko.json
│ │ │ ├── kw.json
│ │ │ ├── ky.json
│ │ │ ├── lb.json
│ │ │ ├── lt-LT.json
│ │ │ ├── lv.json
│ │ │ ├── lzh.json
│ │ │ ├── mi.json
│ │ │ ├── mk.json
│ │ │ ├── ml.json
│ │ │ ├── mn.json
│ │ │ ├── mr.json
│ │ │ ├── ms.json
│ │ │ ├── mt.json
│ │ │ ├── my.json
│ │ │ ├── nb.json
│ │ │ ├── ne.json
│ │ │ ├── nl.json
│ │ │ ├── nn.json
│ │ │ ├── oc.json
│ │ │ ├── or.json
│ │ │ ├── pa.json
│ │ │ ├── pl.json
│ │ │ ├── pr.json
│ │ │ ├── pt-BR.json
│ │ │ ├── pt-PT.json
│ │ │ ├── pt.json
│ │ │ ├── ro.json
│ │ │ ├── ru.json
│ │ │ ├── si.json
│ │ │ ├── sk.json
│ │ │ ├── sl-SI.json
│ │ │ ├── sn.json
│ │ │ ├── sq.json
│ │ │ ├── sr.json
│ │ │ ├── sv.json
│ │ │ ├── sw.json
│ │ │ ├── ta.json
│ │ │ ├── te.json
│ │ │ ├── th.json
│ │ │ ├── tr.json
│ │ │ ├── ug.json
│ │ │ ├── uk.json
│ │ │ ├── ur.json
│ │ │ ├── ur_PK.json
│ │ │ ├── uz.json
│ │ │ ├── vi.json
│ │ │ ├── zh-CN.json
│ │ │ ├── zh-HK.json
│ │ │ ├── zh-TW.json
│ │ │ └── zu.json
│ │ ├── LocalizationManager.cs
│ │ ├── Ratings/
│ │ │ ├── 0-prefer.json
│ │ │ ├── ar.json
│ │ │ ├── au.json
│ │ │ ├── be.json
│ │ │ ├── bg.json
│ │ │ ├── br.json
│ │ │ ├── ca.json
│ │ │ ├── cl.json
│ │ │ ├── co.json
│ │ │ ├── cz.json
│ │ │ ├── de.json
│ │ │ ├── dk.json
│ │ │ ├── es.json
│ │ │ ├── fi.json
│ │ │ ├── fr.json
│ │ │ ├── gb.json
│ │ │ ├── gr.json
│ │ │ ├── hu.json
│ │ │ ├── id.json
│ │ │ ├── ie.json
│ │ │ ├── in.json
│ │ │ ├── it.json
│ │ │ ├── jp.json
│ │ │ ├── kr.json
│ │ │ ├── kz.json
│ │ │ ├── lt.json
│ │ │ ├── mx.json
│ │ │ ├── nl.json
│ │ │ ├── no.json
│ │ │ ├── nz.json
│ │ │ ├── ph.json
│ │ │ ├── pl.json
│ │ │ ├── pt.json
│ │ │ ├── ro.json
│ │ │ ├── ru.json
│ │ │ ├── se.json
│ │ │ ├── sg.json
│ │ │ ├── sk.json
│ │ │ ├── th.json
│ │ │ ├── tr.json
│ │ │ ├── tw.json
│ │ │ ├── ua.json
│ │ │ ├── uk.json
│ │ │ ├── us.json
│ │ │ └── za.json
│ │ ├── countries.json
│ │ └── iso6392.txt
│ ├── Playlists/
│ │ ├── PlaylistManager.cs
│ │ └── PlaylistsFolder.cs
│ ├── Plugins/
│ │ ├── PluginLoadContext.cs
│ │ └── PluginManager.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── QuickConnect/
│ │ └── QuickConnectManager.cs
│ ├── ScheduledTasks/
│ │ ├── ScheduledTaskWorker.cs
│ │ ├── TaskManager.cs
│ │ ├── Tasks/
│ │ │ ├── AudioNormalizationTask.cs
│ │ │ ├── ChapterImagesTask.cs
│ │ │ ├── CleanActivityLogTask.cs
│ │ │ ├── CleanupCollectionAndPlaylistPathsTask.cs
│ │ │ ├── CleanupUserDataTask.cs
│ │ │ ├── DeleteCacheFileTask.cs
│ │ │ ├── DeleteLogFileTask.cs
│ │ │ ├── DeleteTranscodeFileTask.cs
│ │ │ ├── MediaSegmentExtractionTask.cs
│ │ │ ├── OptimizeDatabaseTask.cs
│ │ │ ├── PeopleValidationTask.cs
│ │ │ ├── PluginUpdateTask.cs
│ │ │ └── RefreshMediaLibraryTask.cs
│ │ └── Triggers/
│ │ ├── DailyTrigger.cs
│ │ ├── IntervalTrigger.cs
│ │ ├── StartupTrigger.cs
│ │ └── WeeklyTrigger.cs
│ ├── Serialization/
│ │ └── MyXmlSerializer.cs
│ ├── ServerApplicationPaths.cs
│ ├── Session/
│ │ ├── SessionManager.cs
│ │ ├── SessionWebSocketListener.cs
│ │ └── WebSocketController.cs
│ ├── Sorting/
│ │ ├── AiredEpisodeOrderComparer.cs
│ │ ├── AlbumArtistComparer.cs
│ │ ├── AlbumComparer.cs
│ │ ├── ArtistComparer.cs
│ │ ├── CommunityRatingComparer.cs
│ │ ├── CriticRatingComparer.cs
│ │ ├── DateCreatedComparer.cs
│ │ ├── DateLastMediaAddedComparer.cs
│ │ ├── DatePlayedComparer.cs
│ │ ├── IndexNumberComparer.cs
│ │ ├── IsFavoriteOrLikeComparer.cs
│ │ ├── IsFolderComparer.cs
│ │ ├── IsPlayedComparer.cs
│ │ ├── IsUnplayedComparer.cs
│ │ ├── NameComparer.cs
│ │ ├── OfficialRatingComparer.cs
│ │ ├── ParentIndexNumberComparer.cs
│ │ ├── PlayCountComparer.cs
│ │ ├── PremiereDateComparer.cs
│ │ ├── ProductionYearComparer.cs
│ │ ├── RandomComparer.cs
│ │ ├── RuntimeComparer.cs
│ │ ├── SeriesSortNameComparer.cs
│ │ ├── SortNameComparer.cs
│ │ ├── StartDateComparer.cs
│ │ └── StudioComparer.cs
│ ├── SyncPlay/
│ │ ├── Group.cs
│ │ └── SyncPlayManager.cs
│ ├── SystemManager.cs
│ ├── TV/
│ │ └── TVSeriesManager.cs
│ └── Updates/
│ └── InstallationManager.cs
├── Jellyfin.Api/
│ ├── Attributes/
│ │ ├── AcceptsFileAttribute.cs
│ │ ├── AcceptsImageFileAttribute.cs
│ │ ├── ParameterObsoleteAttribute.cs
│ │ ├── ProducesAudioFileAttribute.cs
│ │ ├── ProducesFileAttribute.cs
│ │ ├── ProducesImageFileAttribute.cs
│ │ ├── ProducesPlaylistFileAttribute.cs
│ │ └── ProducesVideoFileAttribute.cs
│ ├── Auth/
│ │ ├── AnonymousLanAccessPolicy/
│ │ │ ├── AnonymousLanAccessHandler.cs
│ │ │ └── AnonymousLanAccessRequirement.cs
│ │ ├── CustomAuthenticationHandler.cs
│ │ ├── DefaultAuthorizationPolicy/
│ │ │ ├── DefaultAuthorizationHandler.cs
│ │ │ └── DefaultAuthorizationRequirement.cs
│ │ ├── FirstTimeSetupPolicy/
│ │ │ ├── FirstTimeSetupHandler.cs
│ │ │ └── FirstTimeSetupRequirement.cs
│ │ ├── LocalAccessOrRequiresElevationPolicy/
│ │ │ ├── LocalAccessOrRequiresElevationHandler.cs
│ │ │ └── LocalAccessOrRequiresElevationRequirement.cs
│ │ ├── SyncPlayAccessPolicy/
│ │ │ ├── SyncPlayAccessHandler.cs
│ │ │ └── SyncPlayAccessRequirement.cs
│ │ └── UserPermissionPolicy/
│ │ ├── UserPermissionHandler.cs
│ │ └── UserPermissionRequirement.cs
│ ├── BaseJellyfinApiController.cs
│ ├── Constants/
│ │ ├── AuthenticationSchemes.cs
│ │ ├── InternalClaimTypes.cs
│ │ └── UserRoles.cs
│ ├── Controllers/
│ │ ├── ActivityLogController.cs
│ │ ├── ApiKeyController.cs
│ │ ├── ArtistsController.cs
│ │ ├── AudioController.cs
│ │ ├── BackupController.cs
│ │ ├── BrandingController.cs
│ │ ├── ChannelsController.cs
│ │ ├── ClientLogController.cs
│ │ ├── CollectionController.cs
│ │ ├── ConfigurationController.cs
│ │ ├── DashboardController.cs
│ │ ├── DevicesController.cs
│ │ ├── DisplayPreferencesController.cs
│ │ ├── DynamicHlsController.cs
│ │ ├── EnvironmentController.cs
│ │ ├── FilterController.cs
│ │ ├── GenresController.cs
│ │ ├── HlsSegmentController.cs
│ │ ├── ImageController.cs
│ │ ├── InstantMixController.cs
│ │ ├── ItemLookupController.cs
│ │ ├── ItemRefreshController.cs
│ │ ├── ItemUpdateController.cs
│ │ ├── ItemsController.cs
│ │ ├── LibraryController.cs
│ │ ├── LibraryStructureController.cs
│ │ ├── LiveTvController.cs
│ │ ├── LocalizationController.cs
│ │ ├── LyricsController.cs
│ │ ├── MediaInfoController.cs
│ │ ├── MediaSegmentsController.cs
│ │ ├── MoviesController.cs
│ │ ├── MusicGenresController.cs
│ │ ├── PackageController.cs
│ │ ├── PersonsController.cs
│ │ ├── PlaylistsController.cs
│ │ ├── PlaystateController.cs
│ │ ├── PluginsController.cs
│ │ ├── QuickConnectController.cs
│ │ ├── RemoteImageController.cs
│ │ ├── ScheduledTasksController.cs
│ │ ├── SearchController.cs
│ │ ├── SessionController.cs
│ │ ├── StartupController.cs
│ │ ├── StudiosController.cs
│ │ ├── SubtitleController.cs
│ │ ├── SuggestionsController.cs
│ │ ├── SyncPlayController.cs
│ │ ├── SystemController.cs
│ │ ├── TimeSyncController.cs
│ │ ├── TrailersController.cs
│ │ ├── TrickplayController.cs
│ │ ├── TvShowsController.cs
│ │ ├── UniversalAudioController.cs
│ │ ├── UserController.cs
│ │ ├── UserLibraryController.cs
│ │ ├── UserViewsController.cs
│ │ ├── VideoAttachmentsController.cs
│ │ ├── VideosController.cs
│ │ └── YearsController.cs
│ ├── Extensions/
│ │ ├── ClaimsPrincipalExtensions.cs
│ │ └── DtoExtensions.cs
│ ├── Formatters/
│ │ ├── CamelCaseJsonProfileFormatter.cs
│ │ ├── CssOutputFormatter.cs
│ │ ├── PascalCaseJsonProfileFormatter.cs
│ │ └── XmlOutputFormatter.cs
│ ├── Helpers/
│ │ ├── AudioHelper.cs
│ │ ├── DynamicHlsHelper.cs
│ │ ├── FileStreamResponseHelpers.cs
│ │ ├── HlsCodecStringHelpers.cs
│ │ ├── HlsHelpers.cs
│ │ ├── MediaInfoHelper.cs
│ │ ├── RequestHelpers.cs
│ │ └── StreamingHelpers.cs
│ ├── Jellyfin.Api.csproj
│ ├── Middleware/
│ │ ├── BaseUrlRedirectionMiddleware.cs
│ │ ├── ExceptionMiddleware.cs
│ │ ├── IpBasedAccessValidationMiddleware.cs
│ │ ├── QueryStringDecodingMiddleware.cs
│ │ ├── ResponseTimeMiddleware.cs
│ │ ├── RobotsRedirectionMiddleware.cs
│ │ ├── ServerStartupMessageMiddleware.cs
│ │ ├── UrlDecodeQueryFeature.cs
│ │ └── WebSocketHandlerMiddleware.cs
│ ├── ModelBinders/
│ │ ├── CommaDelimitedCollectionModelBinder.cs
│ │ ├── LegacyDateTimeModelBinder.cs
│ │ ├── NullableEnumModelBinder.cs
│ │ ├── NullableEnumModelBinderProvider.cs
│ │ └── PipeDelimitedCollectionModelBinder.cs
│ ├── Models/
│ │ ├── ClientLogDtos/
│ │ │ └── ClientLogDocumentResponseDto.cs
│ │ ├── ConfigurationPageInfo.cs
│ │ ├── EnvironmentDtos/
│ │ │ ├── DefaultDirectoryBrowserInfoDto.cs
│ │ │ └── ValidatePathDto.cs
│ │ ├── LibraryDtos/
│ │ │ ├── LibraryOptionInfoDto.cs
│ │ │ ├── LibraryOptionsResultDto.cs
│ │ │ ├── LibraryTypeOptionsDto.cs
│ │ │ ├── MediaUpdateInfoDto.cs
│ │ │ └── MediaUpdateInfoPathDto.cs
│ │ ├── LibraryStructureDto/
│ │ │ ├── AddVirtualFolderDto.cs
│ │ │ ├── MediaPathDto.cs
│ │ │ ├── UpdateLibraryOptionsDto.cs
│ │ │ └── UpdateMediaPathRequestDto.cs
│ │ ├── LiveTvDtos/
│ │ │ ├── GetProgramsDto.cs
│ │ │ └── SetChannelMappingDto.cs
│ │ ├── MediaInfoDtos/
│ │ │ ├── OpenLiveStreamDto.cs
│ │ │ └── PlaybackInfoDto.cs
│ │ ├── PlaylistDtos/
│ │ │ ├── CreatePlaylistDto.cs
│ │ │ ├── UpdatePlaylistDto.cs
│ │ │ └── UpdatePlaylistUserDto.cs
│ │ ├── StartupDtos/
│ │ │ ├── StartupConfigurationDto.cs
│ │ │ ├── StartupRemoteAccessDto.cs
│ │ │ └── StartupUserDto.cs
│ │ ├── StreamingDtos/
│ │ │ ├── HlsAudioRequestDto.cs
│ │ │ └── HlsVideoRequestDto.cs
│ │ ├── SubtitleDtos/
│ │ │ └── UploadSubtitleDto.cs
│ │ ├── SyncPlayDtos/
│ │ │ ├── BufferRequestDto.cs
│ │ │ ├── IgnoreWaitRequestDto.cs
│ │ │ ├── JoinGroupRequestDto.cs
│ │ │ ├── MovePlaylistItemRequestDto.cs
│ │ │ ├── NewGroupRequestDto.cs
│ │ │ ├── NextItemRequestDto.cs
│ │ │ ├── PingRequestDto.cs
│ │ │ ├── PlayRequestDto.cs
│ │ │ ├── PreviousItemRequestDto.cs
│ │ │ ├── QueueRequestDto.cs
│ │ │ ├── ReadyRequestDto.cs
│ │ │ ├── RemoveFromPlaylistRequestDto.cs
│ │ │ ├── SeekRequestDto.cs
│ │ │ ├── SetPlaylistItemRequestDto.cs
│ │ │ ├── SetRepeatModeRequestDto.cs
│ │ │ └── SetShuffleModeRequestDto.cs
│ │ ├── SystemInfoDtos/
│ │ │ ├── FolderStorageDto.cs
│ │ │ ├── LibraryStorageDto.cs
│ │ │ └── SystemStorageDto.cs
│ │ ├── UserDtos/
│ │ │ ├── AuthenticateUserByName.cs
│ │ │ ├── CreateUserByName.cs
│ │ │ ├── ForgotPasswordDto.cs
│ │ │ ├── ForgotPasswordPinDto.cs
│ │ │ ├── QuickConnectDto.cs
│ │ │ └── UpdateUserPassword.cs
│ │ └── UserViewDtos/
│ │ └── SpecialViewOptionDto.cs
│ ├── Results/
│ │ └── OkResultOfT.cs
│ └── WebSocketListeners/
│ ├── ActivityLogWebSocketListener.cs
│ ├── ScheduledTasksWebSocketListener.cs
│ └── SessionInfoWebSocketListener.cs
├── Jellyfin.Data/
│ ├── Attributes/
│ │ └── OpenApiIgnoreEnumAttribute.cs
│ ├── DayOfWeekHelper.cs
│ ├── Dtos/
│ │ └── DeviceOptionsDto.cs
│ ├── Enums/
│ │ ├── ActivityLogSortBy.cs
│ │ ├── AudioSpatialFormat.cs
│ │ ├── BaseItemKind.cs
│ │ ├── CollectionType.cs
│ │ ├── ItemSortBy.cs
│ │ ├── MediaStreamProtocol.cs
│ │ ├── MediaType.cs
│ │ ├── PersonKind.cs
│ │ ├── SyncPlayAccessRequirementType.cs
│ │ ├── UnratedItem.cs
│ │ ├── VideoRange.cs
│ │ └── VideoRangeType.cs
│ ├── Events/
│ │ ├── GenericEventArgs.cs
│ │ ├── System/
│ │ │ └── PendingRestartEventArgs.cs
│ │ └── Users/
│ │ ├── UserCreatedEventArgs.cs
│ │ ├── UserDeletedEventArgs.cs
│ │ ├── UserLockedOutEventArgs.cs
│ │ ├── UserPasswordChangedEventArgs.cs
│ │ └── UserUpdatedEventArgs.cs
│ ├── Jellyfin.Data.csproj
│ ├── Queries/
│ │ ├── ActivityLogQuery.cs
│ │ ├── DeviceQuery.cs
│ │ └── PaginatedQuery.cs
│ └── UserEntityExtensions.cs
├── Jellyfin.Server/
│ ├── Configuration/
│ │ └── CorsPolicyProvider.cs
│ ├── CoreAppHost.cs
│ ├── Extensions/
│ │ ├── ApiApplicationBuilderExtensions.cs
│ │ ├── ApiServiceCollectionExtensions.cs
│ │ └── WebHostBuilderExtensions.cs
│ ├── Filters/
│ │ ├── AdditionalModelFilter.cs
│ │ ├── CachingOpenApiProvider.cs
│ │ ├── FileRequestFilter.cs
│ │ ├── FileResponseFilter.cs
│ │ ├── FlagsEnumSchemaFilter.cs
│ │ ├── IgnoreEnumSchemaFilter.cs
│ │ ├── ParameterObsoleteFilter.cs
│ │ ├── RetryOnTemporarilyUnavailableFilter.cs
│ │ ├── SecurityRequirementsOperationFilter.cs
│ │ └── SecuritySchemeReferenceFixupFilter.cs
│ ├── HealthChecks/
│ │ └── DbContextFactoryHealthCheck.cs
│ ├── Helpers/
│ │ └── StartupHelpers.cs
│ ├── Jellyfin.Server.csproj
│ ├── Migrations/
│ │ ├── IAsyncMigrationRoutine.cs
│ │ ├── IDatabaseMigrationRoutine.cs
│ │ ├── JellyfinMigrationAttribute.cs
│ │ ├── JellyfinMigrationBackupAttribute.cs
│ │ ├── JellyfinMigrationService.cs
│ │ ├── MigrationOptions.cs
│ │ ├── PreStartupRoutines/
│ │ │ ├── CreateNetworkConfiguration.cs
│ │ │ ├── MigrateEncodingOptions.cs
│ │ │ ├── MigrateMusicBrainzTimeout.cs
│ │ │ ├── MigrateNetworkConfiguration.cs
│ │ │ └── RenameEnableGroupingIntoCollections.cs
│ │ ├── Routines/
│ │ │ ├── AddDefaultCastReceivers.cs
│ │ │ ├── AddDefaultPluginRepository.cs
│ │ │ ├── CleanMusicArtist.cs
│ │ │ ├── CreateUserLoggingConfigFile.cs
│ │ │ ├── DisableLegacyAuthorization.cs
│ │ │ ├── DisableTranscodingThrottling.cs
│ │ │ ├── FixAudioData.cs
│ │ │ ├── FixDates.cs
│ │ │ ├── FixLibrarySubtitleDownloadLanguages.cs
│ │ │ ├── FixPlaylistOwner.cs
│ │ │ ├── MigrateActivityLogDb.cs
│ │ │ ├── MigrateAuthenticationDb.cs
│ │ │ ├── MigrateDisplayPreferencesDb.cs
│ │ │ ├── MigrateKeyframeData.cs
│ │ │ ├── MigrateLibraryDb.cs
│ │ │ ├── MigrateLibraryDbCompatibilityCheck.cs
│ │ │ ├── MigrateLibraryUserData.cs
│ │ │ ├── MigrateRatingLevels.cs
│ │ │ ├── MigrateUserDb.cs
│ │ │ ├── MoveExtractedFiles.cs
│ │ │ ├── MoveTrickplayFiles.cs
│ │ │ ├── ReaddDefaultPluginRepository.cs
│ │ │ ├── RefreshCleanNames.cs
│ │ │ ├── RefreshInternalDateModified.cs
│ │ │ ├── RemoveDownloadImagesInAdvance.cs
│ │ │ ├── RemoveDuplicateExtras.cs
│ │ │ ├── RemoveDuplicatePlaylistChildren.cs
│ │ │ ├── ReseedFolderFlag.cs
│ │ │ └── UpdateDefaultPluginRepository.cs
│ │ └── Stages/
│ │ ├── CodeMigration.cs
│ │ ├── JellyfinMigrationStageTypes.cs
│ │ └── MigrationStage.cs
│ ├── Program.cs
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ └── launchSettings.json
│ ├── Resources/
│ │ └── Configuration/
│ │ └── logging.json
│ ├── ServerSetupApp/
│ │ ├── IStartupLogger.cs
│ │ ├── SetupServer.cs
│ │ ├── StartupLogTopic.cs
│ │ ├── StartupLogger.cs
│ │ ├── StartupLoggerExtensions.cs
│ │ ├── StartupLoggerOfCategory.cs
│ │ └── index.mstemplate.html
│ ├── Startup.cs
│ ├── StartupOptions.cs
│ └── wwwroot/
│ └── api-docs/
│ ├── redoc/
│ │ └── custom.css
│ └── swagger/
│ └── custom.css
├── Jellyfin.Server.Implementations/
│ ├── Activity/
│ │ └── ActivityManager.cs
│ ├── DbConfiguration/
│ │ ├── DatabaseConfigurationFactory.cs
│ │ └── DatabaseConfigurationStore.cs
│ ├── Devices/
│ │ └── DeviceManager.cs
│ ├── Events/
│ │ ├── Consumers/
│ │ │ ├── Library/
│ │ │ │ ├── LyricDownloadFailureLogger.cs
│ │ │ │ └── SubtitleDownloadFailureLogger.cs
│ │ │ ├── Security/
│ │ │ │ ├── AuthenticationFailedLogger.cs
│ │ │ │ └── AuthenticationSucceededLogger.cs
│ │ │ ├── Session/
│ │ │ │ ├── PlaybackStartLogger.cs
│ │ │ │ ├── PlaybackStopLogger.cs
│ │ │ │ ├── SessionEndedLogger.cs
│ │ │ │ └── SessionStartedLogger.cs
│ │ │ ├── System/
│ │ │ │ ├── PendingRestartNotifier.cs
│ │ │ │ ├── TaskCompletedLogger.cs
│ │ │ │ └── TaskCompletedNotifier.cs
│ │ │ ├── Updates/
│ │ │ │ ├── PluginInstallationCancelledNotifier.cs
│ │ │ │ ├── PluginInstallationFailedLogger.cs
│ │ │ │ ├── PluginInstallationFailedNotifier.cs
│ │ │ │ ├── PluginInstalledLogger.cs
│ │ │ │ ├── PluginInstalledNotifier.cs
│ │ │ │ ├── PluginInstallingNotifier.cs
│ │ │ │ ├── PluginUninstalledLogger.cs
│ │ │ │ ├── PluginUninstalledNotifier.cs
│ │ │ │ └── PluginUpdatedLogger.cs
│ │ │ └── Users/
│ │ │ ├── UserCreatedLogger.cs
│ │ │ ├── UserDeletedLogger.cs
│ │ │ ├── UserDeletedNotifier.cs
│ │ │ ├── UserLockedOutLogger.cs
│ │ │ ├── UserPasswordChangedLogger.cs
│ │ │ └── UserUpdatedNotifier.cs
│ │ ├── EventManager.cs
│ │ └── EventingServiceCollectionExtensions.cs
│ ├── Extensions/
│ │ ├── ExpressionExtensions.cs
│ │ └── ServiceCollectionExtensions.cs
│ ├── FullSystemBackup/
│ │ ├── BackupManifest.cs
│ │ ├── BackupOptions.cs
│ │ └── BackupService.cs
│ ├── Item/
│ │ ├── BaseItemRepository.cs
│ │ ├── ChapterRepository.cs
│ │ ├── KeyframeRepository.cs
│ │ ├── MediaAttachmentRepository.cs
│ │ ├── MediaStreamRepository.cs
│ │ ├── OrderMapper.cs
│ │ └── PeopleRepository.cs
│ ├── Jellyfin.Server.Implementations.csproj
│ ├── MediaSegments/
│ │ └── MediaSegmentManager.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Security/
│ │ ├── AuthenticationManager.cs
│ │ └── AuthorizationContext.cs
│ ├── StorageHelpers/
│ │ └── StorageHelper.cs
│ ├── Trickplay/
│ │ └── TrickplayManager.cs
│ └── Users/
│ ├── DefaultAuthenticationProvider.cs
│ ├── DefaultPasswordResetProvider.cs
│ ├── DeviceAccessHost.cs
│ ├── DisplayPreferencesManager.cs
│ ├── InvalidAuthProvider.cs
│ └── UserManager.cs
├── Jellyfin.sln
├── Jellyfin.sln.DotSettings
├── LICENSE
├── MediaBrowser.Common/
│ ├── Api/
│ │ └── Policies.cs
│ ├── Configuration/
│ │ ├── ConfigurationStore.cs
│ │ ├── ConfigurationUpdateEventArgs.cs
│ │ ├── EncodingConfigurationExtensions.cs
│ │ ├── IApplicationPaths.cs
│ │ ├── IConfigurationFactory.cs
│ │ ├── IConfigurationManager.cs
│ │ └── IValidatingConfiguration.cs
│ ├── Crc32.cs
│ ├── Events/
│ │ └── EventHelper.cs
│ ├── Extensions/
│ │ ├── BaseExtensions.cs
│ │ ├── HttpContextExtensions.cs
│ │ ├── MethodNotAllowedException.cs
│ │ ├── ProcessExtensions.cs
│ │ ├── RateLimitExceededException.cs
│ │ └── ResourceNotFoundException.cs
│ ├── FfmpegException.cs
│ ├── IApplicationHost.cs
│ ├── MediaBrowser.Common.csproj
│ ├── Net/
│ │ ├── INetworkManager.cs
│ │ ├── NamedClient.cs
│ │ ├── NetworkConfiguration.cs
│ │ ├── NetworkConfigurationExtensions.cs
│ │ ├── NetworkConfigurationFactory.cs
│ │ ├── NetworkConfigurationStore.cs
│ │ ├── NetworkConstants.cs
│ │ ├── NetworkUtils.cs
│ │ └── RemoteAccessPolicyResult.cs
│ ├── Plugins/
│ │ ├── BasePlugin.cs
│ │ ├── BasePluginOfT.cs
│ │ ├── IHasPluginConfiguration.cs
│ │ ├── IPlugin.cs
│ │ ├── IPluginAssembly.cs
│ │ ├── IPluginManager.cs
│ │ ├── LocalPlugin.cs
│ │ └── PluginManifest.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── ProviderIdParsers.cs
│ │ └── SubtitleConfigurationFactory.cs
│ ├── RequiresSourceSerialisationAttribute.cs
│ └── Updates/
│ ├── IInstallationManager.cs
│ ├── InstallationEventArgs.cs
│ └── InstallationFailedEventArgs.cs
├── MediaBrowser.Controller/
│ ├── Authentication/
│ │ ├── AuthenticationException.cs
│ │ ├── AuthenticationResult.cs
│ │ ├── IAuthenticationProvider.cs
│ │ └── IPasswordResetProvider.cs
│ ├── BaseItemManager/
│ │ ├── BaseItemManager.cs
│ │ └── IBaseItemManager.cs
│ ├── Channels/
│ │ ├── Channel.cs
│ │ ├── ChannelItemInfo.cs
│ │ ├── ChannelItemResult.cs
│ │ ├── ChannelItemType.cs
│ │ ├── ChannelLatestMediaSearch.cs
│ │ ├── ChannelParentalRating.cs
│ │ ├── ChannelSearchInfo.cs
│ │ ├── IChannel.cs
│ │ ├── IChannelManager.cs
│ │ ├── IDisableMediaSourceDisplay.cs
│ │ ├── IHasCacheKey.cs
│ │ ├── IHasFolderAttributes.cs
│ │ ├── IRequiresMediaInfoCallback.cs
│ │ ├── ISupportsDelete.cs
│ │ ├── ISupportsLatestMedia.cs
│ │ ├── ISupportsMediaProbe.cs
│ │ ├── InternalChannelFeatures.cs
│ │ └── InternalChannelItemQuery.cs
│ ├── Chapters/
│ │ └── IChapterManager.cs
│ ├── ClientEvent/
│ │ ├── ClientEventLogger.cs
│ │ └── IClientEventLogger.cs
│ ├── Collections/
│ │ ├── CollectionCreatedEventArgs.cs
│ │ ├── CollectionCreationOptions.cs
│ │ ├── CollectionModifiedEventArgs.cs
│ │ └── ICollectionManager.cs
│ ├── Configuration/
│ │ └── IServerConfigurationManager.cs
│ ├── Devices/
│ │ └── IDeviceManager.cs
│ ├── Drawing/
│ │ ├── IImageEncoder.cs
│ │ ├── IImageProcessor.cs
│ │ ├── ImageCollageOptions.cs
│ │ ├── ImageHelper.cs
│ │ ├── ImageProcessingOptions.cs
│ │ └── ImageProcessorExtensions.cs
│ ├── Dto/
│ │ ├── DtoOptions.cs
│ │ └── IDtoService.cs
│ ├── Entities/
│ │ ├── AggregateFolder.cs
│ │ ├── Audio/
│ │ │ ├── Audio.cs
│ │ │ ├── IHasAlbumArtist.cs
│ │ │ ├── IHasMusicGenres.cs
│ │ │ ├── MusicAlbum.cs
│ │ │ ├── MusicArtist.cs
│ │ │ └── MusicGenre.cs
│ │ ├── AudioBook.cs
│ │ ├── BaseItem.cs
│ │ ├── BaseItemExtensions.cs
│ │ ├── BasePluginFolder.cs
│ │ ├── Book.cs
│ │ ├── CollectionFolder.cs
│ │ ├── Extensions.cs
│ │ ├── Folder.cs
│ │ ├── Genre.cs
│ │ ├── ICollectionFolder.cs
│ │ ├── IHasAspectRatio.cs
│ │ ├── IHasDisplayOrder.cs
│ │ ├── IHasMediaSources.cs
│ │ ├── IHasProgramAttributes.cs
│ │ ├── IHasSeries.cs
│ │ ├── IHasSpecialFeatures.cs
│ │ ├── IHasStartDate.cs
│ │ ├── IHasTrailers.cs
│ │ ├── IItemByName.cs
│ │ ├── IMetadataContainer.cs
│ │ ├── ISupportsBoxSetGrouping.cs
│ │ ├── ISupportsPlaceHolders.cs
│ │ ├── InternalItemsQuery.cs
│ │ ├── InternalPeopleQuery.cs
│ │ ├── ItemImageInfo.cs
│ │ ├── LinkedChild.cs
│ │ ├── LinkedChildComparer.cs
│ │ ├── LinkedChildType.cs
│ │ ├── MediaSourceWidthComparator.cs
│ │ ├── Movies/
│ │ │ ├── BoxSet.cs
│ │ │ └── Movie.cs
│ │ ├── MusicVideo.cs
│ │ ├── PeopleHelper.cs
│ │ ├── Person.cs
│ │ ├── PersonInfo.cs
│ │ ├── Photo.cs
│ │ ├── PhotoAlbum.cs
│ │ ├── SourceType.cs
│ │ ├── Studio.cs
│ │ ├── TV/
│ │ │ ├── Episode.cs
│ │ │ ├── Season.cs
│ │ │ └── Series.cs
│ │ ├── TagExtensions.cs
│ │ ├── Trailer.cs
│ │ ├── UserItemData.cs
│ │ ├── UserRootFolder.cs
│ │ ├── UserView.cs
│ │ ├── UserViewBuilder.cs
│ │ ├── Video.cs
│ │ └── Year.cs
│ ├── Events/
│ │ ├── Authentication/
│ │ │ ├── AuthenticationRequestEventArgs.cs
│ │ │ └── AuthenticationResultEventArgs.cs
│ │ ├── IEventConsumer.cs
│ │ ├── IEventManager.cs
│ │ ├── Session/
│ │ │ ├── SessionEndedEventArgs.cs
│ │ │ └── SessionStartedEventArgs.cs
│ │ └── Updates/
│ │ ├── PluginInstallationCancelledEventArgs.cs
│ │ ├── PluginInstalledEventArgs.cs
│ │ ├── PluginInstallingEventArgs.cs
│ │ ├── PluginUninstalledEventArgs.cs
│ │ └── PluginUpdatedEventArgs.cs
│ ├── Extensions/
│ │ ├── ConfigurationExtensions.cs
│ │ └── XmlReaderExtensions.cs
│ ├── IDisplayPreferencesManager.cs
│ ├── IO/
│ │ ├── FileData.cs
│ │ ├── FileSystemHelper.cs
│ │ ├── IExternalDataManager.cs
│ │ └── IPathManager.cs
│ ├── IServerApplicationHost.cs
│ ├── IServerApplicationPaths.cs
│ ├── ISystemManager.cs
│ ├── Library/
│ │ ├── DeleteOptions.cs
│ │ ├── IDirectStreamProvider.cs
│ │ ├── IIntroProvider.cs
│ │ ├── IKeyframeManager.cs
│ │ ├── ILibraryManager.cs
│ │ ├── ILibraryMonitor.cs
│ │ ├── ILibraryPostScanTask.cs
│ │ ├── ILiveStream.cs
│ │ ├── IMediaSourceManager.cs
│ │ ├── IMediaSourceProvider.cs
│ │ ├── IMetadataFileSaver.cs
│ │ ├── IMetadataSaver.cs
│ │ ├── IMusicManager.cs
│ │ ├── ISearchEngine.cs
│ │ ├── IUserDataManager.cs
│ │ ├── IUserManager.cs
│ │ ├── IUserViewManager.cs
│ │ ├── IntroInfo.cs
│ │ ├── ItemChangeEventArgs.cs
│ │ ├── ItemResolveArgs.cs
│ │ ├── ItemUpdateType.cs
│ │ ├── LibraryManagerExtensions.cs
│ │ ├── MetadataConfigurationExtensions.cs
│ │ ├── MetadataConfigurationStore.cs
│ │ ├── NameExtensions.cs
│ │ ├── PlaybackProgressEventArgs.cs
│ │ ├── PlaybackStartEventArgs.cs
│ │ ├── PlaybackStopEventArgs.cs
│ │ ├── SearchHintInfo.cs
│ │ ├── TVUtils.cs
│ │ └── UserDataSaveEventArgs.cs
│ ├── LibraryTaskScheduler/
│ │ ├── ILimitedConcurrencyLibraryScheduler.cs
│ │ └── LimitedConcurrencyLibraryScheduler.cs
│ ├── LiveTv/
│ │ ├── ActiveRecordingInfo.cs
│ │ ├── ChannelInfo.cs
│ │ ├── IGuideManager.cs
│ │ ├── IListingsManager.cs
│ │ ├── IListingsProvider.cs
│ │ ├── ILiveTvManager.cs
│ │ ├── ILiveTvService.cs
│ │ ├── IRecordingsManager.cs
│ │ ├── ITunerHost.cs
│ │ ├── ITunerHostManager.cs
│ │ ├── LiveTvChannel.cs
│ │ ├── LiveTvConflictException.cs
│ │ ├── LiveTvProgram.cs
│ │ ├── ProgramInfo.cs
│ │ ├── SeriesTimerInfo.cs
│ │ ├── TimerEventInfo.cs
│ │ └── TimerInfo.cs
│ ├── Lyrics/
│ │ ├── ILyricManager.cs
│ │ ├── ILyricParser.cs
│ │ ├── ILyricProvider.cs
│ │ └── LyricDownloadFailureEventArgs.cs
│ ├── MediaBrowser.Controller.csproj
│ ├── MediaEncoding/
│ │ ├── BaseEncodingJobOptions.cs
│ │ ├── BitStreamFilterOptionType.cs
│ │ ├── DownMixAlgorithmsHelper.cs
│ │ ├── EncodingHelper.cs
│ │ ├── EncodingJobInfo.cs
│ │ ├── FilterOptionType.cs
│ │ ├── IAttachmentExtractor.cs
│ │ ├── IMediaEncoder.cs
│ │ ├── ISubtitleEncoder.cs
│ │ ├── ITranscodeManager.cs
│ │ ├── JobLogger.cs
│ │ ├── MediaInfoRequest.cs
│ │ ├── TranscodingJob.cs
│ │ ├── TranscodingJobType.cs
│ │ ├── TranscodingSegmentCleaner.cs
│ │ └── TranscodingThrottler.cs
│ ├── MediaSegments/
│ │ ├── IMediaSegmentManager.cs
│ │ └── IMediaSegmentProvider.cs
│ ├── Net/
│ │ ├── AuthorizationInfo.cs
│ │ ├── BasePeriodicWebSocketListener.cs
│ │ ├── IAuthService.cs
│ │ ├── IAuthorizationContext.cs
│ │ ├── IWebSocketConnection.cs
│ │ ├── IWebSocketListener.cs
│ │ ├── IWebSocketManager.cs
│ │ ├── SecurityException.cs
│ │ ├── WebSocketListenerState.cs
│ │ ├── WebSocketMessage.cs
│ │ ├── WebSocketMessageInfo.cs
│ │ ├── WebSocketMessageOfT.cs
│ │ └── WebSocketMessages/
│ │ ├── IInboundWebSocketMessage.cs
│ │ ├── IOutboundWebSocketMessage.cs
│ │ ├── Inbound/
│ │ │ ├── ActivityLogEntryStartMessage.cs
│ │ │ ├── ActivityLogEntryStopMessage.cs
│ │ │ ├── InboundKeepAliveMessage.cs
│ │ │ ├── ScheduledTasksInfoStartMessage.cs
│ │ │ ├── ScheduledTasksInfoStopMessage.cs
│ │ │ ├── SessionsStartMessage.cs
│ │ │ └── SessionsStopMessage.cs
│ │ ├── InboundWebSocketMessage.cs
│ │ ├── InboundWebSocketMessageOfT.cs
│ │ ├── Outbound/
│ │ │ ├── ActivityLogEntryMessage.cs
│ │ │ ├── ForceKeepAliveMessage.cs
│ │ │ ├── GeneralCommandMessage.cs
│ │ │ ├── LibraryChangedMessage.cs
│ │ │ ├── OutboundKeepAliveMessage.cs
│ │ │ ├── PlayMessage.cs
│ │ │ ├── PlaystateMessage.cs
│ │ │ ├── PluginInstallationCancelledMessage.cs
│ │ │ ├── PluginInstallationCompletedMessage.cs
│ │ │ ├── PluginInstallationFailedMessage.cs
│ │ │ ├── PluginInstallingMessage.cs
│ │ │ ├── PluginUninstalledMessage.cs
│ │ │ ├── RefreshProgressMessage.cs
│ │ │ ├── RestartRequiredMessage.cs
│ │ │ ├── ScheduledTaskEndedMessage.cs
│ │ │ ├── ScheduledTasksInfoMessage.cs
│ │ │ ├── SeriesTimerCancelledMessage.cs
│ │ │ ├── SeriesTimerCreatedMessage.cs
│ │ │ ├── ServerRestartingMessage.cs
│ │ │ ├── ServerShuttingDownMessage.cs
│ │ │ ├── SessionsMessage.cs
│ │ │ ├── SyncPlayCommandMessage.cs
│ │ │ ├── TimerCancelledMessage.cs
│ │ │ ├── TimerCreatedMessage.cs
│ │ │ ├── UserDataChangedMessage.cs
│ │ │ ├── UserDeletedMessage.cs
│ │ │ └── UserUpdatedMessage.cs
│ │ ├── OutboundWebSocketMessage.cs
│ │ └── OutboundWebSocketMessageOfT.cs
│ ├── Persistence/
│ │ ├── IChapterRepository.cs
│ │ ├── IItemRepository.cs
│ │ ├── IItemTypeLookup.cs
│ │ ├── IKeyframeRepository.cs
│ │ ├── IMediaAttachmentRepository.cs
│ │ ├── IMediaStreamRepository.cs
│ │ ├── IPeopleRepository.cs
│ │ ├── MediaAttachmentQuery.cs
│ │ └── MediaStreamQuery.cs
│ ├── Playlists/
│ │ ├── IPlaylistManager.cs
│ │ └── Playlist.cs
│ ├── Plugins/
│ │ └── IPluginServiceRegistrator.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── AlbumInfo.cs
│ │ ├── ArtistInfo.cs
│ │ ├── BookInfo.cs
│ │ ├── BoxSetInfo.cs
│ │ ├── DirectoryService.cs
│ │ ├── DynamicImageResponse.cs
│ │ ├── EpisodeInfo.cs
│ │ ├── ICustomMetadataProvider.cs
│ │ ├── IDirectoryService.cs
│ │ ├── IDynamicImageProvider.cs
│ │ ├── IExternalId.cs
│ │ ├── IExternalUrlProvider.cs
│ │ ├── IForcedProvider.cs
│ │ ├── IHasItemChangeMonitor.cs
│ │ ├── IHasLookupInfo.cs
│ │ ├── IHasOrder.cs
│ │ ├── IImageProvider.cs
│ │ ├── ILocalImageProvider.cs
│ │ ├── ILocalMetadataProvider.cs
│ │ ├── IMetadataProvider.cs
│ │ ├── IMetadataService.cs
│ │ ├── IPreRefreshProvider.cs
│ │ ├── IProviderManager.cs
│ │ ├── IRemoteImageProvider.cs
│ │ ├── IRemoteMetadataProvider.cs
│ │ ├── IRemoteSearchProvider.cs
│ │ ├── ImageRefreshOptions.cs
│ │ ├── ItemInfo.cs
│ │ ├── ItemLookupInfo.cs
│ │ ├── LocalImageInfo.cs
│ │ ├── MetadataRefreshMode.cs
│ │ ├── MetadataRefreshOptions.cs
│ │ ├── MetadataResult.cs
│ │ ├── MovieInfo.cs
│ │ ├── MusicVideoInfo.cs
│ │ ├── PersonLookupInfo.cs
│ │ ├── RefreshPriority.cs
│ │ ├── RemoteSearchQuery.cs
│ │ ├── SeasonInfo.cs
│ │ ├── SeriesInfo.cs
│ │ ├── SongInfo.cs
│ │ ├── TrailerInfo.cs
│ │ └── VideoContentType.cs
│ ├── QuickConnect/
│ │ └── IQuickConnect.cs
│ ├── Resolvers/
│ │ ├── IItemResolver.cs
│ │ ├── IResolverIgnoreRule.cs
│ │ ├── ItemResolver.cs
│ │ └── ResolverPriority.cs
│ ├── Security/
│ │ ├── AuthenticationInfo.cs
│ │ └── IAuthenticationManager.cs
│ ├── Session/
│ │ ├── AuthenticationRequest.cs
│ │ ├── ISessionController.cs
│ │ ├── ISessionManager.cs
│ │ ├── SessionEventArgs.cs
│ │ └── SessionInfo.cs
│ ├── Sorting/
│ │ ├── IBaseItemComparer.cs
│ │ ├── IUserBaseItemComparer.cs
│ │ └── SortExtensions.cs
│ ├── Streaming/
│ │ ├── ProgressiveFileStream.cs
│ │ ├── StreamState.cs
│ │ ├── StreamingRequestDto.cs
│ │ └── VideoRequestDto.cs
│ ├── Subtitles/
│ │ ├── ISubtitleManager.cs
│ │ ├── ISubtitleProvider.cs
│ │ ├── SubtitleDownloadFailureEventArgs.cs
│ │ ├── SubtitleResponse.cs
│ │ └── SubtitleSearchRequest.cs
│ ├── SyncPlay/
│ │ ├── GroupMember.cs
│ │ ├── GroupStates/
│ │ │ ├── AbstractGroupState.cs
│ │ │ ├── IdleGroupState.cs
│ │ │ ├── PausedGroupState.cs
│ │ │ ├── PlayingGroupState.cs
│ │ │ └── WaitingGroupState.cs
│ │ ├── IGroupPlaybackRequest.cs
│ │ ├── IGroupState.cs
│ │ ├── IGroupStateContext.cs
│ │ ├── ISyncPlayManager.cs
│ │ ├── ISyncPlayRequest.cs
│ │ ├── PlaybackRequests/
│ │ │ ├── AbstractPlaybackRequest.cs
│ │ │ ├── BufferGroupRequest.cs
│ │ │ ├── IgnoreWaitGroupRequest.cs
│ │ │ ├── MovePlaylistItemGroupRequest.cs
│ │ │ ├── NextItemGroupRequest.cs
│ │ │ ├── PauseGroupRequest.cs
│ │ │ ├── PingGroupRequest.cs
│ │ │ ├── PlayGroupRequest.cs
│ │ │ ├── PreviousItemGroupRequest.cs
│ │ │ ├── QueueGroupRequest.cs
│ │ │ ├── ReadyGroupRequest.cs
│ │ │ ├── RemoveFromPlaylistGroupRequest.cs
│ │ │ ├── SeekGroupRequest.cs
│ │ │ ├── SetPlaylistItemGroupRequest.cs
│ │ │ ├── SetRepeatModeGroupRequest.cs
│ │ │ ├── SetShuffleModeGroupRequest.cs
│ │ │ ├── StopGroupRequest.cs
│ │ │ └── UnpauseGroupRequest.cs
│ │ ├── Queue/
│ │ │ └── PlayQueueManager.cs
│ │ └── Requests/
│ │ ├── JoinGroupRequest.cs
│ │ ├── LeaveGroupRequest.cs
│ │ ├── ListGroupsRequest.cs
│ │ └── NewGroupRequest.cs
│ ├── SystemBackupService/
│ │ ├── BackupManifestDto.cs
│ │ ├── BackupOptionsDto.cs
│ │ ├── BackupRestoreRequestDto.cs
│ │ └── IBackupService.cs
│ ├── TV/
│ │ └── ITVSeriesManager.cs
│ └── Trickplay/
│ └── ITrickplayManager.cs
├── MediaBrowser.LocalMetadata/
│ ├── BaseXmlProvider.cs
│ ├── Images/
│ │ ├── CollectionFolderLocalImageProvider.cs
│ │ ├── EpisodeLocalImageProvider.cs
│ │ ├── InternalMetadataFolderImageProvider.cs
│ │ └── LocalImageProvider.cs
│ ├── MediaBrowser.LocalMetadata.csproj
│ ├── Parsers/
│ │ ├── BaseItemXmlParser.cs
│ │ ├── BoxSetXmlParser.cs
│ │ └── PlaylistXmlParser.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── BoxSetXmlProvider.cs
│ │ └── PlaylistXmlProvider.cs
│ ├── Savers/
│ │ ├── BaseXmlSaver.cs
│ │ ├── BoxSetXmlSaver.cs
│ │ └── PlaylistXmlSaver.cs
│ └── XmlProviderUtils.cs
├── MediaBrowser.MediaEncoding/
│ ├── Attachments/
│ │ └── AttachmentExtractor.cs
│ ├── BdInfo/
│ │ ├── BdInfoDirectoryInfo.cs
│ │ ├── BdInfoExaminer.cs
│ │ └── BdInfoFileInfo.cs
│ ├── Configuration/
│ │ ├── EncodingConfigurationFactory.cs
│ │ └── EncodingConfigurationStore.cs
│ ├── Encoder/
│ │ ├── ApplePlatformHelper.cs
│ │ ├── EncoderValidator.cs
│ │ ├── EncodingUtils.cs
│ │ └── MediaEncoder.cs
│ ├── MediaBrowser.MediaEncoding.csproj
│ ├── Probing/
│ │ ├── CodecType.cs
│ │ ├── FFProbeHelpers.cs
│ │ ├── InternalMediaInfoResult.cs
│ │ ├── MediaChapter.cs
│ │ ├── MediaFormatInfo.cs
│ │ ├── MediaFrameInfo.cs
│ │ ├── MediaFrameSideDataInfo.cs
│ │ ├── MediaStreamInfo.cs
│ │ ├── MediaStreamInfoSideData.cs
│ │ └── ProbeResultNormalizer.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Subtitles/
│ │ ├── AssWriter.cs
│ │ ├── ISubtitleParser.cs
│ │ ├── ISubtitleWriter.cs
│ │ ├── JsonWriter.cs
│ │ ├── SrtWriter.cs
│ │ ├── SsaWriter.cs
│ │ ├── SubtitleEditParser.cs
│ │ ├── SubtitleEncoder.cs
│ │ ├── SubtitleFormatExtensions.cs
│ │ ├── TtmlWriter.cs
│ │ └── VttWriter.cs
│ └── Transcoding/
│ └── TranscodeManager.cs
├── MediaBrowser.Model/
│ ├── Activity/
│ │ ├── ActivityLogEntry.cs
│ │ └── IActivityManager.cs
│ ├── ApiClient/
│ │ └── ServerDiscoveryInfo.cs
│ ├── Branding/
│ │ ├── BrandingOptions.cs
│ │ └── BrandingOptionsDto.cs
│ ├── Channels/
│ │ ├── ChannelFeatures.cs
│ │ ├── ChannelFolderType.cs
│ │ ├── ChannelItemSortField.cs
│ │ ├── ChannelMediaContentType.cs
│ │ ├── ChannelMediaType.cs
│ │ └── ChannelQuery.cs
│ ├── Collections/
│ │ └── CollectionCreationResult.cs
│ ├── Configuration/
│ │ ├── BaseApplicationConfiguration.cs
│ │ ├── EmbeddedSubtitleOptions.cs
│ │ ├── EncodingOptions.cs
│ │ ├── HlsAudioSeekStrategy.cs
│ │ ├── ImageOption.cs
│ │ ├── ImageSavingConvention.cs
│ │ ├── LibraryOptions.cs
│ │ ├── MediaPathInfo.cs
│ │ ├── MetadataConfiguration.cs
│ │ ├── MetadataOptions.cs
│ │ ├── MetadataPlugin.cs
│ │ ├── MetadataPluginSummary.cs
│ │ ├── MetadataPluginType.cs
│ │ ├── PathSubstitution.cs
│ │ ├── ServerConfiguration.cs
│ │ ├── TrickplayOptions.cs
│ │ ├── TrickplayScanBehavior.cs
│ │ ├── TypeOptions.cs
│ │ ├── UserConfiguration.cs
│ │ └── XbmcMetadataOptions.cs
│ ├── Cryptography/
│ │ ├── Constants.cs
│ │ ├── ICryptoProvider.cs
│ │ └── PasswordHash.cs
│ ├── Devices/
│ │ └── DeviceInfo.cs
│ ├── Dlna/
│ │ ├── CodecProfile.cs
│ │ ├── CodecType.cs
│ │ ├── ConditionProcessor.cs
│ │ ├── ContainerProfile.cs
│ │ ├── DeviceProfile.cs
│ │ ├── DirectPlayProfile.cs
│ │ ├── DlnaProfileType.cs
│ │ ├── EncodingContext.cs
│ │ ├── ITranscoderSupport.cs
│ │ ├── MediaOptions.cs
│ │ ├── PlaybackErrorCode.cs
│ │ ├── ProfileCondition.cs
│ │ ├── ProfileConditionType.cs
│ │ ├── ProfileConditionValue.cs
│ │ ├── ResolutionConfiguration.cs
│ │ ├── ResolutionNormalizer.cs
│ │ ├── ResolutionOptions.cs
│ │ ├── StreamBuilder.cs
│ │ ├── StreamInfo.cs
│ │ ├── SubtitleDeliveryMethod.cs
│ │ ├── SubtitleProfile.cs
│ │ ├── SubtitleStreamInfo.cs
│ │ ├── TranscodeSeekInfo.cs
│ │ └── TranscodingProfile.cs
│ ├── Drawing/
│ │ ├── DrawingUtils.cs
│ │ ├── ImageDimensions.cs
│ │ ├── ImageFormat.cs
│ │ ├── ImageFormatExtensions.cs
│ │ ├── ImageOrientation.cs
│ │ └── ImageResolution.cs
│ ├── Dto/
│ │ ├── BaseItemDto.cs
│ │ ├── BaseItemPerson.cs
│ │ ├── ClientCapabilitiesDto.cs
│ │ ├── DeviceInfoDto.cs
│ │ ├── DisplayPreferencesDto.cs
│ │ ├── IHasServerId.cs
│ │ ├── IItemDto.cs
│ │ ├── ImageInfo.cs
│ │ ├── ItemCounts.cs
│ │ ├── MediaSourceInfo.cs
│ │ ├── MediaSourceType.cs
│ │ ├── MetadataEditorInfo.cs
│ │ ├── NameGuidPair.cs
│ │ ├── NameIdPair.cs
│ │ ├── NameValuePair.cs
│ │ ├── PlaylistDto.cs
│ │ ├── RatingType.cs
│ │ ├── RecommendationDto.cs
│ │ ├── RecommendationType.cs
│ │ ├── SessionInfoDto.cs
│ │ ├── TrickplayInfoDto.cs
│ │ ├── UpdateUserItemDataDto.cs
│ │ ├── UserDto.cs
│ │ └── UserItemDataDto.cs
│ ├── Entities/
│ │ ├── ChapterInfo.cs
│ │ ├── CollectionTypeOptions.cs
│ │ ├── DeinterlaceMethod.cs
│ │ ├── DownMixStereoAlgorithms.cs
│ │ ├── EncoderPreset.cs
│ │ ├── ExtraType.cs
│ │ ├── HardwareAccelerationType.cs
│ │ ├── IHasProviderIds.cs
│ │ ├── IHasShares.cs
│ │ ├── ImageType.cs
│ │ ├── IsoType.cs
│ │ ├── LibraryUpdateInfo.cs
│ │ ├── LocationType.cs
│ │ ├── MediaAttachment.cs
│ │ ├── MediaStream.cs
│ │ ├── MediaStreamType.cs
│ │ ├── MediaUrl.cs
│ │ ├── MetadataField.cs
│ │ ├── MetadataProvider.cs
│ │ ├── ParentalRating.cs
│ │ ├── ParentalRatingEntry.cs
│ │ ├── ParentalRatingScore.cs
│ │ ├── ParentalRatingSystem.cs
│ │ ├── PersonType.cs
│ │ ├── PlaylistUserPermissions.cs
│ │ ├── ProviderIdsExtensions.cs
│ │ ├── SeriesStatus.cs
│ │ ├── TonemappingAlgorithm.cs
│ │ ├── TonemappingMode.cs
│ │ ├── TonemappingRange.cs
│ │ ├── TrailerType.cs
│ │ ├── UserDataSaveReason.cs
│ │ ├── Video3DFormat.cs
│ │ ├── VideoType.cs
│ │ └── VirtualFolderInfo.cs
│ ├── Extensions/
│ │ ├── ContainerHelper.cs
│ │ ├── EnumerableExtensions.cs
│ │ ├── LibraryOptionsExtension.cs
│ │ └── StringHelper.cs
│ ├── Globalization/
│ │ ├── CountryInfo.cs
│ │ ├── CultureDto.cs
│ │ ├── ILocalizationManager.cs
│ │ └── LocalizationOption.cs
│ ├── IO/
│ │ ├── AsyncFile.cs
│ │ ├── FileSystemEntryInfo.cs
│ │ ├── FileSystemEntryType.cs
│ │ ├── FileSystemMetadata.cs
│ │ ├── IFileSystem.cs
│ │ ├── IODefaults.cs
│ │ ├── IShortcutHandler.cs
│ │ └── IStreamHelper.cs
│ ├── Library/
│ │ ├── PlayAccess.cs
│ │ └── UserViewQuery.cs
│ ├── LiveTv/
│ │ ├── BaseTimerInfoDto.cs
│ │ ├── ChannelMappingOptionsDto.cs
│ │ ├── ChannelType.cs
│ │ ├── DayPattern.cs
│ │ ├── GuideInfo.cs
│ │ ├── ListingsProviderInfo.cs
│ │ ├── LiveTvChannelQuery.cs
│ │ ├── LiveTvInfo.cs
│ │ ├── LiveTvOptions.cs
│ │ ├── LiveTvServiceInfo.cs
│ │ ├── LiveTvServiceStatus.cs
│ │ ├── ProgramAudio.cs
│ │ ├── RecordingQuery.cs
│ │ ├── RecordingStatus.cs
│ │ ├── SeriesTimerInfoDto.cs
│ │ ├── SeriesTimerQuery.cs
│ │ ├── TimerInfoDto.cs
│ │ ├── TimerQuery.cs
│ │ ├── TunerChannelMapping.cs
│ │ └── TunerHostInfo.cs
│ ├── Lyrics/
│ │ ├── LyricDto.cs
│ │ ├── LyricFile.cs
│ │ ├── LyricLine.cs
│ │ ├── LyricLineCue.cs
│ │ ├── LyricMetadata.cs
│ │ ├── LyricResponse.cs
│ │ ├── LyricSearchRequest.cs
│ │ ├── RemoteLyricInfoDto.cs
│ │ └── UploadLyricDto.cs
│ ├── MediaBrowser.Model.csproj
│ ├── MediaInfo/
│ │ ├── AudioCodec.cs
│ │ ├── AudioIndexSource.cs
│ │ ├── BlurayDiscInfo.cs
│ │ ├── IBlurayExaminer.cs
│ │ ├── LiveStreamRequest.cs
│ │ ├── LiveStreamResponse.cs
│ │ ├── MediaInfo.cs
│ │ ├── MediaProtocol.cs
│ │ ├── PlaybackInfoResponse.cs
│ │ ├── SubtitleFormat.cs
│ │ ├── SubtitleTrackEvent.cs
│ │ ├── SubtitleTrackInfo.cs
│ │ └── TransportStreamTimestamp.cs
│ ├── MediaSegments/
│ │ ├── MediaSegmentDto.cs
│ │ └── MediaSegmentGenerationRequest.cs
│ ├── Net/
│ │ ├── EndPointInfo.cs
│ │ ├── IPData.cs
│ │ ├── ISocketFactory.cs
│ │ ├── MimeTypes.cs
│ │ └── PublishedServerUriOverride.cs
│ ├── Notifications/
│ │ └── NotificationType.cs
│ ├── Playlists/
│ │ ├── PlaylistCreationRequest.cs
│ │ ├── PlaylistCreationResult.cs
│ │ ├── PlaylistUpdateRequest.cs
│ │ └── PlaylistUserUpdateRequest.cs
│ ├── Plugins/
│ │ ├── BasePluginConfiguration.cs
│ │ ├── IHasWebPages.cs
│ │ ├── PluginInfo.cs
│ │ ├── PluginPageInfo.cs
│ │ └── PluginStatus.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── ExternalIdInfo.cs
│ │ ├── ExternalIdMediaType.cs
│ │ ├── ExternalUrl.cs
│ │ ├── ImageProviderInfo.cs
│ │ ├── LyricProviderInfo.cs
│ │ ├── RemoteImageInfo.cs
│ │ ├── RemoteImageQuery.cs
│ │ ├── RemoteImageResult.cs
│ │ ├── RemoteLyricInfo.cs
│ │ ├── RemoteSearchResult.cs
│ │ ├── RemoteSubtitleInfo.cs
│ │ ├── SubtitleOptions.cs
│ │ └── SubtitleProviderInfo.cs
│ ├── Querying/
│ │ ├── AllThemeMediaResult.cs
│ │ ├── ItemFields.cs
│ │ ├── ItemFilter.cs
│ │ ├── LatestItemsQuery.cs
│ │ ├── NextUpQuery.cs
│ │ ├── QueryFilters.cs
│ │ ├── QueryFiltersLegacy.cs
│ │ ├── QueryResult.cs
│ │ └── ThemeMediaResult.cs
│ ├── QuickConnect/
│ │ └── QuickConnectResult.cs
│ ├── Search/
│ │ ├── SearchHint.cs
│ │ ├── SearchHintResult.cs
│ │ └── SearchQuery.cs
│ ├── Serialization/
│ │ └── IXmlSerializer.cs
│ ├── Session/
│ │ ├── BrowseRequest.cs
│ │ ├── ClientCapabilities.cs
│ │ ├── GeneralCommand.cs
│ │ ├── GeneralCommandType.cs
│ │ ├── MessageCommand.cs
│ │ ├── PlayCommand.cs
│ │ ├── PlayMethod.cs
│ │ ├── PlayRequest.cs
│ │ ├── PlaybackOrder.cs
│ │ ├── PlaybackProgressInfo.cs
│ │ ├── PlaybackStartInfo.cs
│ │ ├── PlaybackStopInfo.cs
│ │ ├── PlayerStateInfo.cs
│ │ ├── PlaystateCommand.cs
│ │ ├── PlaystateRequest.cs
│ │ ├── QueueItem.cs
│ │ ├── RepeatMode.cs
│ │ ├── SessionMessageType.cs
│ │ ├── SessionUserInfo.cs
│ │ ├── TranscodeReason.cs
│ │ ├── TranscodingInfo.cs
│ │ └── UserDataChangeInfo.cs
│ ├── Subtitles/
│ │ └── FontFile.cs
│ ├── SyncPlay/
│ │ ├── GroupInfoDto.cs
│ │ ├── GroupQueueMode.cs
│ │ ├── GroupRepeatMode.cs
│ │ ├── GroupShuffleMode.cs
│ │ ├── GroupStateType.cs
│ │ ├── GroupStateUpdate.cs
│ │ ├── GroupUpdate.cs
│ │ ├── GroupUpdateType.cs
│ │ ├── PlayQueueUpdate.cs
│ │ ├── PlayQueueUpdateReason.cs
│ │ ├── PlaybackRequestType.cs
│ │ ├── RequestType.cs
│ │ ├── SendCommand.cs
│ │ ├── SendCommandType.cs
│ │ ├── SyncPlayBroadcastType.cs
│ │ ├── SyncPlayGroupDoesNotExistUpdate.cs
│ │ ├── SyncPlayGroupJoinedUpdate.cs
│ │ ├── SyncPlayGroupLeftUpdate.cs
│ │ ├── SyncPlayLibraryAccessDeniedUpdate.cs
│ │ ├── SyncPlayNotInGroupUpdate.cs
│ │ ├── SyncPlayPlayQueueUpdate.cs
│ │ ├── SyncPlayQueueItem.cs
│ │ ├── SyncPlayStateUpdate.cs
│ │ ├── SyncPlayUserJoinedUpdate.cs
│ │ ├── SyncPlayUserLeftUpdate.cs
│ │ └── UtcTimeResponse.cs
│ ├── System/
│ │ ├── CastReceiverApplication.cs
│ │ ├── FolderStorageInfo.cs
│ │ ├── LibraryStorageInfo.cs
│ │ ├── LogFile.cs
│ │ ├── PublicSystemInfo.cs
│ │ ├── SystemInfo.cs
│ │ └── SystemStorageInfo.cs
│ ├── Tasks/
│ │ ├── IConfigurableScheduledTask.cs
│ │ ├── IScheduledTask.cs
│ │ ├── IScheduledTaskWorker.cs
│ │ ├── ITaskManager.cs
│ │ ├── ITaskTrigger.cs
│ │ ├── ScheduledTaskHelpers.cs
│ │ ├── TaskCompletionEventArgs.cs
│ │ ├── TaskCompletionStatus.cs
│ │ ├── TaskInfo.cs
│ │ ├── TaskOptions.cs
│ │ ├── TaskResult.cs
│ │ ├── TaskState.cs
│ │ ├── TaskTriggerInfo.cs
│ │ └── TaskTriggerInfoType.cs
│ ├── Updates/
│ │ ├── InstallationInfo.cs
│ │ ├── PackageInfo.cs
│ │ ├── RepositoryInfo.cs
│ │ └── VersionInfo.cs
│ └── Users/
│ ├── ForgotPasswordAction.cs
│ ├── ForgotPasswordResult.cs
│ ├── PinRedeemResult.cs
│ └── UserPolicy.cs
├── MediaBrowser.Providers/
│ ├── Books/
│ │ ├── AudioBookMetadataService.cs
│ │ ├── BookMetadataService.cs
│ │ └── OpenPackagingFormat/
│ │ ├── EpubImageProvider.cs
│ │ ├── EpubProvider.cs
│ │ ├── EpubUtils.cs
│ │ ├── OpfProvider.cs
│ │ └── OpfReader.cs
│ ├── BoxSets/
│ │ └── BoxSetMetadataService.cs
│ ├── Channels/
│ │ └── ChannelMetadataService.cs
│ ├── Folders/
│ │ ├── CollectionFolderMetadataService.cs
│ │ ├── FolderMetadataService.cs
│ │ └── UserViewMetadataService.cs
│ ├── Genres/
│ │ └── GenreMetadataService.cs
│ ├── LiveTv/
│ │ └── LiveTvMetadataService.cs
│ ├── Lyric/
│ │ ├── LrcLyricParser.cs
│ │ ├── LyricManager.cs
│ │ ├── LyricScheduledTask.cs
│ │ └── TxtLyricParser.cs
│ ├── Manager/
│ │ ├── ImageSaver.cs
│ │ ├── ItemImageProvider.cs
│ │ ├── MetadataService.cs
│ │ ├── ProviderManager.cs
│ │ └── RefreshResult.cs
│ ├── MediaBrowser.Providers.csproj
│ ├── MediaInfo/
│ │ ├── AudioFileProber.cs
│ │ ├── AudioImageProvider.cs
│ │ ├── AudioResolver.cs
│ │ ├── EmbeddedImageProvider.cs
│ │ ├── FFProbeVideoInfo.cs
│ │ ├── LyricResolver.cs
│ │ ├── MediaInfoResolver.cs
│ │ ├── ProbeProvider.cs
│ │ ├── SubtitleDownloader.cs
│ │ ├── SubtitleResolver.cs
│ │ ├── SubtitleScheduledTask.cs
│ │ └── VideoImageProvider.cs
│ ├── Movies/
│ │ ├── ImdbExternalId.cs
│ │ ├── ImdbExternalUrlProvider.cs
│ │ ├── ImdbPersonExternalId.cs
│ │ ├── MovieMetadataService.cs
│ │ └── TrailerMetadataService.cs
│ ├── Music/
│ │ ├── AlbumInfoExtensions.cs
│ │ ├── AlbumMetadataService.cs
│ │ ├── ArtistMetadataService.cs
│ │ ├── AudioMetadataService.cs
│ │ ├── ImvdbId.cs
│ │ └── MusicVideoMetadataService.cs
│ ├── MusicGenres/
│ │ └── MusicGenreMetadataService.cs
│ ├── People/
│ │ └── PersonMetadataService.cs
│ ├── Photos/
│ │ ├── PhotoAlbumMetadataService.cs
│ │ └── PhotoMetadataService.cs
│ ├── Playlists/
│ │ ├── PlaylistItemsProvider.cs
│ │ └── PlaylistMetadataService.cs
│ ├── Plugins/
│ │ ├── AudioDb/
│ │ │ ├── AudioDbAlbumExternalId.cs
│ │ │ ├── AudioDbAlbumExternalUrlProvider.cs
│ │ │ ├── AudioDbAlbumImageProvider.cs
│ │ │ ├── AudioDbAlbumProvider.cs
│ │ │ ├── AudioDbArtistExternalId.cs
│ │ │ ├── AudioDbArtistExternalUrlProvider.cs
│ │ │ ├── AudioDbArtistImageProvider.cs
│ │ │ ├── AudioDbArtistProvider.cs
│ │ │ ├── AudioDbOtherAlbumExternalId.cs
│ │ │ ├── AudioDbOtherArtistExternalId.cs
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ └── Plugin.cs
│ │ ├── MusicBrainz/
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ ├── MusicBrainzAlbumArtistExternalId.cs
│ │ │ ├── MusicBrainzAlbumArtistExternalUrlProvider.cs
│ │ │ ├── MusicBrainzAlbumExternalId.cs
│ │ │ ├── MusicBrainzAlbumExternalUrlProvider.cs
│ │ │ ├── MusicBrainzAlbumProvider.cs
│ │ │ ├── MusicBrainzArtistExternalId.cs
│ │ │ ├── MusicBrainzArtistExternalUrlProvider.cs
│ │ │ ├── MusicBrainzArtistProvider.cs
│ │ │ ├── MusicBrainzOtherArtistExternalId.cs
│ │ │ ├── MusicBrainzRecordingId.cs
│ │ │ ├── MusicBrainzReleaseGroupExternalId.cs
│ │ │ ├── MusicBrainzReleaseGroupExternalUrlProvider.cs
│ │ │ ├── MusicBrainzTrackExternalUrlProvider.cs
│ │ │ ├── MusicBrainzTrackId.cs
│ │ │ └── Plugin.cs
│ │ ├── Omdb/
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ ├── JsonOmdbNotAvailableInt32Converter.cs
│ │ │ ├── JsonOmdbNotAvailableStringConverter.cs
│ │ │ ├── OmdbEpisodeProvider.cs
│ │ │ ├── OmdbImageProvider.cs
│ │ │ ├── OmdbItemProvider.cs
│ │ │ ├── OmdbProvider.cs
│ │ │ └── Plugin.cs
│ │ ├── StudioImages/
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ ├── Plugin.cs
│ │ │ └── StudiosImageProvider.cs
│ │ └── Tmdb/
│ │ ├── Api/
│ │ │ └── TmdbController.cs
│ │ ├── BoxSets/
│ │ │ ├── TmdbBoxSetExternalId.cs
│ │ │ ├── TmdbBoxSetImageProvider.cs
│ │ │ └── TmdbBoxSetProvider.cs
│ │ ├── Configuration/
│ │ │ ├── PluginConfiguration.cs
│ │ │ └── config.html
│ │ ├── Movies/
│ │ │ ├── TmdbMovieExternalId.cs
│ │ │ ├── TmdbMovieImageProvider.cs
│ │ │ └── TmdbMovieProvider.cs
│ │ ├── People/
│ │ │ ├── TmdbPersonExternalId.cs
│ │ │ ├── TmdbPersonImageProvider.cs
│ │ │ └── TmdbPersonProvider.cs
│ │ ├── Plugin.cs
│ │ ├── TV/
│ │ │ ├── TmdbEpisodeImageProvider.cs
│ │ │ ├── TmdbEpisodeProvider.cs
│ │ │ ├── TmdbSeasonImageProvider.cs
│ │ │ ├── TmdbSeasonProvider.cs
│ │ │ ├── TmdbSeriesExternalId.cs
│ │ │ ├── TmdbSeriesImageProvider.cs
│ │ │ └── TmdbSeriesProvider.cs
│ │ ├── TmdbClientManager.cs
│ │ ├── TmdbExternalUrlProvider.cs
│ │ └── TmdbUtils.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Studios/
│ │ └── StudioMetadataService.cs
│ ├── Subtitles/
│ │ └── SubtitleManager.cs
│ ├── TV/
│ │ ├── EpisodeMetadataService.cs
│ │ ├── SeasonMetadataService.cs
│ │ ├── SeriesMetadataService.cs
│ │ ├── Zap2ItExternalId.cs
│ │ └── Zap2ItExternalUrlProvider.cs
│ ├── Trickplay/
│ │ ├── TrickplayImagesTask.cs
│ │ ├── TrickplayMoveImagesTask.cs
│ │ └── TrickplayProvider.cs
│ ├── Videos/
│ │ └── VideoMetadataService.cs
│ └── Years/
│ └── YearMetadataService.cs
├── MediaBrowser.XbmcMetadata/
│ ├── Configuration/
│ │ ├── NfoConfigurationExtension.cs
│ │ └── NfoConfigurationFactory.cs
│ ├── MediaBrowser.XbmcMetadata.csproj
│ ├── NfoUserDataSaver.cs
│ ├── Parsers/
│ │ ├── BaseNfoParser.cs
│ │ ├── EpisodeNfoParser.cs
│ │ ├── MovieNfoParser.cs
│ │ ├── SeasonNfoParser.cs
│ │ ├── SeriesNfoParser.cs
│ │ └── SeriesNfoSeasonParser.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── AlbumNfoProvider.cs
│ │ ├── ArtistNfoProvider.cs
│ │ ├── BaseNfoProvider.cs
│ │ ├── BaseVideoNfoProvider.cs
│ │ ├── EpisodeNfoProvider.cs
│ │ ├── MovieNfoProvider.cs
│ │ ├── MusicVideoNfoProvider.cs
│ │ ├── SeasonNfoProvider.cs
│ │ ├── SeriesNfoProvider.cs
│ │ ├── SeriesNfoSeasonProvider.cs
│ │ └── VideoNfoProvider.cs
│ └── Savers/
│ ├── AlbumNfoSaver.cs
│ ├── ArtistNfoSaver.cs
│ ├── BaseNfoSaver.cs
│ ├── EpisodeNfoSaver.cs
│ ├── MovieNfoSaver.cs
│ ├── SeasonNfoSaver.cs
│ └── SeriesNfoSaver.cs
├── README.md
├── SharedVersion.cs
├── bump_version
├── deployment/
│ └── unraid/
│ └── docker-templates/
│ ├── README.md
│ └── jellyfin.xml
├── fuzz/
│ ├── .gitignore
│ ├── Emby.Server.Implementations.Fuzz/
│ │ ├── Emby.Server.Implementations.Fuzz.csproj
│ │ ├── Program.cs
│ │ ├── Testcases/
│ │ │ ├── PathExtensions.TryReplaceSubPath/
│ │ │ │ └── test1.txt
│ │ │ └── SqliteItemRepository.ItemImageInfoFromValueString/
│ │ │ └── test1.txt
│ │ └── fuzz.sh
│ ├── Jellyfin.Api.Fuzz/
│ │ ├── Jellyfin.Api.Fuzz.csproj
│ │ ├── Program.cs
│ │ ├── Testcases/
│ │ │ └── UrlDecodeQueryFeature/
│ │ │ └── test1.txt
│ │ └── fuzz.sh
│ └── README.md
├── global.json
├── jellyfin.code-workspace
├── nuget.config
├── src/
│ ├── Directory.Build.props
│ ├── Jellyfin.CodeAnalysis/
│ │ ├── AnalyzerReleases.Shipped.md
│ │ ├── AsyncDisposalPatternAnalyzer.cs
│ │ └── Jellyfin.CodeAnalysis.csproj
│ ├── Jellyfin.Database/
│ │ ├── Jellyfin.Database.Implementations/
│ │ │ ├── DbConfiguration/
│ │ │ │ ├── CustomDatabaseOption.cs
│ │ │ │ ├── CustomDatabaseOptions.cs
│ │ │ │ ├── DatabaseConfigurationOptions.cs
│ │ │ │ └── DatabaseLockingBehaviorTypes.cs
│ │ │ ├── Entities/
│ │ │ │ ├── AccessSchedule.cs
│ │ │ │ ├── ActivityLog.cs
│ │ │ │ ├── AncestorId.cs
│ │ │ │ ├── AttachmentStreamInfo.cs
│ │ │ │ ├── BaseItemEntity.cs
│ │ │ │ ├── BaseItemExtraType.cs
│ │ │ │ ├── BaseItemImageInfo.cs
│ │ │ │ ├── BaseItemMetadataField.cs
│ │ │ │ ├── BaseItemProvider.cs
│ │ │ │ ├── BaseItemTrailerType.cs
│ │ │ │ ├── Chapter.cs
│ │ │ │ ├── CustomItemDisplayPreferences.cs
│ │ │ │ ├── DisplayPreferences.cs
│ │ │ │ ├── Group.cs
│ │ │ │ ├── HomeSection.cs
│ │ │ │ ├── ImageInfo.cs
│ │ │ │ ├── ImageInfoImageType.cs
│ │ │ │ ├── ItemDisplayPreferences.cs
│ │ │ │ ├── ItemValue.cs
│ │ │ │ ├── ItemValueMap.cs
│ │ │ │ ├── ItemValueType.cs
│ │ │ │ ├── KeyframeData.cs
│ │ │ │ ├── Libraries/
│ │ │ │ │ ├── Artwork.cs
│ │ │ │ │ ├── Book.cs
│ │ │ │ │ ├── BookMetadata.cs
│ │ │ │ │ ├── Chapter.cs
│ │ │ │ │ ├── Collection.cs
│ │ │ │ │ ├── CollectionItem.cs
│ │ │ │ │ ├── Company.cs
│ │ │ │ │ ├── CompanyMetadata.cs
│ │ │ │ │ ├── CustomItem.cs
│ │ │ │ │ ├── CustomItemMetadata.cs
│ │ │ │ │ ├── Episode.cs
│ │ │ │ │ ├── EpisodeMetadata.cs
│ │ │ │ │ ├── Genre.cs
│ │ │ │ │ ├── ItemMetadata.cs
│ │ │ │ │ ├── Library.cs
│ │ │ │ │ ├── LibraryItem.cs
│ │ │ │ │ ├── MediaFile.cs
│ │ │ │ │ ├── MediaFileStream.cs
│ │ │ │ │ ├── MetadataProvider.cs
│ │ │ │ │ ├── MetadataProviderId.cs
│ │ │ │ │ ├── Movie.cs
│ │ │ │ │ ├── MovieMetadata.cs
│ │ │ │ │ ├── MusicAlbum.cs
│ │ │ │ │ ├── MusicAlbumMetadata.cs
│ │ │ │ │ ├── Person.cs
│ │ │ │ │ ├── PersonRole.cs
│ │ │ │ │ ├── Photo.cs
│ │ │ │ │ ├── PhotoMetadata.cs
│ │ │ │ │ ├── Rating.cs
│ │ │ │ │ ├── RatingSource.cs
│ │ │ │ │ ├── Release.cs
│ │ │ │ │ ├── Season.cs
│ │ │ │ │ ├── SeasonMetadata.cs
│ │ │ │ │ ├── Series.cs
│ │ │ │ │ ├── SeriesMetadata.cs
│ │ │ │ │ ├── Track.cs
│ │ │ │ │ └── TrackMetadata.cs
│ │ │ │ ├── MediaSegment.cs
│ │ │ │ ├── MediaStreamInfo.cs
│ │ │ │ ├── MediaStreamTypeEntity.cs
│ │ │ │ ├── People.cs
│ │ │ │ ├── PeopleBaseItemMap.cs
│ │ │ │ ├── Permission.cs
│ │ │ │ ├── Preference.cs
│ │ │ │ ├── ProgramAudioEntity.cs
│ │ │ │ ├── Security/
│ │ │ │ │ ├── ApiKey.cs
│ │ │ │ │ ├── Device.cs
│ │ │ │ │ └── DeviceOptions.cs
│ │ │ │ ├── TrickplayInfo.cs
│ │ │ │ ├── User.cs
│ │ │ │ └── UserData.cs
│ │ │ ├── Enums/
│ │ │ │ ├── ArtKind.cs
│ │ │ │ ├── ChromecastVersion.cs
│ │ │ │ ├── DynamicDayOfWeek.cs
│ │ │ │ ├── HomeSectionType.cs
│ │ │ │ ├── IndexingKind.cs
│ │ │ │ ├── MediaFileKind.cs
│ │ │ │ ├── MediaSegmentType.cs
│ │ │ │ ├── PermissionKind.cs
│ │ │ │ ├── PersonRoleType.cs
│ │ │ │ ├── PreferenceKind.cs
│ │ │ │ ├── ScrollDirection.cs
│ │ │ │ ├── SortOrder.cs
│ │ │ │ ├── SubtitlePlaybackMode.cs
│ │ │ │ ├── SyncPlayUserAccessType.cs
│ │ │ │ └── ViewType.cs
│ │ │ ├── IJellyfinDatabaseProvider.cs
│ │ │ ├── Interfaces/
│ │ │ │ ├── IHasArtwork.cs
│ │ │ │ ├── IHasCompanies.cs
│ │ │ │ ├── IHasConcurrencyToken.cs
│ │ │ │ ├── IHasPermissions.cs
│ │ │ │ └── IHasReleases.cs
│ │ │ ├── Jellyfin.Database.Implementations.csproj
│ │ │ ├── JellyfinDatabaseProviderKeyAttribute.cs
│ │ │ ├── JellyfinDbContext.cs
│ │ │ ├── JellyfinQueryHelperExtensions.cs
│ │ │ ├── Locking/
│ │ │ │ ├── IEntityFrameworkCoreLockingBehavior.cs
│ │ │ │ ├── NoLockBehavior.cs
│ │ │ │ ├── OptimisticLockBehavior.cs
│ │ │ │ └── PessimisticLockBehavior.cs
│ │ │ ├── ModelConfiguration/
│ │ │ │ ├── ActivityLogConfiguration.cs
│ │ │ │ ├── AncestorIdConfiguration.cs
│ │ │ │ ├── ApiKeyConfiguration.cs
│ │ │ │ ├── AttachmentStreamInfoConfiguration.cs
│ │ │ │ ├── BaseItemConfiguration.cs
│ │ │ │ ├── BaseItemMetadataFieldConfiguration.cs
│ │ │ │ ├── BaseItemProviderConfiguration.cs
│ │ │ │ ├── BaseItemTrailerTypeConfiguration.cs
│ │ │ │ ├── ChapterConfiguration.cs
│ │ │ │ ├── CustomItemDisplayPreferencesConfiguration.cs
│ │ │ │ ├── DeviceConfiguration.cs
│ │ │ │ ├── DeviceOptionsConfiguration.cs
│ │ │ │ ├── DisplayPreferencesConfiguration.cs
│ │ │ │ ├── ItemValuesConfiguration.cs
│ │ │ │ ├── ItemValuesMapConfiguration.cs
│ │ │ │ ├── KeyframeDataConfiguration.cs
│ │ │ │ ├── MediaStreamInfoConfiguration.cs
│ │ │ │ ├── PeopleBaseItemMapConfiguration.cs
│ │ │ │ ├── PeopleConfiguration.cs
│ │ │ │ ├── PermissionConfiguration.cs
│ │ │ │ ├── PreferenceConfiguration.cs
│ │ │ │ ├── TrickplayInfoConfiguration.cs
│ │ │ │ ├── UserConfiguration.cs
│ │ │ │ └── UserDataConfiguration.cs
│ │ │ ├── ProgressablePartitionReporting.cs
│ │ │ └── QueryPartitionHelpers.cs
│ │ ├── Jellyfin.Database.Providers.Sqlite/
│ │ │ ├── DoNotUseReturningClauseConvention.cs
│ │ │ ├── Jellyfin.Database.Providers.Sqlite.csproj
│ │ │ ├── Migrations/
│ │ │ │ ├── .gitattributes
│ │ │ │ ├── 20200514181226_AddActivityLog.Designer.cs
│ │ │ │ ├── 20200514181226_AddActivityLog.cs
│ │ │ │ ├── 20200613202153_AddUsers.Designer.cs
│ │ │ │ ├── 20200613202153_AddUsers.cs
│ │ │ │ ├── 20200728005145_AddDisplayPreferences.Designer.cs
│ │ │ │ ├── 20200728005145_AddDisplayPreferences.cs
│ │ │ │ ├── 20200905220533_FixDisplayPreferencesIndex.Designer.cs
│ │ │ │ ├── 20200905220533_FixDisplayPreferencesIndex.cs
│ │ │ │ ├── 20201004171403_AddMaxActiveSessions.Designer.cs
│ │ │ │ ├── 20201004171403_AddMaxActiveSessions.cs
│ │ │ │ ├── 20201204223655_AddCustomDisplayPreferences.Designer.cs
│ │ │ │ ├── 20201204223655_AddCustomDisplayPreferences.cs
│ │ │ │ ├── 20210320181425_AddIndexesAndCollations.Designer.cs
│ │ │ │ ├── 20210320181425_AddIndexesAndCollations.cs
│ │ │ │ ├── 20210407110544_NullableCustomPrefValue.Designer.cs
│ │ │ │ ├── 20210407110544_NullableCustomPrefValue.cs
│ │ │ │ ├── 20210814002109_AddDevices.Designer.cs
│ │ │ │ ├── 20210814002109_AddDevices.cs
│ │ │ │ ├── 20221022080052_AddIndexActivityLogsDateCreated.Designer.cs
│ │ │ │ ├── 20221022080052_AddIndexActivityLogsDateCreated.cs
│ │ │ │ ├── 20230526173516_RemoveEasyPassword.Designer.cs
│ │ │ │ ├── 20230526173516_RemoveEasyPassword.cs
│ │ │ │ ├── 20230626233818_AddTrickplayInfos.Designer.cs
│ │ │ │ ├── 20230626233818_AddTrickplayInfos.cs
│ │ │ │ ├── 20230923170422_UserCastReceiver.Designer.cs
│ │ │ │ ├── 20230923170422_UserCastReceiver.cs
│ │ │ │ ├── 20240729140605_AddMediaSegments.Designer.cs
│ │ │ │ ├── 20240729140605_AddMediaSegments.cs
│ │ │ │ ├── 20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs
│ │ │ │ ├── 20240928082930_MarkSegmentProviderIdNonNullable.cs
│ │ │ │ ├── 20241020103111_LibraryDbMigration.Designer.cs
│ │ │ │ ├── 20241020103111_LibraryDbMigration.cs
│ │ │ │ ├── 20241111131257_AddedCustomDataKey.Designer.cs
│ │ │ │ ├── 20241111131257_AddedCustomDataKey.cs
│ │ │ │ ├── 20241111135439_AddedCustomDataKeyKey.Designer.cs
│ │ │ │ ├── 20241111135439_AddedCustomDataKeyKey.cs
│ │ │ │ ├── 20241112152323_FixAncestorIdConfig.Designer.cs
│ │ │ │ ├── 20241112152323_FixAncestorIdConfig.cs
│ │ │ │ ├── 20241112232041_fixMediaStreams.Designer.cs
│ │ │ │ ├── 20241112232041_fixMediaStreams.cs
│ │ │ │ ├── 20241112234144_FixMediaStreams2.Designer.cs
│ │ │ │ ├── 20241112234144_FixMediaStreams2.cs
│ │ │ │ ├── 20241113133548_EnforceUniqueItemValue.Designer.cs
│ │ │ │ ├── 20241113133548_EnforceUniqueItemValue.cs
│ │ │ │ ├── 20250202021306_FixedCollation.Designer.cs
│ │ │ │ ├── 20250202021306_FixedCollation.cs
│ │ │ │ ├── 20250204092455_MakeStartEndDateNullable.Designer.cs
│ │ │ │ ├── 20250204092455_MakeStartEndDateNullable.cs
│ │ │ │ ├── 20250214031148_ChannelIdGuid.Designer.cs
│ │ │ │ ├── 20250214031148_ChannelIdGuid.cs
│ │ │ │ ├── 20250326065026_AddInheritedParentalRatingSubValue.Designer.cs
│ │ │ │ ├── 20250326065026_AddInheritedParentalRatingSubValue.cs
│ │ │ │ ├── 20250327101120_AddKeyframeData.Designer.cs
│ │ │ │ ├── 20250327101120_AddKeyframeData.cs
│ │ │ │ ├── 20250327171413_AddHdr10PlusFlag.Designer.cs
│ │ │ │ ├── 20250327171413_AddHdr10PlusFlag.cs
│ │ │ │ ├── 20250331182844_FixAttachmentMigration.Designer.cs
│ │ │ │ ├── 20250331182844_FixAttachmentMigration.cs
│ │ │ │ ├── 20250401142247_FixAncestors.Designer.cs
│ │ │ │ ├── 20250401142247_FixAncestors.cs
│ │ │ │ ├── 20250405075612_FixItemValuesIndices.Designer.cs
│ │ │ │ ├── 20250405075612_FixItemValuesIndices.cs
│ │ │ │ ├── 20250609115616_DetachUserDataInsteadOfDelete.Designer.cs
│ │ │ │ ├── 20250609115616_DetachUserDataInsteadOfDelete.cs
│ │ │ │ ├── 20250622170802_BaseItemImageInfoDateModifiedNullable.Designer.cs
│ │ │ │ ├── 20250622170802_BaseItemImageInfoDateModifiedNullable.cs
│ │ │ │ ├── 20250714044826_ResetJournalMode.Designer.cs
│ │ │ │ ├── 20250714044826_ResetJournalMode.cs
│ │ │ │ ├── 20250913211637_AddProperParentChildRelationBaseItemWithCascade.Designer.cs
│ │ │ │ ├── 20250913211637_AddProperParentChildRelationBaseItemWithCascade.cs
│ │ │ │ ├── 20250925203415_ExtendPeopleMapKey.Designer.cs
│ │ │ │ ├── 20250925203415_ExtendPeopleMapKey.cs
│ │ │ │ ├── JellyfinDbModelSnapshot.cs
│ │ │ │ └── SqliteDesignTimeJellyfinDbFactory.cs
│ │ │ ├── ModelBuilderExtensions.cs
│ │ │ ├── PragmaConnectionInterceptor.cs
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── SqliteDatabaseProvider.cs
│ │ │ └── ValueConverters/
│ │ │ └── DateTimeKindValueConverter.cs
│ │ └── readme.md
│ ├── Jellyfin.Drawing/
│ │ ├── ImageProcessor.cs
│ │ ├── Jellyfin.Drawing.csproj
│ │ ├── NullImageEncoder.cs
│ │ └── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Jellyfin.Drawing.Skia/
│ │ ├── Jellyfin.Drawing.Skia.csproj
│ │ ├── PercentPlayedDrawer.cs
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── SkiaEncoder.cs
│ │ ├── SkiaExtensions.cs
│ │ ├── SkiaHelper.cs
│ │ ├── SplashscreenBuilder.cs
│ │ ├── StripCollageBuilder.cs
│ │ └── UnplayedCountIndicator.cs
│ ├── Jellyfin.Extensions/
│ │ ├── CopyToExtensions.cs
│ │ ├── DictionaryExtensions.cs
│ │ ├── EnumerableExtensions.cs
│ │ ├── FileHelper.cs
│ │ ├── FormattingStreamWriter.cs
│ │ ├── GuidExtensions.cs
│ │ ├── Jellyfin.Extensions.csproj
│ │ ├── Json/
│ │ │ ├── Converters/
│ │ │ │ ├── JsonBoolNumberConverter.cs
│ │ │ │ ├── JsonBoolStringConverter.cs
│ │ │ │ ├── JsonCommaDelimitedCollectionConverter.cs
│ │ │ │ ├── JsonCommaDelimitedCollectionConverterFactory.cs
│ │ │ │ ├── JsonDateTimeConverter.cs
│ │ │ │ ├── JsonDefaultStringEnumConverter.cs
│ │ │ │ ├── JsonDefaultStringEnumConverterFactory.cs
│ │ │ │ ├── JsonDelimitedCollectionConverter.cs
│ │ │ │ ├── JsonFlagEnumConverter.cs
│ │ │ │ ├── JsonFlagEnumConverterFactory.cs
│ │ │ │ ├── JsonGuidConverter.cs
│ │ │ │ ├── JsonNullableGuidConverter.cs
│ │ │ │ ├── JsonNullableStructConverter.cs
│ │ │ │ ├── JsonNullableStructConverterFactory.cs
│ │ │ │ ├── JsonPipeDelimitedCollectionConverter.cs
│ │ │ │ ├── JsonPipeDelimitedCollectionConverterFactory.cs
│ │ │ │ ├── JsonStringConverter.cs
│ │ │ │ └── JsonVersionConverter.cs
│ │ │ ├── JsonDefaults.cs
│ │ │ └── Utf8JsonExtensions.cs
│ │ ├── ReadOnlyListExtension.cs
│ │ ├── ShuffleExtensions.cs
│ │ ├── SplitStringExtensions.cs
│ │ ├── StreamExtensions.cs
│ │ ├── StringBuilderExtensions.cs
│ │ └── StringExtensions.cs
│ ├── Jellyfin.LiveTv/
│ │ ├── Channels/
│ │ │ ├── ChannelDynamicMediaSourceProvider.cs
│ │ │ ├── ChannelImageProvider.cs
│ │ │ ├── ChannelManager.cs
│ │ │ ├── ChannelPostScanTask.cs
│ │ │ └── RefreshChannelsScheduledTask.cs
│ │ ├── Configuration/
│ │ │ ├── LiveTvConfigurationExtensions.cs
│ │ │ └── LiveTvConfigurationFactory.cs
│ │ ├── DefaultLiveTvService.cs
│ │ ├── Extensions/
│ │ │ └── LiveTvServiceCollectionExtensions.cs
│ │ ├── Guide/
│ │ │ ├── GuideManager.cs
│ │ │ └── RefreshGuideScheduledTask.cs
│ │ ├── IO/
│ │ │ ├── DirectRecorder.cs
│ │ │ ├── EncodedRecorder.cs
│ │ │ ├── ExclusiveLiveStream.cs
│ │ │ ├── IRecorder.cs
│ │ │ └── StreamHelper.cs
│ │ ├── Jellyfin.LiveTv.csproj
│ │ ├── Listings/
│ │ │ ├── EpgChannelData.cs
│ │ │ ├── ListingsManager.cs
│ │ │ ├── SchedulesDirect.cs
│ │ │ ├── SchedulesDirectDtos/
│ │ │ │ ├── BroadcasterDto.cs
│ │ │ │ ├── CaptionDto.cs
│ │ │ │ ├── CastDto.cs
│ │ │ │ ├── ChannelDto.cs
│ │ │ │ ├── ContentRatingDto.cs
│ │ │ │ ├── CrewDto.cs
│ │ │ │ ├── DayDto.cs
│ │ │ │ ├── Description1000Dto.cs
│ │ │ │ ├── Description100Dto.cs
│ │ │ │ ├── DescriptionsProgramDto.cs
│ │ │ │ ├── EventDetailsDto.cs
│ │ │ │ ├── GracenoteDto.cs
│ │ │ │ ├── HeadendsDto.cs
│ │ │ │ ├── ImageDataDto.cs
│ │ │ │ ├── LineupDto.cs
│ │ │ │ ├── LineupsDto.cs
│ │ │ │ ├── LogoDto.cs
│ │ │ │ ├── MapDto.cs
│ │ │ │ ├── MetadataDto.cs
│ │ │ │ ├── MetadataProgramsDto.cs
│ │ │ │ ├── MetadataScheduleDto.cs
│ │ │ │ ├── MovieDto.cs
│ │ │ │ ├── MultipartDto.cs
│ │ │ │ ├── ProgramDetailsDto.cs
│ │ │ │ ├── ProgramDto.cs
│ │ │ │ ├── QualityRatingDto.cs
│ │ │ │ ├── RatingDto.cs
│ │ │ │ ├── RecommendationDto.cs
│ │ │ │ ├── RequestScheduleForChannelDto.cs
│ │ │ │ ├── ShowImagesDto.cs
│ │ │ │ ├── StationDto.cs
│ │ │ │ ├── TitleDto.cs
│ │ │ │ └── TokenDto.cs
│ │ │ └── XmlTvListingsProvider.cs
│ │ ├── LiveTvDtoService.cs
│ │ ├── LiveTvManager.cs
│ │ ├── LiveTvMediaSourceProvider.cs
│ │ ├── Recordings/
│ │ │ ├── RecordingHelper.cs
│ │ │ ├── RecordingNotifier.cs
│ │ │ ├── RecordingsHost.cs
│ │ │ ├── RecordingsManager.cs
│ │ │ └── RecordingsMetadataManager.cs
│ │ ├── Timers/
│ │ │ ├── ItemDataProvider.cs
│ │ │ ├── SeriesTimerManager.cs
│ │ │ └── TimerManager.cs
│ │ └── TunerHosts/
│ │ ├── BaseTunerHost.cs
│ │ ├── HdHomerun/
│ │ │ ├── Channels.cs
│ │ │ ├── DiscoverResponse.cs
│ │ │ ├── HdHomerunChannelCommands.cs
│ │ │ ├── HdHomerunHost.cs
│ │ │ ├── HdHomerunManager.cs
│ │ │ ├── HdHomerunUdpStream.cs
│ │ │ ├── IHdHomerunChannelCommands.cs
│ │ │ └── LegacyHdHomerunChannelCommands.cs
│ │ ├── LiveStream.cs
│ │ ├── M3UTunerHost.cs
│ │ ├── M3uParser.cs
│ │ ├── SharedHttpStream.cs
│ │ └── TunerHostManager.cs
│ ├── Jellyfin.MediaEncoding.Hls/
│ │ ├── Cache/
│ │ │ └── CacheDecorator.cs
│ │ ├── Extensions/
│ │ │ └── MediaEncodingHlsServiceCollectionExtensions.cs
│ │ ├── Extractors/
│ │ │ ├── FfProbeKeyframeExtractor.cs
│ │ │ ├── IKeyframeExtractor.cs
│ │ │ └── MatroskaKeyframeExtractor.cs
│ │ ├── Jellyfin.MediaEncoding.Hls.csproj
│ │ ├── Playlist/
│ │ │ ├── CreateMainPlaylistRequest.cs
│ │ │ ├── DynamicHlsPlaylistGenerator.cs
│ │ │ └── IDynamicHlsPlaylistGenerator.cs
│ │ └── ScheduledTasks/
│ │ └── KeyframeExtractionScheduledTask.cs
│ ├── Jellyfin.MediaEncoding.Keyframes/
│ │ ├── FfProbe/
│ │ │ └── FfProbeKeyframeExtractor.cs
│ │ ├── FfTool/
│ │ │ └── FfToolKeyframeExtractor.cs
│ │ ├── Jellyfin.MediaEncoding.Keyframes.csproj
│ │ ├── KeyframeData.cs
│ │ └── Matroska/
│ │ ├── Extensions/
│ │ │ └── EbmlReaderExtensions.cs
│ │ ├── MatroskaConstants.cs
│ │ ├── MatroskaKeyframeExtractor.cs
│ │ └── Models/
│ │ ├── Info.cs
│ │ └── SeekHead.cs
│ └── Jellyfin.Networking/
│ ├── AutoDiscoveryHost.cs
│ ├── HappyEyeballs/
│ │ └── HttpClientExtension.cs
│ ├── Jellyfin.Networking.csproj
│ ├── Manager/
│ │ └── NetworkManager.cs
│ └── Udp/
│ └── SocketFactory.cs
├── stylecop.json
└── tests/
├── Directory.Build.props
├── Jellyfin.Api.Tests/
│ ├── Auth/
│ │ ├── CustomAuthenticationHandlerTests.cs
│ │ ├── DefaultAuthorizationPolicy/
│ │ │ └── DefaultAuthorizationHandlerTests.cs
│ │ ├── FirstTimeSetupPolicy/
│ │ │ └── FirstTimeSetupHandlerTests.cs
│ │ └── IgnoreSchedulePolicy/
│ │ └── IgnoreScheduleHandlerTests.cs
│ ├── Controllers/
│ │ ├── DynamicHlsControllerTests.cs
│ │ ├── ImageControllerTests.cs
│ │ ├── SystemControllerTests.cs
│ │ └── UserControllerTests.cs
│ ├── Helpers/
│ │ └── RequestHelpersTests.cs
│ ├── Jellyfin.Api.Tests.csproj
│ ├── Middleware/
│ │ └── UrlDecodeQueryFeatureTests.cs
│ ├── ModelBinders/
│ │ ├── CommaDelimitedCollectionModelBinderTests.cs
│ │ ├── PipeDelimitedCollectionModelBinderTests.cs
│ │ └── TestType.cs
│ └── TestHelpers.cs
├── Jellyfin.Common.Tests/
│ ├── Crc32Tests.cs
│ ├── Jellyfin.Common.Tests.csproj
│ └── Providers/
│ └── ProviderIdParserTests.cs
├── Jellyfin.Controller.Tests/
│ ├── BaseItemManagerTests.cs
│ ├── DirectoryServiceTests.cs
│ ├── Entities/
│ │ ├── BaseItemTests.cs
│ │ └── InternalItemsQueryTests.cs
│ └── Jellyfin.Controller.Tests.csproj
├── Jellyfin.Extensions.Tests/
│ ├── CopyToExtensionsTests.cs
│ ├── FileHelperTests.cs
│ ├── FormattingStreamWriterTests.cs
│ ├── Jellyfin.Extensions.Tests.csproj
│ ├── Json/
│ │ ├── Converters/
│ │ │ ├── JsonBoolNumberTests.cs
│ │ │ ├── JsonBoolStringTests.cs
│ │ │ ├── JsonCommaDelimitedCollectionTests.cs
│ │ │ ├── JsonCommaDelimitedIReadOnlyListTests.cs
│ │ │ ├── JsonDefaultStringEnumConverterTests.cs
│ │ │ ├── JsonFlagEnumTests.cs
│ │ │ ├── JsonGuidConverterTests.cs
│ │ │ ├── JsonNullableGuidConverterTests.cs
│ │ │ ├── JsonStringConverterTests.cs
│ │ │ └── JsonVersionConverterTests.cs
│ │ └── Models/
│ │ ├── GenericBodyArrayModel.cs
│ │ ├── GenericBodyIReadOnlyCollectionModel.cs
│ │ ├── GenericBodyIReadOnlyListModel.cs
│ │ └── GenericBodyListModel.cs
│ ├── ShuffleExtensionsTests.cs
│ └── StringExtensionsTests.cs
├── Jellyfin.LiveTv.Tests/
│ ├── HdHomerunHostTests.cs
│ ├── HdHomerunManagerTests.cs
│ ├── Jellyfin.LiveTv.Tests.csproj
│ ├── Listings/
│ │ ├── ListingsManagerTests.cs
│ │ └── XmlTvListingsProviderTests.cs
│ ├── RecordingHelperTests.cs
│ ├── SchedulesDirect/
│ │ └── SchedulesDirectDeserializeTests.cs
│ └── Test Data/
│ ├── LiveTv/
│ │ ├── 10.10.10.100/
│ │ │ ├── discover.json
│ │ │ └── lineup.json
│ │ ├── 192.168.1.182/
│ │ │ ├── discover.json
│ │ │ └── lineup.json
│ │ └── Listings/
│ │ └── XmlTv/
│ │ ├── emptycategory.xml
│ │ └── notitle.xml
│ └── SchedulesDirect/
│ ├── headends_response.json
│ ├── lineup_response.json
│ ├── lineups_response.json
│ ├── metadata_programs_response.json
│ ├── programs_response.json
│ ├── schedules_request.json
│ ├── schedules_response.json
│ ├── token_live_response.json
│ └── token_offline_response.json
├── Jellyfin.MediaEncoding.Hls.Tests/
│ ├── Jellyfin.MediaEncoding.Hls.Tests.csproj
│ └── Playlist/
│ └── DynamicHlsPlaylistGeneratorTests.cs
├── Jellyfin.MediaEncoding.Keyframes.Tests/
│ ├── FfProbe/
│ │ ├── FfProbeKeyframeExtractorTests.cs
│ │ └── Test Data/
│ │ ├── keyframes.txt
│ │ ├── keyframes_result.json
│ │ ├── keyframes_streamduration.txt
│ │ └── keyframes_streamduration_result.json
│ └── Jellyfin.MediaEncoding.Keyframes.Tests.csproj
├── Jellyfin.MediaEncoding.Tests/
│ ├── EncoderValidatorTests.cs
│ ├── EncoderValidatorTestsData.cs
│ ├── Jellyfin.MediaEncoding.Tests.csproj
│ ├── Probing/
│ │ ├── ProbeExternalSourcesTests.cs
│ │ └── ProbeResultNormalizerTests.cs
│ ├── Subtitles/
│ │ ├── AssParserTests.cs
│ │ ├── SrtParserTests.cs
│ │ ├── SsaParserTests.cs
│ │ └── SubtitleEncoderTests.cs
│ └── Test Data/
│ ├── Probing/
│ │ ├── music_metadata.json
│ │ ├── music_video_metadata.json
│ │ ├── music_year_only_metadata.json
│ │ ├── video_interlaced.json
│ │ ├── video_metadata.json
│ │ ├── video_mp4_metadata.json
│ │ ├── video_progressive_no_field_order.json
│ │ ├── video_progressive_no_field_order2.json
│ │ ├── video_single_frame_mjpeg.json
│ │ ├── video_ts.json
│ │ ├── video_web_like_mkv_with_subtitle.json
│ │ └── video_webm.json
│ ├── example.ass
│ ├── example.srt
│ ├── example.ssa
│ └── example2.srt
├── Jellyfin.Model.Tests/
│ ├── Cryptography/
│ │ └── PasswordHashTests.cs
│ ├── Dlna/
│ │ ├── ContainerHelperTests.cs
│ │ ├── LegacyStreamInfo.cs
│ │ ├── StreamBuilderTests.cs
│ │ └── StreamInfoTests.cs
│ ├── Drawing/
│ │ └── ImageFormatExtensionsTests.cs
│ ├── Entities/
│ │ ├── MediaStreamTests.cs
│ │ └── ProviderIdsExtensionsTests.cs
│ ├── Extensions/
│ │ ├── EnumerableExtensionsTests.cs
│ │ └── StringHelperTests.cs
│ ├── Jellyfin.Model.Tests.csproj
│ ├── Net/
│ │ └── MimeTypesTests.cs
│ └── Test Data/
│ ├── DeviceProfile-AndroidPixel.json
│ ├── DeviceProfile-AndroidTVExoPlayer.json
│ ├── DeviceProfile-Chrome-NoHLS.json
│ ├── DeviceProfile-Chrome.json
│ ├── DeviceProfile-DirectMedia.json
│ ├── DeviceProfile-Firefox.json
│ ├── DeviceProfile-JellyfinMediaPlayer.json
│ ├── DeviceProfile-LowBandwidth.json
│ ├── DeviceProfile-Null.json
│ ├── DeviceProfile-RokuSSPlus.json
│ ├── DeviceProfile-RokuSSPlusNext.json
│ ├── DeviceProfile-SafariNext.json
│ ├── DeviceProfile-Tizen3-stereo.json
│ ├── DeviceProfile-Tizen4-4K-5.1.json
│ ├── DeviceProfile-TranscodeMedia.json
│ ├── DeviceProfile-WebOS-23.json
│ ├── DeviceProfile-Yatse.json
│ ├── DeviceProfile-Yatse2.json
│ ├── MediaSourceInfo-mkv-av1-aac-srt-2600k.json
│ ├── MediaSourceInfo-mkv-av1-vorbis-srt-2600k.json
│ ├── MediaSourceInfo-mkv-dvhe.05-eac3-28000k.json
│ ├── MediaSourceInfo-mkv-dvhe.08-eac3-15200k.json
│ ├── MediaSourceInfo-mkv-h264-ac3-srt-2600k.json
│ ├── MediaSourceInfo-mkv-h264-hi10p-aac-5000k-brokenfps.json
│ ├── MediaSourceInfo-mkv-vp9-aac-srt-2600k.json
│ ├── MediaSourceInfo-mkv-vp9-ac3-srt-2600k.json
│ ├── MediaSourceInfo-mkv-vp9-vorbis-srt-2600k.json
│ ├── MediaSourceInfo-mkv-vp9-vorbis-vtt-2600k.json
│ ├── MediaSourceInfo-mp4-dvh1.05-eac3-15200k.json
│ ├── MediaSourceInfo-mp4-dvhe.08-eac3-15200k.json
│ ├── MediaSourceInfo-mp4-h264-aac-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-aac-vtt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aac-aac-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aac-mp3-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aac-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aacDef-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aacExt-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-dts-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-hi10p-aac-5000k.json
│ ├── MediaSourceInfo-mp4-hevc-aac-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-aac-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-aacDef-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-aacExt-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-truehd-srt-15200k.json
│ ├── MediaSourceInfo-no-streams.json
│ ├── MediaSourceInfo-numstreams-32.json
│ ├── MediaSourceInfo-numstreams-33.json
│ └── MediaSourceInfo-raw.json
├── Jellyfin.Naming.Tests/
│ ├── AudioBook/
│ │ ├── AudioBookFileInfoTests.cs
│ │ ├── AudioBookListResolverTests.cs
│ │ └── AudioBookResolverTests.cs
│ ├── Common/
│ │ └── NamingOptionsTest.cs
│ ├── ExternalFiles/
│ │ └── ExternalPathParserTests.cs
│ ├── Jellyfin.Naming.Tests.csproj
│ ├── Music/
│ │ └── MultiDiscAlbumTests.cs
│ ├── TV/
│ │ ├── AbsoluteEpisodeNumberTests.cs
│ │ ├── DailyEpisodeTests.cs
│ │ ├── EpisodeNumberTests.cs
│ │ ├── EpisodeNumberWithoutSeasonTests.cs
│ │ ├── EpisodePathParserTest.cs
│ │ ├── MultiEpisodeTests.cs
│ │ ├── SeasonNumberTests.cs
│ │ ├── SeasonPathParserTests.cs
│ │ ├── SeriesPathParserTest.cs
│ │ ├── SeriesResolverTests.cs
│ │ ├── SimpleEpisodeTests.cs
│ │ └── TvParserHelpersTest.cs
│ └── Video/
│ ├── CleanDateTimeTests.cs
│ ├── CleanStringTests.cs
│ ├── ExtraTests.cs
│ ├── Format3DTests.cs
│ ├── MultiVersionTests.cs
│ ├── StackTests.cs
│ ├── StubTests.cs
│ ├── VideoListResolverTests.cs
│ └── VideoResolverTests.cs
├── Jellyfin.Networking.Tests/
│ ├── Configuration/
│ │ └── NetworkConfigurationTests.cs
│ ├── Jellyfin.Networking.Tests.csproj
│ ├── NetworkExtensionsTests.cs
│ ├── NetworkManagerTests.cs
│ └── NetworkParseTests.cs
├── Jellyfin.Providers.Tests/
│ ├── Jellyfin.Providers.Tests.csproj
│ ├── Lyrics/
│ │ └── LrcLyricParserTests.cs
│ ├── Manager/
│ │ ├── ItemImageProviderTests.cs
│ │ ├── MetadataServiceTests.cs
│ │ └── ProviderManagerTests.cs
│ ├── MediaInfo/
│ │ ├── AudioResolverTests.cs
│ │ ├── EmbeddedImageProviderTests.cs
│ │ ├── FFProbeVideoInfoTests.cs
│ │ ├── MediaInfoResolverTests.cs
│ │ ├── SubtitleResolverTests.cs
│ │ └── VideoImageProviderTests.cs
│ ├── Omdb/
│ │ └── JsonOmdbConverterTests.cs
│ ├── Test Data/
│ │ └── Lyrics/
│ │ └── Fleetwood Mac - Rumors.elrc
│ └── Tmdb/
│ └── TmdbUtilsTests.cs
├── Jellyfin.Server.Implementations.Tests/
│ ├── Cryptography/
│ │ └── CryptographyProviderTests.cs
│ ├── Data/
│ │ ├── SearchPunctuationTests.cs
│ │ └── SqliteItemRepositoryTests.cs
│ ├── EfMigrations/
│ │ └── EfMigrationTests.cs
│ ├── HttpServer/
│ │ └── WebSocketConnectionTests.cs
│ ├── IO/
│ │ └── ManagedFileSystemTests.cs
│ ├── Item/
│ │ ├── BaseItemRepositoryTests.cs
│ │ └── OrderMapperTests.cs
│ ├── Jellyfin.Server.Implementations.Tests.csproj
│ ├── Library/
│ │ ├── AudioResolverTests.cs
│ │ ├── CoreResolutionIgnoreRuleTest.cs
│ │ ├── DotIgnoreIgnoreRuleTest.cs
│ │ ├── EpisodeResolverTest.cs
│ │ ├── IgnorePatternsTests.cs
│ │ ├── LibraryManager/
│ │ │ └── FindExtrasTests.cs
│ │ ├── MediaSourceManagerTests.cs
│ │ ├── MediaStreamSelectorTests.cs
│ │ ├── MovieResolverTests.cs
│ │ └── PathExtensionsTests.cs
│ ├── Localization/
│ │ └── LocalizationManagerTests.cs
│ ├── Playlists/
│ │ └── PlaylistManagerTests.cs
│ ├── Plugins/
│ │ └── PluginManagerTests.cs
│ ├── QuickConnect/
│ │ └── QuickConnectManagerTests.cs
│ ├── SessionManager/
│ │ └── SessionManagerTests.cs
│ ├── Sorting/
│ │ ├── AiredEpisodeOrderComparerTests.cs
│ │ ├── IndexNumberComparerTests.cs
│ │ ├── ParentIndexNumberComparerTests.cs
│ │ └── PremiereDateComparerTests.cs
│ ├── Test Data/
│ │ ├── HttpServer/
│ │ │ ├── ForceKeepAlive.json
│ │ │ ├── Partial.json
│ │ │ └── ValidPartial.json
│ │ └── Updates/
│ │ └── manifest.json
│ ├── TypedBaseItem/
│ │ └── BaseItemKindTests.cs
│ ├── Updates/
│ │ └── InstallationManagerTests.cs
│ └── Users/
│ └── UserManagerTests.cs
├── Jellyfin.Server.Integration.Tests/
│ ├── AuthHelper.cs
│ ├── Controllers/
│ │ ├── ActivityLogControllerTests.cs
│ │ ├── BaseJellyfinTestController.cs
│ │ ├── BrandingControllerTests.cs
│ │ ├── DashboardControllerTests.cs
│ │ ├── EncoderController.cs
│ │ ├── ItemsControllerTests.cs
│ │ ├── LibraryControllerTests.cs
│ │ ├── LibraryStructureControllerTests.cs
│ │ ├── LiveTvControllerTests.cs
│ │ ├── MediaInfoControllerTests.cs
│ │ ├── MediaStructureControllerTests.cs
│ │ ├── MusicGenreControllerTests.cs
│ │ ├── PersonsControllerTests.cs
│ │ ├── PlaystateControllerTests.cs
│ │ ├── PluginsControllerTests.cs
│ │ ├── StartupControllerTests.cs
│ │ ├── UserControllerTests.cs
│ │ ├── UserLibraryControllerTests.cs
│ │ └── VideosControllerTests.cs
│ ├── EncodedQueryStringTest.cs
│ ├── Jellyfin.Server.Integration.Tests.csproj
│ ├── JellyfinApplicationFactory.cs
│ ├── Middleware/
│ │ └── RobotsRedirectionMiddlewareTests.cs
│ ├── OpenApiSpecTests.cs
│ ├── Test Data/
│ │ └── dummy.m3u8
│ ├── TestAppHost.cs
│ ├── TestPage.html
│ ├── TestPlugin.cs
│ ├── TestPluginWithoutPages.cs
│ ├── WebSocketTests.cs
│ └── xunit.runner.json
├── Jellyfin.Server.Tests/
│ ├── Jellyfin.Server.Tests.csproj
│ └── ParseNetworkTests.cs
├── Jellyfin.XbmcMetadata.Tests/
│ ├── Jellyfin.XbmcMetadata.Tests.csproj
│ ├── Location/
│ │ └── MovieNfoLocationTests.cs
│ ├── Parsers/
│ │ ├── EpisodeNfoProviderTests.cs
│ │ ├── MovieNfoParserTests.cs
│ │ ├── MusicAlbumNfoProviderTests.cs
│ │ ├── MusicArtistNfoParserTests.cs
│ │ ├── MusicVideoNfoParserTests.cs
│ │ ├── SeasonNfoProviderTests.cs
│ │ └── SeriesNfoParserTests.cs
│ └── Test Data/
│ ├── American Gods.nfo
│ ├── Dancing Queen.nfo
│ ├── Fanart.nfo
│ ├── Imdb.nfo
│ ├── Justice League.nfo
│ ├── Lilo & Stitch.nfo
│ ├── Radarr.nfo
│ ├── Rising.nfo
│ ├── Season 01.nfo
│ ├── Sonarr-Thumb.nfo
│ ├── Stargate Atlantis S01E01-E04.nfo
│ ├── The Best of 1980-1990.nfo
│ ├── The Bone Orchard.nfo
│ ├── Tmdb.nfo
│ ├── Tvdb.nfo
│ └── U2.nfo
└── coverletArgs.runsettings
================================================
FILE CONTENTS
================================================
================================================
FILE: .config/dotnet-tools.json
================================================
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "10.0.5",
"commands": [
"dotnet-ef"
]
}
}
}
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"name": "Development Jellyfin Server",
"image": "mcr.microsoft.com/devcontainers/dotnet:10.0-noble",
"service": "app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
// restores nuget packages, installs the dotnet workloads and installs the dev https certificate
"postStartCommand": "sudo dotnet restore; sudo dotnet workload update; sudo dotnet dev-certs https --trust; sudo bash \"./.devcontainer/install-ffmpeg.sh\"",
// The previous way of installing extensions via the vs command dont work on selfhosted devcontainers
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csharp",
"editorconfig.editorconfig",
"github.vscode-github-actions",
"ms-dotnettools.vscode-dotnet-runtime",
"ms-dotnettools.csdevkit",
"alexcvzz.vscode-sqlite",
"streetsidesoftware.code-spell-checker",
"eamodio.gitlens",
"redhat.vscode-xml"
]
}
},
"features": {
"ghcr.io/devcontainers/features/dotnet:2": {
"version": "none",
"dotnetRuntimeVersions": "10.0",
"aspNetCoreRuntimeVersions": "10.0"
},
"ghcr.io/devcontainers-extra/features/apt-packages:1": {
"preserve_apt_list": false,
"packages": [
"libfontconfig1"
]
},
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"dockerDashComposeVersion": "v2"
},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/eitsupi/devcontainer-features/jq-likes:2": {}
},
"hostRequirements": {
"memory": "8gb",
"cpus": 4
}
}
================================================
FILE: .devcontainer/install-ffmpeg.sh
================================================
#!/bin/bash
## configure the following for a manual install of a specific version from the repo
# wget https://repo.jellyfin.org/releases/server/ubuntu/versions/jellyfin-ffmpeg/6.0.1-1/jellyfin-ffmpeg6_6.0.1-1-jammy_amd64.deb -O ffmpeg.deb
# sudo apt update
# sudo apt install -f ./ffmpeg.deb -y
# rm ffmpeg.deb
## Add the jellyfin repo
sudo apt install curl gnupg -y
sudo apt-get install software-properties-common -y
sudo add-apt-repository universe -y
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
export VERSION_OS="$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release )"
export VERSION_CODENAME="$( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release )"
export DPKG_ARCHITECTURE="$( dpkg --print-architecture )"
cat <<EOF | sudo tee /etc/apt/sources.list.d/jellyfin.sources
Types: deb
URIs: https://repo.jellyfin.org/${VERSION_OS}
Suites: ${VERSION_CODENAME}
Components: main
Architectures: ${DPKG_ARCHITECTURE}
Signed-By: /etc/apt/keyrings/jellyfin.gpg
EOF
sudo apt update -y
sudo apt install jellyfin-ffmpeg7 -y
================================================
FILE: .dockerignore
================================================
.git
.dockerignore
Dockerfile
Dockerfile.arm
Dockerfile.arm64
CONTRIBUTORS.md
README.md
deployment/*/dist
deployment/*/pkg-dist
deployment/collect-dist/
ci/
================================================
FILE: .editorconfig
================================================
# With more recent updates Visual Studio 2017 supports EditorConfig files out of the box
# Visual Studio Code needs an extension: https://github.com/editorconfig/editorconfig-vscode
# For emacs, vim, np++ and other editors, see here: https://github.com/editorconfig
###############################
# Core EditorConfig Options #
###############################
root = true
# All files
[*]
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf
max_line_length = off
# YAML indentation
[*.{yml,yaml}]
indent_size = 2
# XML indentation
[*.{csproj,xml}]
indent_size = 2
###############################
# .NET Coding Conventions #
###############################
[*.{cs,vb}]
# Organize usings
dotnet_sort_system_directives_first = true
# this. preferences
dotnet_style_qualification_for_field = false:silent
dotnet_style_qualification_for_property = false:silent
dotnet_style_qualification_for_method = false:silent
dotnet_style_qualification_for_event = false:silent
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
dotnet_style_predefined_type_for_member_access = true:silent
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
dotnet_style_readonly_field = true:suggestion
# Expression-level preferences
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
###############################
# Naming Conventions #
###############################
# Style Definitions (From Roslyn)
# Non-private static fields are PascalCase
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields
dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style
dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field
dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected
dotnet_naming_symbols.non_private_static_fields.required_modifiers = static
dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case
# Constants are PascalCase
dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants
dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style
dotnet_naming_symbols.constants.applicable_kinds = field, local
dotnet_naming_symbols.constants.required_modifiers = const
dotnet_naming_style.constant_style.capitalization = pascal_case
# Static fields are camelCase and start with s_
dotnet_naming_rule.static_fields_should_be_camel_case.severity = suggestion
dotnet_naming_rule.static_fields_should_be_camel_case.symbols = static_fields
dotnet_naming_rule.static_fields_should_be_camel_case.style = static_field_style
dotnet_naming_symbols.static_fields.applicable_kinds = field
dotnet_naming_symbols.static_fields.required_modifiers = static
dotnet_naming_style.static_field_style.capitalization = camel_case
dotnet_naming_style.static_field_style.required_prefix = _
# Instance fields are camelCase and start with _
dotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion
dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields
dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style
dotnet_naming_symbols.instance_fields.applicable_kinds = field
dotnet_naming_style.instance_field_style.capitalization = camel_case
dotnet_naming_style.instance_field_style.required_prefix = _
# Locals and parameters are camelCase
dotnet_naming_rule.locals_should_be_camel_case.severity = suggestion
dotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters
dotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style
dotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local
dotnet_naming_style.camel_case_style.capitalization = camel_case
# Local functions are PascalCase
dotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions
dotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style
dotnet_naming_symbols.local_functions.applicable_kinds = local_function
dotnet_naming_style.local_function_style.capitalization = pascal_case
# By default, name items with PascalCase
dotnet_naming_rule.members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.members_should_be_pascal_case.symbols = all_members
dotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.all_members.applicable_kinds = *
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
###############################
# C# Coding Conventions #
###############################
[*.cs]
# var preferences
csharp_style_var_for_built_in_types = true:silent
csharp_style_var_when_type_is_apparent = true:silent
csharp_style_var_elsewhere = true:silent
# Expression-bodied members
csharp_style_expression_bodied_methods = false:silent
csharp_style_expression_bodied_constructors = false:silent
csharp_style_expression_bodied_operators = false:silent
csharp_style_expression_bodied_properties = true:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_accessors = true:silent
# Pattern matching preferences
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
# Null-checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Modifier preferences
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
# Expression-level preferences
csharp_prefer_braces = true:silent
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
###############################
# C# Formatting Rules #
###############################
# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
# Space preferences
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
# Wrapping preferences
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
###############################
# C# Analyzer Rules #
###############################
### ERROR #
###########
# error on SA1000: The keyword 'new' should be followed by a space
dotnet_diagnostic.SA1000.severity = error
# error on SA1001: Commas should not be preceded by whitespace
dotnet_diagnostic.SA1001.severity = error
# error on SA1106: Code should not contain empty statements
dotnet_diagnostic.SA1106.severity = error
# error on SA1107: Code should not contain multiple statements on one line
dotnet_diagnostic.SA1107.severity = error
# error on SA1028: Code should not contain trailing whitespace
dotnet_diagnostic.SA1028.severity = error
# error on SA1117: The parameters should all be placed on the same line or each parameter should be placed on its own line
dotnet_diagnostic.SA1117.severity = error
# error on SA1137: Elements should have the same indentation
dotnet_diagnostic.SA1137.severity = error
# error on SA1142: Refer to tuple fields by name
dotnet_diagnostic.SA1142.severity = error
# error on SA1210: Using directives should be ordered alphabetically by the namespaces
dotnet_diagnostic.SA1210.severity = error
# error on SA1316: Tuple element names should use correct casing
dotnet_diagnostic.SA1316.severity = error
# error on SA1414: Tuple types in signatures should have element names
dotnet_diagnostic.SA1414.severity = error
# disable warning SA1513: Closing brace should be followed by blank line
dotnet_diagnostic.SA1513.severity = error
# error on SA1518: File is required to end with a single newline character
dotnet_diagnostic.SA1518.severity = error
# error on SA1629: Documentation text should end with a period
dotnet_diagnostic.SA1629.severity = error
# error on CA1001: Types that own disposable fields should be disposable
dotnet_diagnostic.CA1001.severity = error
# error on CA1012: Abstract types should not have public constructors
dotnet_diagnostic.CA1012.severity = error
# error on CA1063: Implement IDisposable correctly
dotnet_diagnostic.CA1063.severity = error
# error on CA1305: Specify IFormatProvider
dotnet_diagnostic.CA1305.severity = error
# error on CA1307: Specify StringComparison for clarity
dotnet_diagnostic.CA1307.severity = error
# error on CA1309: Use ordinal StringComparison
dotnet_diagnostic.CA1309.severity = error
# error on CA1310: Specify StringComparison for correctness
dotnet_diagnostic.CA1310.severity = error
# error on CA1513: Use 'ObjectDisposedException.ThrowIf' instead of explicitly throwing a new exception instance
dotnet_diagnostic.CA1513.severity = error
# error on CA1725: Parameter names should match base declaration
dotnet_diagnostic.CA1725.severity = error
# error on CA1725: Call async methods when in an async method
dotnet_diagnostic.CA1727.severity = error
# error on CA1813: Avoid unsealed attributes
dotnet_diagnostic.CA1813.severity = error
# error on CA1834: Use 'StringBuilder.Append(char)' instead of 'StringBuilder.Append(string)' when the input is a constant unit string
dotnet_diagnostic.CA1834.severity = error
# error on CA1843: Do not use 'WaitAll' with a single task
dotnet_diagnostic.CA1843.severity = error
# error on CA1845: Use span-based 'string.Concat'
dotnet_diagnostic.CA1845.severity = error
# error on CA1849: Call async methods when in an async method
dotnet_diagnostic.CA1849.severity = error
# error on CA1851: Possible multiple enumerations of IEnumerable collection
dotnet_diagnostic.CA1851.severity = error
# error on CA1854: Prefer a 'TryGetValue' call over a Dictionary indexer access guarded by a 'ContainsKey' check to avoid double lookup
dotnet_diagnostic.CA1854.severity = error
# error on CA1860: Avoid using 'Enumerable.Any()' extension method
dotnet_diagnostic.CA1860.severity = error
# error on CA1861: Avoid constant arrays as arguments
dotnet_diagnostic.CA1861.severity = error
# error on CA1862: Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
dotnet_diagnostic.CA1862.severity = error
# error on CA1863: Use 'CompositeFormat'
dotnet_diagnostic.CA1863.severity = error
# error on CA1864: Prefer the 'IDictionary.TryAdd(TKey, TValue)' method
dotnet_diagnostic.CA1864.severity = error
# error on CA1865-CA1867: Use 'string.Method(char)' instead of 'string.Method(string)' for string with single char
dotnet_diagnostic.CA1865.severity = error
dotnet_diagnostic.CA1866.severity = error
dotnet_diagnostic.CA1867.severity = error
# error on CA1868: Unnecessary call to 'Contains' for sets
dotnet_diagnostic.CA1868.severity = error
# error on CA1869: Cache and reuse 'JsonSerializerOptions' instances
dotnet_diagnostic.CA1869.severity = error
# error on CA1870: Use a cached 'SearchValues' instance
dotnet_diagnostic.CA1870.severity = error
# error on CA1871: Do not pass a nullable struct to 'ArgumentNullException.ThrowIfNull'
dotnet_diagnostic.CA1871.severity = error
# error on CA1872: Prefer 'Convert.ToHexString' and 'Convert.ToHexStringLower' over call chains based on 'BitConverter.ToString'
dotnet_diagnostic.CA1872.severity = error
# error on CA2016: Forward the CancellationToken parameter to methods that take one
# or pass in 'CancellationToken.None' explicitly to indicate intentionally not propagating the token
dotnet_diagnostic.CA2016.severity = error
# error on CA2201: Exception type System.Exception is not sufficiently specific
dotnet_diagnostic.CA2201.severity = error
# error on CA2215: Dispose methods should call base class dispose
dotnet_diagnostic.CA2215.severity = error
# error on CA2249: Use 'string.Contains' instead of 'string.IndexOf' to improve readability
dotnet_diagnostic.CA2249.severity = error
# error on CA2254: Template should be a static expression
dotnet_diagnostic.CA2254.severity = error
################
### SUGGESTION #
################
# disable warning CA1014: Mark assemblies with CLSCompliantAttribute
dotnet_diagnostic.CA1014.severity = suggestion
# disable warning CA1024: Use properties where appropriate
dotnet_diagnostic.CA1024.severity = suggestion
# disable warning CA1031: Do not catch general exception types
dotnet_diagnostic.CA1031.severity = suggestion
# disable warning CA1032: Implement standard exception constructors
dotnet_diagnostic.CA1032.severity = suggestion
# disable warning CA1040: Avoid empty interfaces
dotnet_diagnostic.CA1040.severity = suggestion
# disable warning CA1062: Validate arguments of public methods
dotnet_diagnostic.CA1062.severity = suggestion
# TODO: enable when false positives are fixed
# disable warning CA1508: Avoid dead conditional code
dotnet_diagnostic.CA1508.severity = suggestion
# disable warning CA1515: Consider making public types internal
dotnet_diagnostic.CA1515.severity = suggestion
# disable warning CA1716: Identifiers should not match keywords
dotnet_diagnostic.CA1716.severity = suggestion
# disable warning CA1720: Identifiers should not contain type names
dotnet_diagnostic.CA1720.severity = suggestion
# disable warning CA1724: Type names should not match namespaces
dotnet_diagnostic.CA1724.severity = suggestion
# disable warning CA1873: Avoid potentially expensive logging
dotnet_diagnostic.CA1873.severity = suggestion
# disable warning CA1805: Do not initialize unnecessarily
dotnet_diagnostic.CA1805.severity = suggestion
# disable warning CA1812: internal class that is apparently never instantiated.
# If so, remove the code from the assembly.
# If this class is intended to contain only static members, make it static
dotnet_diagnostic.CA1812.severity = suggestion
# disable warning CA1822: Member does not access instance data and can be marked as static
dotnet_diagnostic.CA1822.severity = suggestion
# CA1859: Use concrete types when possible for improved performance
dotnet_diagnostic.CA1859.severity = suggestion
# TODO: Enable
# CA1861: Prefer 'static readonly' fields over constant array arguments if the called method is called repeatedly and is not mutating the passed array
dotnet_diagnostic.CA1861.severity = suggestion
# disable warning CA2000: Dispose objects before losing scope
dotnet_diagnostic.CA2000.severity = suggestion
# TODO: Reevaluate when false positives are fixed: https://github.com/dotnet/roslyn-analyzers/issues/7699
# disable warning CA2025: Do not pass 'IDisposable' instances into unawaited tasks
dotnet_diagnostic.CA2025.severity = suggestion
# disable warning CA2253: Named placeholders should not be numeric values
dotnet_diagnostic.CA2253.severity = suggestion
# disable warning CA5394: Do not use insecure randomness
dotnet_diagnostic.CA5394.severity = suggestion
# error on CA3003: Review code for file path injection vulnerabilities
dotnet_diagnostic.CA3003.severity = suggestion
# error on CA3006: Review code for process command injection vulnerabilities
dotnet_diagnostic.CA3006.severity = suggestion
###############
### DISABLED #
###############
# disable warning SA1009: Closing parenthesis should be followed by a space.
dotnet_diagnostic.SA1009.severity = none
# disable warning SA1011: Closing square bracket should be followed by a space.
dotnet_diagnostic.SA1011.severity = none
# disable warning SA1101: Prefix local calls with 'this.'
dotnet_diagnostic.SA1101.severity = none
# disable warning SA1108: Block statements should not contain embedded comments
dotnet_diagnostic.SA1108.severity = none
# disable warning SA1118: Parameter must not span multiple lines.
dotnet_diagnostic.SA1118.severity = none
# disable warning SA1128:: Put constructor initializers on their own line
dotnet_diagnostic.SA1128.severity = none
# disable warning SA1130: Use lambda syntax
dotnet_diagnostic.SA1130.severity = none
# disable warning SA1200: 'using' directive must appear within a namespace declaration
dotnet_diagnostic.SA1200.severity = none
# disable warning SA1202: 'public' members must come before 'private' members
dotnet_diagnostic.SA1202.severity = none
# disable warning SA1204: Static members must appear before non-static members
dotnet_diagnostic.SA1204.severity = none
# disable warning SA1309: Fields must not begin with an underscore
dotnet_diagnostic.SA1309.severity = none
# disable warning SA1311: Static readonly fields should begin with upper-case letter
dotnet_diagnostic.SA1311.severity = none
# disable warning SA1413: Use trailing comma in multi-line initializers
dotnet_diagnostic.SA1413.severity = none
# disable warning SA1512: Single-line comments must not be followed by blank line
dotnet_diagnostic.SA1512.severity = none
# disable warning SA1515: Single-line comment should be preceded by blank line
dotnet_diagnostic.SA1515.severity = none
# disable warning SA1600: Elements should be documented
dotnet_diagnostic.SA1600.severity = none
# disable warning SA1601: Partial elements should be documented
dotnet_diagnostic.SA1601.severity = none
# disable warning SA1602: Enumeration items should be documented
dotnet_diagnostic.SA1602.severity = none
# disable warning SA1633: The file header is missing or not located at the top of the file
dotnet_diagnostic.SA1633.severity = none
# disable warning CA1054: Change the type of parameter url from string to System.Uri
dotnet_diagnostic.CA1054.severity = none
# disable warning CA1055: URI return values should not be strings
dotnet_diagnostic.CA1055.severity = none
# disable warning CA1056: URI properties should not be strings
dotnet_diagnostic.CA1056.severity = none
# disable warning CA1303: Do not pass literals as localized parameters
dotnet_diagnostic.CA1303.severity = none
# disable warning CA1308: Normalize strings to uppercase
dotnet_diagnostic.CA1308.severity = none
# disable warning CA1848: Use the LoggerMessage delegates
dotnet_diagnostic.CA1848.severity = none
# disable warning CA2101: Specify marshaling for P/Invoke string arguments
dotnet_diagnostic.CA2101.severity = none
# disable warning CA2234: Pass System.Uri objects instead of strings
dotnet_diagnostic.CA2234.severity = none
# error on RS0030: Do not used banned APIs
dotnet_diagnostic.RS0030.severity = error
# disable warning IDISP001: Dispose created
dotnet_diagnostic.IDISP001.severity = suggestion
# TODO: Enable when false positives are fixed
# disable warning IDISP003: Dispose previous before re-assigning
dotnet_diagnostic.IDISP003.severity = suggestion
# disable warning IDISP004: Don't ignore created IDisposable
dotnet_diagnostic.IDISP004.severity = suggestion
# disable warning IDISP007: Don't dispose injected
dotnet_diagnostic.IDISP007.severity = suggestion
# disable warning IDISP008: Don't assign member with injected and created disposables
dotnet_diagnostic.IDISP008.severity = suggestion
[tests/**.{cs,vb}]
# disable warning SA0001: XML comment analysis is disabled due to project configuration
dotnet_diagnostic.SA0001.severity = none
# disable warning CA1707: Identifiers should not contain underscores
dotnet_diagnostic.CA1707.severity = none
# disable warning CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = none
# disable warning CA2234: Pass system uri objects instead of strings
dotnet_diagnostic.CA2234.severity = suggestion
# disable warning xUnit1028: Test methods must have a supported return type.
dotnet_diagnostic.xUnit1028.severity = none
# CA1826: Do not use Enumerable methods on indexable collections
dotnet_diagnostic.CA1826.severity = suggestion
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
*.png binary
*.jpg binary
CONTRIBUTORS.md merge=union
================================================
FILE: .github/CODEOWNERS
================================================
# Joshua must review all changes to bump_version and any files it touches
bump_version @joshuaboniface
.github/ISSUE_TEMPLATE @joshuaboniface
MediaBrowser.Common/MediaBrowser.Common.csproj @joshuaboniface
Jellyfin.Data/Jellyfin.Data.csproj @joshuaboniface
MediaBrowser.Controller/MediaBrowser.Controller.csproj @joshuaboniface
MediaBrowser.Model/MediaBrowser.Model.csproj @joshuaboniface
Emby.Naming/Emby.Naming.csproj @joshuaboniface
src/Jellyfin.Extensions/Jellyfin.Extensions.csproj @joshuaboniface
# Core must approve all changes within the repo config
.github/ @jellyfin/core
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature Request
about: Request a new feature
title: ''
labels: feature-request
assignees: ''
---
**PLEASE DO NOT OPEN FEATURE REQUEST ISSUES ON GITHUB**
**Feature requests should be opened on our dedicated [feature request](https://features.jellyfin.org/) hub so they can be appropriately discussed and prioritized.**
However, if you are willing to contribute to the project by adding a new feature yourself, then please ensure that you first review our [documentation](https://docs.jellyfin.org/general/contributing/development.html) on contributing code. Once you have reviewed the documentation, feel free to come back here and open an issue here outlining your proposed approach so that it can be documented, tracked, and discussed by other team members.
================================================
FILE: .github/ISSUE_TEMPLATE/issue report.yml
================================================
name: Issue Report
description: File an issue report
labels: [bug, triage]
type: Bug
body:
- type: markdown
id: introduction
attributes:
value: |
### Thank you for taking the time to report an issue!
Please keep in mind that Jellyfin is a [free and open-source](https://jellyfin.org/docs/general/about) project, made up entirely and exclusively of **volunteers** who donate their free time to the project.
- type: checkboxes
id: before-posting
attributes:
label: "This issue respects the following points:"
description: All conditions are **required**. Failure to comply with any of these conditions may cause your issue to be closed without comment.
options:
- label: This is a **bug**, not a question or a configuration issue; Please visit our [forum or chat rooms](https://jellyfin.org/contact/) first to troubleshoot with volunteers, before creating a report.
required: true
- label: This issue is **not** already reported on [GitHub](https://github.com/jellyfin/jellyfin/issues?q=is%3Aopen+is%3Aissue) _(I've searched it)_.
required: true
- label: I'm using an up to date version of Jellyfin Server stable, unstable or master; We generally do not support previous older versions. If possible, please update to the latest version before opening an issue.
required: true
- label: I agree to follow Jellyfin's [Code of Conduct](https://jellyfin.org/docs/general/community-standards.html#code-of-conduct).
required: true
- label: This report addresses only a single issue; If you encounter multiple issues, kindly create separate reports for each one.
required: true
- type: markdown
id: preliminary-information
attributes:
value: |
### General preliminary information
Please keep the following in mind when creating this issue:
1. Fill in as much of the template as possible. When you are unsure about the relevancy of a section, do include the information requested in that section. Only leave out information in sections when you are completely sure about it not being relevant.
2. Provide as much detail as possible. Do not assume other people to know what is going on.
3. Keep everything readable and structured. Nobody enjoys reading poorly written reports that are difficult to understand.
4. Keep an eye on your report as long as it is open, your involvement might be requested at a later moment.
5. Keep the title short and descriptive. The title is not the place to write down a full description of the issue.
6. When deciding to leave out information in a field, leave it blank and empty. Avoid writing things such as `n/a` for empty fields.
- type: textarea
id: bug-description
attributes:
label: Description of the bug
description: Please provide a detailed description on the bug you encountered, in a readable and comprehensible way.
placeholder: |
After upgrading to version x.y.z of Jellyfin, the "login disclaimer" is showing incorrect text. It appears to me that it is appending the server name to the end of the login disclaimer, and showing that to a user. It might be a regression from pull request x. I have tried rebooting my host as well as my container multiple times. I tested this functionality on different clients, and it happens to all the tested clients (client x, y, z), that support the login disclaimer functionality. This makes me believe it is a server side issue.
validations:
required: true
- type: textarea
id: repro-steps
attributes:
label: Reproduction steps
description: Reproduction steps should be complete and self-contained. Anyone can reproduce this issue by following these steps. Furthermore, the steps should be clear and easy to follow.
placeholder: |
1. Sign in on the Jellyfin web client, with an admin account, using a browser of your choice.
2. Navigate to the dashboard.
3. Select "general".
4. Change the login disclaimer to something like "I am a cool disclaimer!"
5. Save the settings.
6. Sign out.
7. Make sure you are on the sign in screen. Otherwise, navigate to the sign in screen manually.
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: What is the current _bug_ behavior?
description: Write down the incorrect behavior that currently happens after following the reproduction steps.
placeholder: |
The login disclaimer on the sign in screen has the server name appended to the text. The text shown is: "I am a cool disclaimer!jellyfinserver".
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: What is the expected _correct_ behavior?
description: Write down the correct expected behavior that is supposed to happen after following the reproduction steps.
placeholder: |
The login disclaimer on the sign in screen should only show the configured text. The text that should be shown is: "I am a cool disclaimer!".
validations:
required: true
- type: dropdown
id: version
attributes:
label: Jellyfin Server version
description: What version of Jellyfin are you using?
options:
- 10.11.6
- 10.11.5
- 10.11.4
- 10.11.3
- 10.11.2
- 10.11.1
- 10.11.0
- Master
- Unstable
- Older*
validations:
required: true
- type: input
id: version-master
attributes:
label: "Specify commit id"
description: Fill in this field in case the option 'master' is selected. Provide the commit id it was built on.
placeholder: |
610e56baafc3011e1bfa043bdabb567bda0c2ab0
- type: input
id: version-unstable
attributes:
label: "Specify unstable release number"
description: Fill in this field in case the option 'unstable' is selected. Provide the unstable release number.
placeholder: |
2024050906
- type: input
id: version-older
attributes:
label: "Specify version number"
description: Fill in this field in case the option 'older' is selected. Provide the version number.
placeholder: |
x.y.z
- type: input
id: build-version
attributes:
label: "Specify the build version"
description: Please provide the build version that is shown in the dashboard.
validations:
required: true
- type: textarea
id: environment-information
attributes:
label: Environment
description: |
Accurately fill in as much environment details as possible. If a certain environment field is not shown in the template below, but you consider useful information, please include it.
Examples:
- **OS**: [e.g. Debian 11, Windows 10]
- **Linux Kernel**: [e.g. none, 5.15, 6.1, etc.]
- **Virtualization**: [e.g. Docker, KVM, LXC]
- **Clients**: [Browser, Android, Fire Stick, etc.]
- **Browser**: [e.g. Firefox 91, Chrome 93, Safari 13]
- **FFmpeg Version**: [e.g. 5.1.2-Jellyfin]
- **Playback**: [Direct Play, Remux, Direct Stream, Transcode]
- **Hardware Acceleration**: [e.g. none, VAAPI, NVENC, etc.]
- **CPU Model**: [e.g. AMD Ryzen 5 9600X, Intel Core i7-8565U, etc.]
- **GPU Model**: [e.g. none, UHD630, GTX1050, etc.]
- **Installed Plugins**: [e.g. none, Fanart, Anime, etc.]
- **Reverse Proxy**: [e.g. none, nginx, apache, etc.]
- **Base URL**: [e.g. none, yes: /example]
- **Networking**: [e.g. Host, Bridge/NAT]
- **Jellyfin Data Storage & Filesystem**: [e.g. local SATA SSD - ext4, local HDD - NTFS]
- **Media Storage & Filesystem**: [e.g. Local HDD - ext4, SMB Share]
- **External Integrations**: [e.g. Jellystat, Jellyseerr]
value: |
- OS:
- Linux Kernel:
- Virtualization:
- Clients:
- Browser:
- FFmpeg Version:
- Playback Method:
- Hardware Acceleration:
- CPU Model:
- GPU Model:
- Plugins:
- Reverse Proxy:
- Base URL:
- Networking:
- Jellyfin Data Storage & Filesystem:
- Media Storage & Filesystem:
- External Integrations:
render: markdown
validations:
required: true
- type: markdown
id: general-information-logs
attributes:
value: |
When providing logs, please keep the following things in mind:
1. **DO NOT** use external paste services. If logs are too large to paste into the field, upload them as text files.
2. Please provide complete logs.
- For server logs, ensure to capture all relevant information, encompassing both the events leading up to and following the occurrence of the issue. Typically, providing 10 *lines preceding and succeeding* the problem should be adequate.
- For ffmpeg logs, please provide the entire file unmodified.
3. Please do not run logs through any translation program. We exclusively accept raw, untranslated logs. Particularly exercise caution if your browser automatically translates pages by default.
- Do not forget to censor out personal information such as public IP addresses.
4. Please do not include logs as screenshots, with the only exception being client logs in browsers.
- type: textarea
id: jellyfin-logs
attributes:
label: Jellyfin logs
description: Please copy and paste any relevant log output. This can be found in Dashboard > Logs.
render: shell
validations:
required: true
- type: textarea
id: ffmpeg-logs
attributes:
label: FFmpeg logs
description: Relevant FFmpeg log output. This can be found in Dashboard > Logs > FFmpeg*.log. This field is considered mandatory for transcoding related issues. It's also important to include the specific codec details.
render: shell
- type: textarea
id: browser-logs
attributes:
label: Client / Browser logs
description: Access browser logs by using the F12 to bring up the console. Screenshots are typically easier to read than raw logs. For clients such as Android or iOS, please see our documentation.
- type: textarea
id: screenshots
attributes:
label: Relevant screenshots or videos
description: Attach relevant screenshots or videos related to this report.
- type: textarea
id: additional-information
attributes:
label: Additional information
description: Any additional information that might be useful to this issue.
================================================
FILE: .github/pull_request_template.md
================================================
<!--
Ensure your title is short, descriptive, and in the imperative mood (Fix X, Change Y, instead of Fixed X, Changed Y).
For a good inspiration of what to write in commit messages and PRs please review https://chris.beams.io/posts/git-commit/ and our documentation.
-->
**Changes**
<!-- Describe your changes here in 1-5 sentences. -->
**Issues**
<!-- Tag any issues that this PR solves here.
ex. Fixes # -->
================================================
FILE: .github/renovate.json
================================================
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"github>jellyfin/.github//renovate-presets/dotnet"
]
}
================================================
FILE: .github/workflows/ci-codeql-analysis.yml
================================================
name: "CodeQL"
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
schedule:
- cron: '24 2 * * 4'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
dotnet-version: '10.0.x'
- name: Initialize CodeQL
uses: github/codeql-action/init@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0
with:
languages: ${{ matrix.language }}
queries: +security-extended
- name: Autobuild
uses: github/codeql-action/autobuild@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@b1bff81932f5cdfc8695c7752dcee935dcd061c8 # v4.33.0
================================================
FILE: .github/workflows/ci-compat.yml
================================================
name: ABI Compatibility
on:
pull_request:
permissions: {}
jobs:
abi-head:
name: ABI - HEAD
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
dotnet-version: '10.0.x'
- name: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: abi-head
retention-days: 14
if-no-files-found: error
path: out/
abi-base:
name: ABI - BASE
if: ${{ github.base_ref != '' }}
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
dotnet-version: '10.0.x'
- name: Checkout common ancestor
env:
HEAD_REF: ${{ github.head_ref }}
run: |
git remote add upstream https://github.com/${{ github.event.pull_request.base.repo.full_name }}
git -c protocol.version=2 fetch --prune --progress --no-recurse-submodules upstream +refs/heads/*:refs/remotes/upstream/* +refs/tags/*:refs/tags/*
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
git checkout --progress --force $ANCESTOR_REF
- name: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: abi-base
retention-days: 14
if-no-files-found: error
path: out/
abi-diff:
permissions:
pull-requests: write # to create or update comment (peter-evans/create-or-update-comment)
name: ABI - Difference
if: ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
needs:
- abi-head
- abi-base
steps:
- name: Download abi-head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: abi-head
path: abi-head
- name: Download abi-base
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: abi-base
path: abi-base
- name: Setup ApiCompat
run: |
dotnet tool install --global Microsoft.DotNet.ApiCompat.Tool
- name: Run ApiCompat
id: diff
run: |
{
echo 'body<<EOF'
for file in Jellyfin.Data.dll MediaBrowser.Common.dll MediaBrowser.Controller.dll MediaBrowser.Model.dll Emby.Naming.dll Jellyfin.Extensions.dll Jellyfin.MediaEncoding.Keyframes.dll Jellyfin.Database.Implementations.dll; do
COMPAT_OUTPUT="$( { apicompat --left ./abi-base/${file} --right ./abi-head/${file}; } 2>&1 || true )"
if [ "APICompat ran successfully without finding any breaking changes." != "${COMPAT_OUTPUT}" ]; then
printf "\n${file}\n${COMPAT_OUTPUT}\n"
fi
done
echo EOF
} >> $GITHUB_OUTPUT
- name: Find difference comment
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0
id: find-comment
with:
issue-number: ${{ github.event.pull_request.number }}
direction: last
body-includes: abi-diff-workflow-comment
- name: Reply or edit difference comment (changed)
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
if: ${{ steps.diff.outputs.body != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
token: ${{ secrets.JF_BOT_TOKEN }}
body: |
<!--abi-diff-workflow-comment-->
<details>
<summary>ABI Difference</summary>
```
${{ steps.diff.outputs.body }}
```
</details>
- name: Reply or edit difference comment (unchanged)
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
if: ${{ steps.diff.outputs.body == '' && steps.find-comment.outputs.comment-id != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
token: ${{ secrets.JF_BOT_TOKEN }}
body: |
<!--abi-diff-workflow-comment-->
<details>
<summary>ABI Difference</summary>
No changes to the ABI found. See history of this comment for previous changes.
</details>
================================================
FILE: .github/workflows/ci-openapi.yml
================================================
name: OpenAPI
on:
push:
branches:
- master
tags:
- 'v*'
pull_request:
permissions: {}
jobs:
openapi-head:
name: OpenAPI - HEAD
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
dotnet-version: '10.0.x'
- name: Generate openapi.json
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
- name: Upload openapi.json
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: openapi-head
retention-days: 14
if-no-files-found: error
path: tests/Jellyfin.Server.Integration.Tests/bin/Release/net10.0/openapi.json
openapi-base:
name: OpenAPI - BASE
if: ${{ github.base_ref != '' }}
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Checkout common ancestor
env:
HEAD_REF: ${{ github.head_ref }}
run: |
git remote add upstream https://github.com/${{ github.event.pull_request.base.repo.full_name }}
git -c protocol.version=2 fetch --prune --progress --no-recurse-submodules upstream +refs/heads/*:refs/remotes/upstream/* +refs/tags/*:refs/tags/*
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
git checkout --progress --force $ANCESTOR_REF
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
dotnet-version: '10.0.x'
- name: Generate openapi.json
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
- name: Upload openapi.json
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: openapi-base
retention-days: 14
if-no-files-found: error
path: tests/Jellyfin.Server.Integration.Tests/bin/Release/net10.0/openapi.json
openapi-diff:
permissions:
pull-requests: write
name: OpenAPI - Difference
if: ${{ github.event_name == 'pull_request' }}
runs-on: ubuntu-latest
needs:
- openapi-head
- openapi-base
steps:
- name: Download openapi-head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-head
path: openapi-head
- name: Download openapi-base
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-base
path: openapi-base
- name: Detect OpenAPI changes
id: openapi-diff
uses: jellyfin/openapi-diff-action@9274f6bda9d01ab091942a4a8334baa53692e8a4 # v1.0.0
with:
old-spec: openapi-base/openapi.json
new-spec: openapi-head/openapi.json
markdown: openapi-changelog.md
add-pr-comment: true
github-token: ${{ secrets.GITHUB_TOKEN }}
publish-unstable:
name: OpenAPI - Publish Unstable Spec
if: ${{ github.event_name != 'pull_request' && !startsWith(github.ref, 'refs/tags/v') && contains(github.repository_owner, 'jellyfin') }}
runs-on: ubuntu-latest
needs:
- openapi-head
steps:
- name: Set unstable dated version
id: version
run: |-
echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
- name: Download openapi-head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-head
path: openapi-head
- name: Upload openapi.json (unstable) to repository server
uses: appleboy/scp-action@ff85246acaad7bdce478db94a363cd2bf7c90345 # v1.0.0
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
source: openapi-head/openapi.json
strip_components: 1
target: "/srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (unstable) into place
uses: appleboy/ssh-action@0ff4204d59e8e51228ff73bce53f80d53301dee2 # v1.2.5
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
debug: false
script: |
if ! test -d /run/workflows; then
sudo mkdir -p /run/workflows
sudo chown ${{ secrets.REPO_USER }} /run/workflows
fi
(
flock -x -w 300 200 || exit 1
TGT_DIR="/srv/repository/main/openapi"
LAST_SPEC="$( ls -lt ${TGT_DIR}/unstable/ | grep 'jellyfin-openapi' | head -1 | awk '{ print $NF }' )"
# If new and previous spec don't differ (diff retcode 0), remove incoming and finish
if diff /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/unstable/${LAST_SPEC} &>/dev/null; then
rm -r /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}
exit 0
fi
# Move new spec into place
sudo mv /srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json
# Delete previous jellyfin-openapi-unstable_previous.json
sudo rm ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
# Move current jellyfin-openapi-unstable.json symlink to jellyfin-openapi-unstable_previous.json
sudo mv ${TGT_DIR}/jellyfin-openapi-unstable.json ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
# Create new jellyfin-openapi-unstable.json symlink
sudo ln -s unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json ${TGT_DIR}/jellyfin-openapi-unstable.json
# Check that the previous openapi unstable spec link is correct
if [[ "$( readlink ${TGT_DIR}/jellyfin-openapi-unstable_previous.json )" != "unstable/${LAST_SPEC}" ]]; then
sudo rm ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
sudo ln -s unstable/${LAST_SPEC} ${TGT_DIR}/jellyfin-openapi-unstable_previous.json
fi
) 200>/run/workflows/openapi-unstable.lock
publish-stable:
name: OpenAPI - Publish Stable Spec
if: ${{ startsWith(github.ref, 'refs/tags/v') && contains(github.repository_owner, 'jellyfin') }}
runs-on: ubuntu-latest
needs:
- openapi-head
steps:
- name: Set version number
id: version
run: |-
echo "JELLYFIN_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Download openapi-head
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: openapi-head
path: openapi-head
- name: Upload openapi.json (stable) to repository server
uses: appleboy/scp-action@ff85246acaad7bdce478db94a363cd2bf7c90345 # v1.0.0
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
source: openapi-head/openapi.json
strip_components: 1
target: "/srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (stable) into place
uses: appleboy/ssh-action@0ff4204d59e8e51228ff73bce53f80d53301dee2 # v1.2.5
with:
host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}"
key: "${{ secrets.REPO_KEY }}"
debug: false
script: |
if ! test -d /run/workflows; then
sudo mkdir -p /run/workflows
sudo chown ${{ secrets.REPO_USER }} /run/workflows
fi
(
flock -x -w 300 200 || exit 1
TGT_DIR="/srv/repository/main/openapi"
LAST_SPEC="$( ls -lt ${TGT_DIR}/stable/ | grep 'jellyfin-openapi' | head -1 | awk '{ print $NF }' )"
# If new and previous spec don't differ (diff retcode 0), remove incoming and finish
if diff /srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/stable/${LAST_SPEC} &>/dev/null; then
rm -r /srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}
exit 0
fi
# Move new spec into place
sudo mv /srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}/openapi.json ${TGT_DIR}/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json
# Delete previous jellyfin-openapi-stable_previous.json
sudo rm ${TGT_DIR}/jellyfin-openapi-stable_previous.json
# Move current jellyfin-openapi-stable.json symlink to jellyfin-openapi-stable_previous.json
sudo mv ${TGT_DIR}/jellyfin-openapi-stable.json ${TGT_DIR}/jellyfin-openapi-stable_previous.json
# Create new jellyfin-openapi-stable.json symlink
sudo ln -s stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}.json ${TGT_DIR}/jellyfin-openapi-stable.json
# Check that the previous openapi stable spec link is correct
if [[ "$( readlink ${TGT_DIR}/jellyfin-openapi-stable_previous.json )" != "stable/${LAST_SPEC}" ]]; then
sudo rm ${TGT_DIR}/jellyfin-openapi-stable_previous.json
sudo ln -s stable/${LAST_SPEC} ${TGT_DIR}/jellyfin-openapi-stable_previous.json
fi
) 200>/run/workflows/openapi-stable.lock
================================================
FILE: .github/workflows/ci-tests.yml
================================================
name: Tests
on:
push:
branches:
- master
# Run tests against the forked branch, but
# do not allow access to secrets
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflows-in-forked-repositories
pull_request:
env:
SDK_VERSION: "10.0.x"
jobs:
run-tests:
strategy:
matrix:
os: ["ubuntu-latest", "macos-latest", "windows-latest"]
fail-fast: false
runs-on: "${{ matrix.os }}"
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
with:
dotnet-version: ${{ env.SDK_VERSION }}
- name: Run DotNet CLI Tests
run: >
dotnet test Jellyfin.sln
--configuration Release
--collect:"XPlat Code Coverage"
--settings tests/coverletArgs.runsettings
--verbosity minimal
- name: Merge code coverage results
uses: danielpalme/ReportGenerator-GitHub-Action@cf6fe1b38ed5becc89ffe056c1f240825993be5b # v5.5.4
with:
reports: "**/coverage.cobertura.xml"
targetdir: "merged/"
reporttypes: "Cobertura"
# TODO - which action / tool to use to publish code coverage results?
# - name: Publish code coverage results
================================================
FILE: .github/workflows/commands.yml
================================================
name: Commands
on:
issue_comment:
types:
- created
- edited
pull_request:
types:
- labeled
- synchronize
permissions: {}
jobs:
rebase:
name: Rebase
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '@jellyfin-bot rebase') && github.event.comment.author_association == 'MEMBER'
runs-on: ubuntu-latest
steps:
- name: Notify as seen
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
with:
token: ${{ secrets.JF_BOT_TOKEN }}
comment-id: ${{ github.event.comment.id }}
reactions: '+1'
- name: Checkout the latest code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0
- name: Automatic Rebase
uses: cirrus-actions/rebase@b87d48154a87a85666003575337e27b8cd65f691 # 1.8
env:
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
rename:
name: Rename
if: contains(github.event.comment.body, '@jellyfin-bot rename') && github.event.comment.author_association == 'MEMBER'
runs-on: ubuntu-latest
steps:
- name: pull in script
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: jellyfin/jellyfin-triage-script
- name: install python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.14'
cache: 'pip'
- name: install python packages
run: pip install -r rename/requirements.txt
- name: run rename script
run: python3 rename.py
working-directory: ./rename
env:
GH_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
GH_REPO: ${{ github.repository }}
ISSUE: ${{ github.event.issue.number }}
COMMENT_ID: ${{ github.event.comment.id }}
================================================
FILE: .github/workflows/issue-stale.yml
================================================
name: Stale Issue Labeler
on:
schedule:
- cron: '30 1 * * *'
workflow_dispatch:
permissions:
issues: write
pull-requests: write
actions: write
jobs:
issues:
name: Check for stale issues
runs-on: ubuntu-latest
if: ${{ contains(github.repository, 'jellyfin/') }}
steps:
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
with:
repo-token: ${{ secrets.JF_BOT_TOKEN }}
ascending: true
days-before-stale: 120
days-before-pr-stale: -1
days-before-close: 21
days-before-pr-close: -1
operations-per-run: 500
exempt-issue-labels: regression,security,roadmap,future,feature,enhancement,confirmed
stale-issue-label: stale
stale-issue-message: |-
This issue has gone 120 days without an update and will be closed within 21 days if there is no new activity. To prevent this issue from being closed, please confirm the issue has not already been fixed by providing updated examples or logs.
If you have any questions you can use one of several ways to [contact us](https://jellyfin.org/contact).
close-issue-message: |-
This issue was closed due to inactivity.
================================================
FILE: .github/workflows/issue-template-check.yml
================================================
name: Check Issue Template
on:
issues:
types:
- opened
jobs:
check_issue:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- name: pull in script
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: jellyfin/jellyfin-triage-script
- name: install python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.14'
cache: 'pip'
- name: install python packages
run: pip install -r main-repo-triage/requirements.txt
- name: check and comment issue
working-directory: ./main-repo-triage
run: python3 single_issue_gha.py
env:
GH_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
GH_REPO: ${{ github.repository }}
ISSUE: ${{ github.event.issue.number }}
================================================
FILE: .github/workflows/project-automation.yml
================================================
name: Project Automation
on:
push:
branches:
- master
pull_request:
issue_comment:
permissions: {}
jobs:
project:
name: Project board
runs-on: ubuntu-latest
if: ${{ github.repository == 'jellyfin/jellyfin' }}
steps:
- name: Remove from 'Current Release' project
uses: alex-page/github-project-automation-plus@303f24a24c67ce7adf565a07e96720faf126fe36 # v0.9.0
if: (github.event.pull_request || github.event.issue.pull_request) && !contains(github.event.*.labels.*.name, 'stable backport')
continue-on-error: true
with:
project: Current Release
action: delete
column: In progress
repo-token: ${{ secrets.JF_BOT_TOKEN }}
- name: Add to 'Release Next' project
uses: alex-page/github-project-automation-plus@303f24a24c67ce7adf565a07e96720faf126fe36 # v0.9.0
if: (github.event.pull_request || github.event.issue.pull_request) && github.event.action == 'opened'
continue-on-error: true
with:
project: Release Next
column: In progress
repo-token: ${{ secrets.JF_BOT_TOKEN }}
- name: Add to 'Current Release' project
uses: alex-page/github-project-automation-plus@303f24a24c67ce7adf565a07e96720faf126fe36 # v0.9.0
if: (github.event.pull_request || github.event.issue.pull_request) && !contains(github.event.*.labels.*.name, 'stable backport')
continue-on-error: true
with:
project: Current Release
column: In progress
repo-token: ${{ secrets.JF_BOT_TOKEN }}
- name: Check number of comments from the team member
if: github.event.issue.pull_request == '' && github.event.comment.author_association == 'MEMBER'
id: member_comments
run: echo "::set-output name=number::$(curl -s ${{ github.event.issue.comments_url }} | jq '.[] | select(.author_association == "MEMBER") | .author_association' | wc -l)"
- name: Move issue to needs triage
uses: alex-page/github-project-automation-plus@303f24a24c67ce7adf565a07e96720faf126fe36 # v0.9.0
if: github.event.issue.pull_request == '' && github.event.comment.author_association == 'MEMBER' && steps.member_comments.outputs.number <= 1
continue-on-error: true
with:
project: Issue Triage for Main Repo
column: Needs triage
repo-token: ${{ secrets.JF_BOT_TOKEN }}
- name: Add issue to triage project
uses: alex-page/github-project-automation-plus@303f24a24c67ce7adf565a07e96720faf126fe36 # v0.9.0
if: github.event.issue.pull_request == '' && github.event.action == 'opened'
continue-on-error: true
with:
project: Issue Triage for Main Repo
column: Pending response
repo-token: ${{ secrets.JF_BOT_TOKEN }}
================================================
FILE: .github/workflows/pull-request-conflict.yml
================================================
name: Merge Conflict Labeler
on:
push:
branches:
- master
pull_request:
issue_comment:
permissions: {}
jobs:
label:
name: Labeling
runs-on: ubuntu-latest
if: ${{ github.repository == 'jellyfin/jellyfin' && github.event.issue.pull_request }}
steps:
- name: Apply label
uses: eps1lon/actions-label-merge-conflict@1df065ebe6e3310545d4f4c4e862e43bdca146f0 # v3.0.3
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request'}}
with:
dirtyLabel: 'merge conflict'
commentOnDirty: 'This pull request has merge conflicts. Please resolve the conflicts so the PR can be successfully reviewed and merged.'
repoToken: ${{ secrets.JF_BOT_TOKEN }}
================================================
FILE: .github/workflows/pull-request-stale.yaml
================================================
name: Stale PR Check
on:
schedule:
- cron: '30 */12 * * *'
workflow_dispatch:
permissions:
pull-requests: write
actions: write
jobs:
prs-stale-conflicts:
name: Check PRs with merge conflicts
runs-on: ubuntu-latest
if: ${{ contains(github.repository, 'jellyfin/') }}
steps:
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
with:
repo-token: ${{ secrets.JF_BOT_TOKEN }}
ascending: true
operations-per-run: 150
# The merge conflict action will remove the label when updated
remove-stale-when-updated: false
days-before-stale: -1
days-before-close: 90
days-before-issue-close: -1
stale-pr-label: merge conflict
close-pr-message: |-
This PR has been closed due to having unresolved merge conflicts.
================================================
FILE: .github/workflows/release-bump-version.yaml
================================================
name: '🆙 Auto bump_version'
on:
release:
types:
- published
workflow_dispatch:
inputs:
TAG_BRANCH:
required: true
description: release-x.y.z
NEXT_VERSION:
required: true
description: x.y.z
jobs:
auto_bump_version:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'release' && !contains(github.event.release.tag_name, 'rc') }}
env:
TAG_BRANCH: ${{ github.event.release.target_commitish }}
steps:
- name: Wait for deploy checks to finish
uses: jitterbit/await-check-suites@292a541bb7618078395b2ce711a0d89cfb8a568a # v1
with:
ref: ${{ env.TAG_BRANCH }}
intervalSeconds: 60
timeoutSeconds: 3600
- name: Setup YQ
uses: chrisdickinson/setup-yq@latest
with:
yq-version: v4.9.8
- name: Checkout Repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ env.TAG_BRANCH }}
- name: Setup EnvVars
run: |-
CURRENT_VERSION=$(yq e '.version' build.yaml)
CURRENT_MAJOR_MINOR=${CURRENT_VERSION%.*}
CURRENT_PATCH=${CURRENT_VERSION##*.}
echo "CURRENT_VERSION=${CURRENT_VERSION}" >> $GITHUB_ENV
echo "CURRENT_MAJOR_MINOR=${CURRENT_MAJOR_MINOR}" >> $GITHUB_ENV
echo "CURRENT_PATCH=${CURRENT_PATCH}" >> $GITHUB_ENV
echo "NEXT_VERSION=${CURRENT_MAJOR_MINOR}.$(($CURRENT_PATCH + 1))" >> $GITHUB_ENV
- name: Run bump_version
run: ./bump_version ${{ env.NEXT_VERSION }}
- name: Commit Changes
run: |-
git config user.name "jellyfin-bot"
git config user.email "team@jellyfin.org"
git checkout ${{ env.TAG_BRANCH }}
git commit -am "Bump version to ${{ env.NEXT_VERSION }}"
git push origin ${{ env.TAG_BRANCH }}
manual_bump_version:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' }}
env:
TAG_BRANCH: ${{ github.event.inputs.TAG_BRANCH }}
NEXT_VERSION: ${{ github.event.inputs.NEXT_VERSION }}
steps:
- name: Checkout Repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ env.TAG_BRANCH }}
- name: Run bump_version
run: ./bump_version ${{ env.NEXT_VERSION }}
- name: Commit Changes
run: |-
git config user.name "jellyfin-bot"
git config user.email "team@jellyfin.org"
git checkout ${{ env.TAG_BRANCH }}
git commit -am "Bump version to ${{ env.NEXT_VERSION }}"
git push origin ${{ env.TAG_BRANCH }}
================================================
FILE: .gitignore
================================================
.directory
#################
## Eclipse
#################
*.pydevproject
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
project.fragment.lock.json
project.lock.json
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
#################
## Media Browser
#################
ProgramData*/
CorePlugins*/
ProgramData-Server*/
ProgramData-UI*/
#################
## Visual Studio
#################
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
.vs/
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
build/
[Bb]in/
[Oo]bj/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
*.scc
*.psess
*.vsp
*.vspx
*.orig
*.rej
*.sdf
*.opensdf
*.ipch
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
*.pubxml
# NuGet Packages Directory
dlls/
dllssigned/
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
#############
## Windows detritus
#############
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac crap
.DS_Store
#############
## Python
#############
*.py[co]
# Packages
*.egg
*.egg-info
build/
eggs/
parts/
var/
sdist/
develop-eggs/
.installed.cfg
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
#Translations
*.mo
#Mr Developer
.mr.developer.cfg
##########
# Rider
##########
.idea/
#########################
# Build artifacts
#########################
# Artifacts for debian-x64
debian/.debhelper/
debian/*.debhelper
debian/debhelper-build-stamp
debian/files
debian/jellyfin.substvars
debian/jellyfin/
# Don't ignore the debian/bin folder
!debian/bin/
deployment/**/dist/
deployment/**/pkg-dist/
deployment/**/pkg-dist-tmp/
deployment/collect-dist/
jellyfin_version.ini
ci/
# Doxygen
doc/
# Deployment artifacts
dist
*.exe
*.dll
# BenchmarkDotNet artifacts
BenchmarkDotNet.Artifacts
# Ignore web artifacts from native builds
web/
web-src.*
apiclient/generated
# Omnisharp crash logs
mono_crash.*.json
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": [
"ms-dotnettools.csharp",
"editorconfig.editorconfig",
"github.vscode-github-actions",
"ms-dotnettools.vscode-dotnet-runtime",
"ms-dotnettools.csdevkit",
"alexcvzz.vscode-sqlite"
],
"unwantedRecommendations": [
]
}
================================================
FILE: .vscode/launch.json
================================================
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net10.0/jellyfin.dll",
"args": [],
"cwd": "${workspaceFolder}/Jellyfin.Server",
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart",
"serverReadyAction": {
"action": "openExternally",
"pattern": "Overriding address\\(es\\) \\'(https?:\\S+)\\'",
}
},
{
"name": ".NET Launch (nowebclient)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net10.0/jellyfin.dll",
"args": ["--nowebclient"],
"cwd": "${workspaceFolder}/Jellyfin.Server",
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "ghcs .NET Launch (nowebclient, ffmpeg)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Jellyfin.Server/bin/Debug/net10.0/jellyfin.dll",
"args": ["--nowebclient", "--ffmpeg", "/usr/lib/jellyfin-ffmpeg/ffmpeg"],
"cwd": "${workspaceFolder}/Jellyfin.Server",
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": ".NET Attach",
"type": "coreclr",
"request": "attach",
"processId": "${command:pickProcess}"
}
],
"env": {
"DOTNET_CLI_TELEMETRY_OPTOUT": "1"
}
}
================================================
FILE: .vscode/settings.json
================================================
{
"dotnet.preferVisualStudioCodeFileSystemWatcher": true
}
================================================
FILE: .vscode/tasks.json
================================================
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Jellyfin.Server/Jellyfin.Server.csproj"
],
"problemMatcher": "$msCompile"
},
{
"label": "api tests",
"command": "dotnet",
"type": "process",
"args": [
"test",
"${workspaceFolder}/tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj"
],
"problemMatcher": "$msCompile"
}
],
"options": {
"env": {
"DOTNET_CLI_TELEMETRY_OPTOUT": "1"
}
}
}
================================================
FILE: BannedSymbols.txt
================================================
P:System.Threading.Tasks.Task`1.Result
M:System.Guid.op_Equality(System.Guid,System.Guid)
M:System.Guid.op_Inequality(System.Guid,System.Guid)
M:System.Guid.Equals(System.Object)
================================================
FILE: CONTRIBUTORS.md
================================================
# Jellyfin Contributors
- [1337joe](https://github.com/1337joe)
- [97carmine](https://github.com/97carmine)
- [Abbe98](https://github.com/Abbe98)
- [agrenott](https://github.com/agrenott)
- [alltilla](https://github.com/alltilla)
- [AndreCarvalho](https://github.com/AndreCarvalho)
- [anthonylavado](https://github.com/anthonylavado)
- [Artiume](https://github.com/Artiume)
- [AThomsen](https://github.com/AThomsen)
- [barongreenback](https://github.com/BaronGreenback)
- [barronpm](https://github.com/barronpm)
- [bilde2910](https://github.com/bilde2910)
- [bfayers](https://github.com/bfayers)
- [BnMcG](https://github.com/BnMcG)
- [Bond-009](https://github.com/Bond-009)
- [brianjmurrell](https://github.com/brianjmurrell)
- [bugfixin](https://github.com/bugfixin)
- [chaosinnovator](https://github.com/chaosinnovator)
- [ckcr4lyf](https://github.com/ckcr4lyf)
- [cocool97](https://github.com/cocool97)
- [ConfusedPolarBear](https://github.com/ConfusedPolarBear)
- [crankdoofus](https://github.com/crankdoofus)
- [crobibero](https://github.com/crobibero)
- [cromefire](https://github.com/cromefire)
- [cryptobank](https://github.com/cryptobank)
- [cvium](https://github.com/cvium)
- [dannymichel](https://github.com/dannymichel)
- [darioackermann](https://github.com/darioackermann)
- [DaveChild](https://github.com/DaveChild)
- [DavidFair](https://github.com/DavidFair)
- [Delgan](https://github.com/Delgan)
- [Derpipose](https://github.com/Derpipose)
- [dcrdev](https://github.com/dcrdev)
- [dhartung](https://github.com/dhartung)
- [dinki](https://github.com/dinki)
- [dkanada](https://github.com/dkanada)
- [dlahoti](https://github.com/dlahoti)
- [dmitrylyzo](https://github.com/dmitrylyzo)
- [DMouse10462](https://github.com/DMouse10462)
- [DrPandemic](https://github.com/DrPandemic)
- [eglia](https://github.com/eglia)
- [EgorBakanov](https://github.com/EgorBakanov)
- [EraYaN](https://github.com/EraYaN)
- [escabe](https://github.com/escabe)
- [excelite](https://github.com/excelite)
- [fasheng](https://github.com/fasheng)
- [ferferga](https://github.com/ferferga)
- [fhriley](https://github.com/fhriley)
- [flemse](https://github.com/flemse)
- [Froghut](https://github.com/Froghut)
- [fruhnow](https://github.com/fruhnow)
- [geilername](https://github.com/geilername)
- [GermanCoding](https://github.com/GermanCoding)
- [gnattu](https://github.com/gnattu)
- [GodTamIt](https://github.com/GodTamIt)
- [grafixeyehero](https://github.com/grafixeyehero)
- [h1nk](https://github.com/h1nk)
- [hawken93](https://github.com/hawken93)
- [HelloWorld017](https://github.com/HelloWorld017)
- [ikomhoog](https://github.com/ikomhoog)
- [iwalton3](https://github.com/iwalton3)
- [jftuga](https://github.com/jftuga)
- [jkhsjdhjs](https://github.com/jkhsjdhjs)
- [jmshrv](https://github.com/jmshrv)
- [joern-h](https://github.com/joern-h)
- [joshuaboniface](https://github.com/joshuaboniface)
- [JustAMan](https://github.com/JustAMan)
- [justinfenn](https://github.com/justinfenn)
- [JPVenson](https://github.com/JPVenson)
- [KerryRJ](https://github.com/KerryRJ)
- [Larvitar](https://github.com/Larvitar)
- [LeoVerto](https://github.com/LeoVerto)
- [Liggy](https://github.com/Liggy)
- [lmaonator](https://github.com/lmaonator)
- [LogicalPhallacy](https://github.com/LogicalPhallacy)
- [loli10K](https://github.com/loli10K)
- [lostmypillow](https://github.com/lostmypillow)
- [Lynxy](https://github.com/Lynxy)
- [ManfredRichthofen](https://github.com/ManfredRichthofen)
- [Marenz](https://github.com/Marenz)
- [marius-luca-87](https://github.com/marius-luca-87)
- [mark-monteiro](https://github.com/mark-monteiro)
- [MarkCiliaVincenti](https://github.com/MarkCiliaVincenti)
- [Matt07211](https://github.com/Matt07211)
- [Maxr1998](https://github.com/Maxr1998)
- [mcarlton00](https://github.com/mcarlton00)
- [mitchfizz05](https://github.com/mitchfizz05)
- [mohd-akram](https://github.com/mohd-akram)
- [MrTimscampi](https://github.com/MrTimscampi)
- [n8225](https://github.com/n8225)
- [Nalsai](https://github.com/Nalsai)
- [Narfinger](https://github.com/Narfinger)
- [NathanPickard](https://github.com/NathanPickard)
- [neilsb](https://github.com/neilsb)
- [nevado](https://github.com/nevado)
- [Nickbert7](https://github.com/Nickbert7)
- [nicknsy](https://github.com/nicknsy)
- [nvllsvm](https://github.com/nvllsvm)
- [nyanmisaka](https://github.com/nyanmisaka)
- [OancaAndrei](https://github.com/OancaAndrei)
- [obradovichv](https://github.com/obradovichv)
- [oddstr13](https://github.com/oddstr13)
- [orryverducci](https://github.com/orryverducci)
- [petermcneil](https://github.com/petermcneil)
- [Phlogi](https://github.com/Phlogi)
- [pjeanjean](https://github.com/pjeanjean)
- [ploughpuff](https://github.com/ploughpuff)
- [pR0Ps](https://github.com/pR0Ps)
- [PrplHaz4](https://github.com/PrplHaz4)
- [RazeLighter777](https://github.com/RazeLighter777)
- [redSpoutnik](https://github.com/redSpoutnik)
- [ringmatter](https://github.com/ringmatter)
- [ryan-hartzell](https://github.com/ryan-hartzell)
- [s0urcelab](https://github.com/s0urcelab)
- [sachk](https://github.com/sachk)
- [sammyrc34](https://github.com/sammyrc34)
- [samuel9554](https://github.com/samuel9554)
- [SapientGuardian](https://github.com/SapientGuardian)
- [scheidleon](https://github.com/scheidleon)
- [sebPomme](https://github.com/sebPomme)
- [SegiH](https://github.com/SegiH)
- [SenorSmartyPants](https://github.com/SenorSmartyPants)
- [shemanaev](https://github.com/shemanaev)
- [skaro13](https://github.com/skaro13)
- [sl1288](https://github.com/sl1288)
- [Smith00101010](https://github.com/Smith00101010)
- [sorinyo2004](https://github.com/sorinyo2004)
- [sparky8251](https://github.com/sparky8251)
- [spookbits](https://github.com/spookbits)
- [ssenart](https://github.com/ssenart)
- [stanionascu](https://github.com/stanionascu)
- [stevehayles](https://github.com/stevehayles)
- [StollD](https://github.com/StollD)
- [SuperSandro2000](https://github.com/SuperSandro2000)
- [tbraeutigam](https://github.com/tbraeutigam)
- [teacupx](https://github.com/teacupx)
- [TelepathicWalrus](https://github.com/TelepathicWalrus)
- [Terror-Gene](https://github.com/Terror-Gene)
- [ThatNerdyPikachu](https://github.com/ThatNerdyPikachu)
- [ThibaultNocchi](https://github.com/ThibaultNocchi)
- [thornbill](https://github.com/thornbill)
- [ThreeFive-O](https://github.com/ThreeFive-O)
- [tjwalkr3](https://github.com/tjwalkr3)
- [TrisMcC](https://github.com/TrisMcC)
- [trumblejoe](https://github.com/trumblejoe)
- [TtheCreator](https://github.com/TtheCreator)
- [twinkybot](https://github.com/twinkybot)
- [Ullmie02](https://github.com/Ullmie02)
- [Unhelpful](https://github.com/Unhelpful)
- [viaregio](https://github.com/viaregio)
- [vitorsemeano](https://github.com/vitorsemeano)
- [voodoos](https://github.com/voodoos)
- [whooo](https://github.com/whooo)
- [WiiPlayer2](https://github.com/WiiPlayer2)
- [WillWill56](https://github.com/WillWill56)
- [wtayl0r](https://github.com/wtayl0r)
- [Wuerfelbecher](https://github.com/Wuerfelbecher)
- [Wunax](https://github.com/Wunax)
- [WWWesten](https://github.com/WWWesten)
- [WX9yMOXWId](https://github.com/WX9yMOXWId)
- [xosdy](https://github.com/xosdy)
- [XVicarious](https://github.com/XVicarious)
- [YouKnowBlom](https://github.com/YouKnowBlom)
- [ZachPhelan](https://github.com/ZachPhelan)
- [KristupasSavickas](https://github.com/KristupasSavickas)
- [Pusta](https://github.com/pusta)
- [nielsvanvelzen](https://github.com/nielsvanvelzen)
- [skyfrk](https://github.com/skyfrk)
- [ianjazz246](https://github.com/ianjazz246)
- [peterspenler](https://github.com/peterspenler)
- [MBR-0001](https://github.com/MBR-0001)
- [jonas-resch](https://github.com/jonas-resch)
- [vgambier](https://github.com/vgambier)
- [MinecraftPlaye](https://github.com/MinecraftPlaye)
- [RealGreenDragon](https://github.com/RealGreenDragon)
- [ipitio](https://github.com/ipitio)
- [TheTyrius](https://github.com/TheTyrius)
- [tallbl0nde](https://github.com/tallbl0nde)
- [sleepycatcoding](https://github.com/sleepycatcoding)
- [scampower3](https://github.com/scampower3)
- [Chris-Codes-It](https://github.com/Chris-Codes-It)
- [Pithaya](https://github.com/Pithaya)
- [Çağrı Sakaoğlu](https://github.com/ilovepilav)
- [Barasingha](https://github.com/MaVdbussche)
- [Gauvino](https://github.com/Gauvino)
- [felix920506](https://github.com/felix920506)
- [btopherjohnson](https://github.com/btopherjohnson)
- [GeorgeH005](https://github.com/GeorgeH005)
- [Vedant](https://github.com/viktory36/)
- [NotSaifA](https://github.com/NotSaifA)
- [HonestlyWhoKnows](https://github.com/honestlywhoknows)
- [TheMelmacian](https://github.com/TheMelmacian)
- [ItsAllAboutTheCode](https://github.com/ItsAllAboutTheCode)
- [pret0rian8](https://github.com/pret0rian)
- [jaina heartles](https://github.com/heartles)
- [oxixes](https://github.com/oxixes)
- [elfalem](https://github.com/elfalem)
- [Kenneth Cochran](https://github.com/kennethcochran)
- [benedikt257](https://github.com/benedikt257)
- [revam](https://github.com/revam)
- [allesmi](https://github.com/allesmi)
- [ThunderClapLP](https://github.com/ThunderClapLP)
- [Shoham Peller](https://github.com/spellr)
- [theshoeshiner](https://github.com/theshoeshiner)
- [TokerX](https://github.com/TokerX)
- [GeneMarks](https://github.com/GeneMarks)
- [Kirill Nikiforov](https://github.com/allmazz)
- [bjorntp](https://github.com/bjorntp)
- [martenumberto](https://github.com/martenumberto)
- [ZeusCraft10](https://github.com/ZeusCraft10)
- [MarcoCoreDuo](https://github.com/MarcoCoreDuo)
# Emby Contributors
- [LukePulverenti](https://github.com/LukePulverenti)
- [ebr11](https://github.com/ebr11)
- [lalmanzar](https://github.com/lalmanzar)
- [schneifu](https://github.com/schneifu)
- [Mark2xv](https://github.com/Mark2xv)
- [ScottRapsey](https://github.com/ScottRapsey)
- [skynet600](https://github.com/skynet600)
- [Cheesegeezer](https://githum.com/Cheesegeezer)
- [Radeon](https://github.com/radeonorama)
- [gcw07](https://github.com/gcw07)
- [SivaramAdhiappan](https://github.com/shivaram1190)
- [CWatkinsNash](https://github.com/CWatkinsNash)
- [sfnetwork](https://github.com/sfnetwork)
- [Logos302](https://github.com/Logos302)
- [TheWorkz](https://github.com/TheWorkz)
- [mboehler](https://github.com/mboehler)
- [KaHooli](https://github.com/KaHooli)
- [xzener](https://github.com/xzener)
- [CBers](https://github.com/CBers)
- [Sagaia](https://github.com/Sagaia)
- [JHawk111](https://github.com/JHawk111)
- [David3663](https://github.com/david3663)
- [Smyken](https://github.com/Smyken)
- [doron1](https://github.com/doron1)
- [brainfryd](https://github.com/brainfryd)
- [DGMayor](http://github.com/DGMayor)
- [Jon-theHTPC](https://github.com/Jon-theHTPC)
- [aspdend](https://github.com/aspdend)
- [RedshirtMB](https://github.com/RedshirtMB)
- [thealienamongus](https://github.com/thealienamongus)
- [brocass](https://github.com/brocass)
- [pjrollo2000](https://github.com/pjrollo2000)
- [abobader](https://github.com/abobader)
- [milli260876](https://github.com/milli260876)
- [vileboy](https://github.com/vileboy)
- [starkadius](https://github.com/starkadius)
- [wraslor](https://github.com/wraslor)
- [mrwebsmith](https://github.com/mrwebsmith)
- [rickster53](https://github.com/rickster53)
- [Tharnax](https://github.com/Tharnax)
- [0sm0](https://github.com/0sm0)
- [swhitmore](https://github.com/swhitmore)
- [DigiTM](https://github.com/DigiTM)
- [crisliv / xliv](https://github.com/crisliv)
- [Yogi](https://github.com/yogi12)
- [madFloyd](https://github.com/madFloyd)
- [yardameus](https://github.com/yardameus)
- [rrb008](https://github.com/rrb008)
- [Toonguy](https://github.com/Toonguy)
- [Alwin Hummels](https://github.com/AlwinHummels)
- [trooper11](https://github.com/trooper11)
- [danlotfy](https://github.com/danlotfy)
- [jordy1955](https://github.com/jordy1955)
- [JoshFink](https://github.com/JoshFink)
- [Detector1](https://github.com/Detector1)
- [BlackIce013](https://github.com/blackice013)
- [mporcas](https://github.com/mporcas)
- [tikuf](https://github.com/tikuf/)
- [Tim Hobbs](https://github.com/timhobbs)
- [SvenVandenbrande](https://github.com/SvenVandenbrande)
- [olsh](https://github.com/olsh)
- [lbenini](https://github.com/lbenini)
- [gnuyent](https://github.com/gnuyent)
- [Matthew Jones](https://github.com/matthew-jones-uk)
- [Jakob Kukla](https://github.com/jakobkukla)
- [Utku Özdemir](https://github.com/utkuozdemir)
- [JPUC1143](https://github.com/Jpuc1143/)
- [0x25CBFC4F](https://github.com/0x25CBFC4F)
- [Robert Lützner](https://github.com/rluetzner)
- [Nathan McCrina](https://github.com/nfmccrina)
- [Martin Reuter](https://github.com/reuterma24)
- [Michael McElroy](https://github.com/mcmcelro)
- [Soumyadip Auddy](https://github.com/SoumyadipAuddy)
- [DerMaddis](https://github.com/dermaddis)
================================================
FILE: Directory.Build.props
================================================
<Project>
<!-- Sets defaults for all projects in the repo -->
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsNotAsErrors>NU1902;NU1903</WarningsNotAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<AnalysisMode>AllEnabledByDefault</AnalysisMode>
</PropertyGroup>
<ItemGroup>
<AdditionalFiles Include="$(MSBuildThisFileDirectory)/BannedSymbols.txt" />
<AdditionalFiles Include="$(MSBuildThisFileDirectory)/stylecop.json" />
</ItemGroup>
<!-- Custom Analyzers -->
<ItemGroup Condition=" '$(MSBuildProjectName)' != 'Jellyfin.CodeAnalysis' AND '$(Configuration)' == 'Debug' ">
<ProjectReference Include="$(MSBuildThisFileDirectory)src/Jellyfin.CodeAnalysis/Jellyfin.CodeAnalysis.csproj" OutputItemType="Analyzer" />
</ItemGroup>
</Project>
================================================
FILE: Directory.Packages.props
================================================
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<!-- Run "dotnet list package (dash,dash)outdated" to see the latest versions of each package.-->
<ItemGroup Label="Package Dependencies">
<PackageVersion Include="AsyncKeyedLock" Version="8.0.2" />
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" />
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
<PackageVersion Include="AutoFixture" Version="4.18.1" />
<PackageVersion Include="BDInfo" Version="0.8.0" />
<PackageVersion Include="BitFaster.Caching" Version="2.5.4" />
<PackageVersion Include="BlurHashSharp.SkiaSharp" Version="1.4.0-pre.1" />
<PackageVersion Include="BlurHashSharp" Version="1.4.0-pre.1" />
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
<PackageVersion Include="coverlet.collector" Version="8.0.1" />
<PackageVersion Include="Diacritics" Version="4.1.4" />
<PackageVersion Include="DiscUtils.Udf" Version="0.16.13" />
<PackageVersion Include="DotNet.Glob" Version="3.1.3" />
<PackageVersion Include="FsCheck.Xunit" Version="3.3.2" />
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="8.3.1.1" />
<PackageVersion Include="ICU4N.Transliterator" Version="60.1.0-alpha.356" />
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.8" />
<PackageVersion Include="Ignore" Version="0.2.1" />
<PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" />
<PackageVersion Include="libse" Version="4.0.12" />
<PackageVersion Include="LrcParser" Version="2025.623.0" />
<PackageVersion Include="MetaBrainz.MusicBrainz" Version="8.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="10.0.5" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.5" />
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="4.14.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="5.3.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.3.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="5.3.0" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.5" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.5" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.5" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.5" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.5" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
<PackageVersion Include="MimeTypes" Version="2.5.2" />
<PackageVersion Include="Morestachio" Version="5.0.1.631" />
<PackageVersion Include="Moq" Version="4.18.4" />
<PackageVersion Include="NEbml" Version="1.1.0.5" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="PlaylistsNET" Version="1.4.1" />
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
<PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.1" />
<PackageVersion Include="prometheus-net" Version="8.2.1" />
<PackageVersion Include="Polly" Version="8.6.6" />
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageVersion Include="Serilog.Expressions" Version="5.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="Serilog.Sinks.Graylog" Version="3.1.1" />
<PackageVersion Include="SerilogAnalyzer" Version="0.15.0" />
<PackageVersion Include="SharpFuzz" Version="2.2.0" />
<!-- Pinned to 3.116.1 because https://github.com/jellyfin/jellyfin/pull/14255 -->
<PackageVersion Include="SkiaSharp" Version="[3.116.1]" />
<PackageVersion Include="SkiaSharp.HarfBuzz" Version="[3.116.1]" />
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="[3.116.1]" />
<PackageVersion Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" />
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
<PackageVersion Include="Svg.Skia" Version="3.4.1" />
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="10.1.5" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="10.1.5" />
<PackageVersion Include="System.Text.Json" Version="10.0.5" />
<PackageVersion Include="TagLibSharp" Version="2.3.0" />
<PackageVersion Include="z440.atl.core" Version="7.11.0" />
<PackageVersion Include="TMDbLib" Version="3.0.0" />
<PackageVersion Include="UTF.Unknown" Version="2.6.0" />
<PackageVersion Include="Xunit.Priority" Version="1.1.6" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
<PackageVersion Include="Xunit.SkippableFact" Version="1.5.61" />
<PackageVersion Include="xunit" Version="2.9.3" />
</ItemGroup>
</Project>
================================================
FILE: Emby.Naming/Audio/AlbumParser.cs
================================================
using System;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
using Emby.Naming.Common;
using Jellyfin.Extensions;
namespace Emby.Naming.Audio
{
/// <summary>
/// Helper class to determine if Album is multipart.
/// </summary>
public partial class AlbumParser
{
private readonly NamingOptions _options;
/// <summary>
/// Initializes a new instance of the <see cref="AlbumParser"/> class.
/// </summary>
/// <param name="options">Naming options containing AlbumStackingPrefixes.</param>
public AlbumParser(NamingOptions options)
{
_options = options;
}
[GeneratedRegex(@"[-\.\(\)\s]+")]
private static partial Regex CleanRegex();
/// <summary>
/// Function that determines if album is multipart.
/// </summary>
/// <param name="path">Path to file.</param>
/// <returns>True if album is multipart.</returns>
public bool IsMultiPart(string path)
{
var filename = Path.GetFileName(path);
if (filename.Length == 0)
{
return false;
}
// TODO: Move this logic into options object
// Even better, remove the prefixes and come up with regexes
// But Kodi documentation seems to be weak for audio
// Normalize
// Remove whitespace
filename = CleanRegex().Replace(filename, " ");
ReadOnlySpan<char> trimmedFilename = filename.AsSpan().TrimStart();
foreach (var prefix in _options.AlbumStackingPrefixes)
{
if (!trimmedFilename.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
{
continue;
}
var tmp = trimmedFilename.Slice(prefix.Length).Trim();
if (int.TryParse(tmp.LeftPart(' '), CultureInfo.InvariantCulture, out _))
{
return true;
}
}
return false;
}
}
}
================================================
FILE: Emby.Naming/Audio/AudioFileParser.cs
================================================
using System;
using System.IO;
using Emby.Naming.Common;
using Jellyfin.Extensions;
namespace Emby.Naming.Audio
{
/// <summary>
/// Static helper class to determine if file at path is audio file.
/// </summary>
public static class AudioFileParser
{
/// <summary>
/// Static helper method to determine if file at path is audio file.
/// </summary>
/// <param name="path">Path to file.</param>
/// <param name="options"><see cref="NamingOptions"/> containing AudioFileExtensions.</param>
/// <returns>True if file at path is audio file.</returns>
public static bool IsAudioFile(string path, NamingOptions options)
{
var extension = Path.GetExtension(path.AsSpan());
return options.AudioFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase);
}
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookFileInfo.cs
================================================
using System;
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Represents a single video file.
/// </summary>
public class AudioBookFileInfo : IComparable<AudioBookFileInfo>
{
/// <summary>
/// Initializes a new instance of the <see cref="AudioBookFileInfo"/> class.
/// </summary>
/// <param name="path">Path to audiobook file.</param>
/// <param name="container">File type.</param>
/// <param name="partNumber">Number of part this file represents.</param>
/// <param name="chapterNumber">Number of chapter this file represents.</param>
public AudioBookFileInfo(string path, string container, int? partNumber = default, int? chapterNumber = default)
{
Path = path;
Container = container;
PartNumber = partNumber;
ChapterNumber = chapterNumber;
}
/// <summary>
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
public string Path { get; set; }
/// <summary>
/// Gets or sets the container.
/// </summary>
/// <value>The container.</value>
public string Container { get; set; }
/// <summary>
/// Gets or sets the part number.
/// </summary>
/// <value>The part number.</value>
public int? PartNumber { get; set; }
/// <summary>
/// Gets or sets the chapter number.
/// </summary>
/// <value>The chapter number.</value>
public int? ChapterNumber { get; set; }
/// <inheritdoc />
public int CompareTo(AudioBookFileInfo? other)
{
if (ReferenceEquals(this, other))
{
return 0;
}
if (ReferenceEquals(null, other))
{
return 1;
}
var chapterNumberComparison = Nullable.Compare(ChapterNumber, other.ChapterNumber);
if (chapterNumberComparison != 0)
{
return chapterNumberComparison;
}
var partNumberComparison = Nullable.Compare(PartNumber, other.PartNumber);
if (partNumberComparison != 0)
{
return partNumberComparison;
}
return string.Compare(Path, other.Path, StringComparison.Ordinal);
}
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookFilePathParser.cs
================================================
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
using Emby.Naming.Common;
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Parser class to extract part and/or chapter number from audiobook filename.
/// </summary>
public class AudioBookFilePathParser
{
private readonly NamingOptions _options;
/// <summary>
/// Initializes a new instance of the <see cref="AudioBookFilePathParser"/> class.
/// </summary>
/// <param name="options">Naming options containing AudioBookPartsExpressions.</param>
public AudioBookFilePathParser(NamingOptions options)
{
_options = options;
}
/// <summary>
/// Based on regex determines if filename includes part/chapter number.
/// </summary>
/// <param name="path">Path to audiobook file.</param>
/// <returns>Returns <see cref="AudioBookFilePathParser"/> object.</returns>
public AudioBookFilePathParserResult Parse(string path)
{
AudioBookFilePathParserResult result = default;
var fileName = Path.GetFileNameWithoutExtension(path);
foreach (var expression in _options.AudioBookPartsExpressions)
{
var match = Regex.Match(fileName, expression, RegexOptions.IgnoreCase);
if (match.Success)
{
if (!result.ChapterNumber.HasValue)
{
var value = match.Groups["chapter"];
if (value.Success)
{
if (int.TryParse(value.ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue))
{
result.ChapterNumber = intValue;
}
}
}
if (!result.PartNumber.HasValue)
{
var value = match.Groups["part"];
if (value.Success)
{
if (int.TryParse(value.ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue))
{
result.PartNumber = intValue;
}
}
}
}
}
return result;
}
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookFilePathParserResult.cs
================================================
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Data object for passing result of audiobook part/chapter extraction.
/// </summary>
public record struct AudioBookFilePathParserResult
{
/// <summary>
/// Gets or sets optional number of path extracted from audiobook filename.
/// </summary>
public int? PartNumber { get; set; }
/// <summary>
/// Gets or sets optional number of chapter extracted from audiobook filename.
/// </summary>
public int? ChapterNumber { get; set; }
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookInfo.cs
================================================
using System.Collections.Generic;
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Represents a complete video, including all parts and subtitles.
/// </summary>
public class AudioBookInfo
{
/// <summary>
/// Initializes a new instance of the <see cref="AudioBookInfo" /> class.
/// </summary>
/// <param name="name">Name of audiobook.</param>
/// <param name="year">Year of audiobook release.</param>
/// <param name="files">List of files composing the actual audiobook.</param>
/// <param name="extras">List of extra files.</param>
/// <param name="alternateVersions">Alternative version of files.</param>
public AudioBookInfo(string name, int? year, IReadOnlyList<AudioBookFileInfo> files, IReadOnlyList<AudioBookFileInfo> extras, IReadOnlyList<AudioBookFileInfo> alternateVersions)
{
Name = name;
Year = year;
Files = files;
Extras = extras;
AlternateVersions = alternateVersions;
}
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get; set; }
/// <summary>
/// Gets or sets the year.
/// </summary>
public int? Year { get; set; }
/// <summary>
/// Gets or sets the files.
/// </summary>
/// <value>The files.</value>
public IReadOnlyList<AudioBookFileInfo> Files { get; set; }
/// <summary>
/// Gets or sets the extras.
/// </summary>
/// <value>The extras.</value>
public IReadOnlyList<AudioBookFileInfo> Extras { get; set; }
/// <summary>
/// Gets or sets the alternate versions.
/// </summary>
/// <value>The alternate versions.</value>
public IReadOnlyList<AudioBookFileInfo> AlternateVersions { get; set; }
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookListResolver.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Emby.Naming.Common;
using Emby.Naming.Video;
using MediaBrowser.Model.IO;
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Class used to resolve Name, Year, alternative files and extras from stack of files.
/// </summary>
public class AudioBookListResolver
{
private readonly NamingOptions _options;
private readonly AudioBookResolver _audioBookResolver;
/// <summary>
/// Initializes a new instance of the <see cref="AudioBookListResolver"/> class.
/// </summary>
/// <param name="options">Naming options passed along to <see cref="AudioBookResolver"/> and <see cref="AudioBookNameParser"/>.</param>
public AudioBookListResolver(NamingOptions options)
{
_options = options;
_audioBookResolver = new AudioBookResolver(_options);
}
/// <summary>
/// Resolves Name, Year and differentiate alternative files and extras from regular audiobook files.
/// </summary>
/// <param name="files">List of files related to audiobook.</param>
/// <returns>Returns IEnumerable of <see cref="AudioBookInfo"/>.</returns>
public IEnumerable<AudioBookInfo> Resolve(IEnumerable<FileSystemMetadata> files)
{
// File with empty fullname will be sorted out here.
var audiobookFileInfos = files
.Select(i => _audioBookResolver.Resolve(i.FullName))
.OfType<AudioBookFileInfo>();
var stackResult = StackResolver.ResolveAudioBooks(audiobookFileInfos);
foreach (var stack in stackResult)
{
var stackFiles = stack.Files
.Select(i => _audioBookResolver.Resolve(i))
.OfType<AudioBookFileInfo>()
.ToList();
stackFiles.Sort();
var nameParserResult = new AudioBookNameParser(_options).Parse(stack.Name);
FindExtraAndAlternativeFiles(ref stackFiles, out var extras, out var alternativeVersions, nameParserResult);
var info = new AudioBookInfo(
nameParserResult.Name,
nameParserResult.Year,
stackFiles,
extras,
alternativeVersions);
yield return info;
}
}
private void FindExtraAndAlternativeFiles(ref List<AudioBookFileInfo> stackFiles, out List<AudioBookFileInfo> extras, out List<AudioBookFileInfo> alternativeVersions, AudioBookNameParserResult nameParserResult)
{
extras = new List<AudioBookFileInfo>();
alternativeVersions = new List<AudioBookFileInfo>();
var haveChaptersOrPages = stackFiles.Any(x => x.ChapterNumber is not null || x.PartNumber is not null);
var groupedBy = stackFiles.GroupBy(file => new { file.ChapterNumber, file.PartNumber });
var nameWithReplacedDots = nameParserResult.Name.Replace(' ', '.');
foreach (var group in groupedBy)
{
if (group.Key.ChapterNumber is null && group.Key.PartNumber is null)
{
if (group.Count() > 1 || haveChaptersOrPages)
{
List<AudioBookFileInfo>? ex = null;
List<AudioBookFileInfo>? alt = null;
foreach (var audioFile in group)
{
var name = Path.GetFileNameWithoutExtension(audioFile.Path.AsSpan());
if (name.Equals("audiobook", StringComparison.OrdinalIgnoreCase)
|| name.Contains(nameParserResult.Name, StringComparison.OrdinalIgnoreCase)
|| name.Contains(nameWithReplacedDots, StringComparison.OrdinalIgnoreCase))
{
(alt ??= new()).Add(audioFile);
}
else
{
(ex ??= new()).Add(audioFile);
}
}
if (ex is not null)
{
var extra = ex
.OrderBy(x => x.Container)
.ThenBy(x => x.Path)
.ToList();
stackFiles = stackFiles.Except(extra).ToList();
extras.AddRange(extra);
}
if (alt is not null)
{
var alternatives = alt
.OrderBy(x => x.Container)
.ThenBy(x => x.Path)
.ToList();
var main = FindMainAudioBookFile(alternatives, nameParserResult.Name);
alternatives.Remove(main);
stackFiles = stackFiles.Except(alternatives).ToList();
alternativeVersions.AddRange(alternatives);
}
}
}
else if (group.Count() > 1)
{
var alternatives = group
.OrderBy(x => x.Container)
.ThenBy(x => x.Path)
.Skip(1)
.ToList();
stackFiles = stackFiles.Except(alternatives).ToList();
alternativeVersions.AddRange(alternatives);
}
}
}
private AudioBookFileInfo FindMainAudioBookFile(List<AudioBookFileInfo> files, string name)
{
var main = files.Find(x => Path.GetFileNameWithoutExtension(x.Path).Equals(name, StringComparison.OrdinalIgnoreCase));
main ??= files.FirstOrDefault(x => Path.GetFileNameWithoutExtension(x.Path).Equals("audiobook", StringComparison.OrdinalIgnoreCase));
main ??= files.OrderBy(x => x.Container)
.ThenBy(x => x.Path)
.First();
return main;
}
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookNameParser.cs
================================================
using System.Globalization;
using System.Text.RegularExpressions;
using Emby.Naming.Common;
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Helper class to retrieve name and year from audiobook previously retrieved name.
/// </summary>
public class AudioBookNameParser
{
private readonly NamingOptions _options;
/// <summary>
/// Initializes a new instance of the <see cref="AudioBookNameParser"/> class.
/// </summary>
/// <param name="options">Naming options containing AudioBookNamesExpressions.</param>
public AudioBookNameParser(NamingOptions options)
{
_options = options;
}
/// <summary>
/// Parse name and year from previously determined name of audiobook.
/// </summary>
/// <param name="name">Name of the audiobook.</param>
/// <returns>Returns <see cref="AudioBookNameParserResult"/> object.</returns>
public AudioBookNameParserResult Parse(string name)
{
AudioBookNameParserResult result = default;
foreach (var expression in _options.AudioBookNamesExpressions)
{
var match = Regex.Match(name, expression, RegexOptions.IgnoreCase);
if (match.Success)
{
if (result.Name is null)
{
var value = match.Groups["name"];
if (value.Success)
{
result.Name = value.Value;
}
}
if (!result.Year.HasValue)
{
var value = match.Groups["year"];
if (value.Success)
{
if (int.TryParse(value.ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue))
{
result.Year = intValue;
}
}
}
}
}
if (string.IsNullOrEmpty(result.Name))
{
result.Name = name;
}
return result;
}
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookNameParserResult.cs
================================================
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Data object used to pass result of name and year parsing.
/// </summary>
public struct AudioBookNameParserResult
{
/// <summary>
/// Gets or sets name of audiobook.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Gets or sets optional year of release.
/// </summary>
public int? Year { get; set; }
}
}
================================================
FILE: Emby.Naming/AudioBook/AudioBookResolver.cs
================================================
using System;
using System.IO;
using Emby.Naming.Common;
using Jellyfin.Extensions;
namespace Emby.Naming.AudioBook
{
/// <summary>
/// Resolve specifics (path, container, partNumber, chapterNumber) about audiobook file.
/// </summary>
public class AudioBookResolver
{
private readonly NamingOptions _options;
/// <summary>
/// Initializes a new instance of the <see cref="AudioBookResolver"/> class.
/// </summary>
/// <param name="options"><see cref="NamingOptions"/> containing AudioFileExtensions and also used to pass to AudioBookFilePathParser.</param>
public AudioBookResolver(NamingOptions options)
{
_options = options;
}
/// <summary>
/// Resolve specifics (path, container, partNumber, chapterNumber) about audiobook file.
/// </summary>
/// <param name="path">Path to audiobook file.</param>
/// <returns>Returns <see cref="AudioBookResolver"/> object.</returns>
public AudioBookFileInfo? Resolve(string path)
{
if (path.Length == 0 || Path.GetFileNameWithoutExtension(path).Length == 0)
{
// Return null to indicate this path will not be used, instead of stopping whole process with exception
return null;
}
var extension = Path.GetExtension(path);
// Check supported extensions
if (!_options.AudioFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
{
return null;
}
var container = extension.TrimStart('.');
var parsingResult = new AudioBookFilePathParser(_options).Parse(path);
return new AudioBookFileInfo(
path,
container,
chapterNumber: parsingResult.ChapterNumber,
partNumber: parsingResult.PartNumber);
}
}
}
================================================
FILE: Emby.Naming/Book/BookFileNameParser.cs
================================================
using System.Text.RegularExpressions;
namespace Emby.Naming.Book
{
/// <summary>
/// Helper class to retrieve basic metadata from a book filename.
/// </summary>
public static class BookFileNameParser
{
private const string NameMatchGroup = "name";
private const string IndexMatchGroup = "index";
private const string YearMatchGroup = "year";
private const string SeriesNameMatchGroup = "seriesName";
private static readonly Regex[] _nameMatches =
[
// seriesName (seriesYear) #index (of count) (year) where only seriesName and index are required
new Regex(@"^(?<seriesName>.+?)((\s\((?<seriesYear>[0-9]{4})\))?)\s#(?<index>[0-9]+)((\s\(of\s(?<count>[0-9]+)\))?)((\s\((?<year>[0-9]{4})\))?)$"),
new Regex(@"^(?<name>.+?)\s\((?<seriesName>.+?),\s#(?<index>[0-9]+)\)((\s\((?<year>[0-9]{4})\))?)$"),
new Regex(@"^(?<index>[0-9]+)\s\-\s(?<name>.+?)((\s\((?<year>[0-9]{4})\))?)$"),
new Regex(@"(?<name>.*)\((?<year>[0-9]{4})\)"),
// last resort matches the whole string as the name
new Regex(@"(?<name>.*)")
];
/// <summary>
/// Parse a filename name to retrieve the book name, series name, index, and year.
/// </summary>
/// <param name="name">Book filename to parse for information.</param>
/// <returns>Returns <see cref="BookFileNameParserResult"/> object.</returns>
public static BookFileNameParserResult Parse(string? name)
{
var result = new BookFileNameParserResult();
if (name == null)
{
return result;
}
foreach (var regex in _nameMatches)
{
var match = regex.Match(name);
if (!match.Success)
{
continue;
}
if (match.Groups.TryGetValue(NameMatchGroup, out Group? nameGroup) && nameGroup.Success)
{
result.Name = nameGroup.Value.Trim();
}
if (match.Groups.TryGetValue(IndexMatchGroup, out Group? indexGroup) && indexGroup.Success && int.TryParse(indexGroup.Value, out var index))
{
result.Index = index;
}
if (match.Groups.TryGetValue(YearMatchGroup, out Group? yearGroup) && yearGroup.Success && int.TryParse(yearGroup.Value, out var year))
{
result.Year = year;
}
if (match.Groups.TryGetValue(SeriesNameMatchGroup, out Group? seriesGroup) && seriesGroup.Success)
{
result.SeriesName = seriesGroup.Value.Trim();
}
break;
}
return result;
}
}
}
================================================
FILE: Emby.Naming/Book/BookFileNameParserResult.cs
================================================
using System;
namespace Emby.Naming.Book
{
/// <summary>
/// Data object used to pass metadata parsed from a book filename.
/// </summary>
public class BookFileNameParserResult
{
/// <summary>
/// Initializes a new instance of the <see cref="BookFileNameParserResult"/> class.
/// </summary>
public BookFileNameParserResult()
{
Name = null;
Index = null;
Year = null;
SeriesName = null;
}
/// <summary>
/// Gets or sets the name of the book.
/// </summary>
public string? Name { get; set; }
/// <summary>
/// Gets or sets the book index.
/// </summary>
public int? Index { get; set; }
/// <summary>
/// Gets or sets the publication year.
/// </summary>
public int? Year { get; set; }
/// <summary>
/// Gets or sets the series name.
/// </summary>
public string? SeriesName { get; set; }
}
}
================================================
FILE: Emby.Naming/Common/EpisodeExpression.cs
================================================
using System;
using System.Text.RegularExpressions;
namespace Emby.Naming.Common
{
/// <summary>
/// Regular expressions for parsing TV Episodes.
/// </summary>
public class EpisodeExpression
{
private string _expression;
private Regex? _regex;
/// <summary>
/// Initializes a new instance of the <see cref="EpisodeExpression"/> class.
/// </summary>
/// <param name="expression">Regular expressions.</param>
/// <param name="byDate">True if date is expected.</param>
public EpisodeExpression(string expression, bool byDate = false)
{
_expression = expression;
IsByDate = byDate;
DateTimeFormats = Array.Empty<string>();
SupportsAbsoluteEpisodeNumbers = true;
}
/// <summary>
/// Gets or sets raw expressions string.
/// </summary>
public string Expression
{
get => _expression;
set
{
_expression = value;
_regex = null;
}
}
/// <summary>
/// Gets or sets a value indicating whether gets or sets property indicating if date can be find in expression.
/// </summary>
public bool IsByDate { get; set; }
/// <summary>
/// Gets or sets a value indicating whether gets or sets property indicating if expression is optimistic.
/// </summary>
public bool IsOptimistic { get; set; }
/// <summary>
/// Gets or sets a value indicating whether gets or sets property indicating if expression is named.
/// </summary>
public bool IsNamed { get; set; }
/// <summary>
/// Gets or sets a value indicating whether gets or sets property indicating if expression supports episodes with absolute numbers.
/// </summary>
public bool SupportsAbsoluteEpisodeNumbers { get; set; }
/// <summary>
/// Gets or sets optional list of date formats used for date parsing.
/// </summary>
public string[] DateTimeFormats { get; set; }
/// <summary>
/// Gets a <see cref="Regex"/> expressions objects (creates it if null).
/// </summary>
public Regex Regex => _regex ??= new Regex(Expression, RegexOptions.IgnoreCase | RegexOptions.Compiled);
}
}
================================================
FILE: Emby.Naming/Common/MediaType.cs
================================================
namespace Emby.Naming.Common
{
/// <summary>
/// Type of audiovisual media.
/// </summary>
public enum MediaType
{
/// <summary>
/// The audio.
/// </summary>
Audio = 0,
/// <summary>
/// The photo.
/// </summary>
Photo = 1,
/// <summary>
/// The video.
/// </summary>
Video = 2
}
}
================================================
FILE: Emby.Naming/Common/NamingOptions.cs
================================================
#pragma warning disable CA1819
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Emby.Naming.Video;
using MediaBrowser.Model.Entities;
// ReSharper disable StringLiteralTypo
namespace Emby.Naming.Common
{
/// <summary>
/// Big ugly class containing lot of different naming options that should be split and injected instead of passes everywhere.
/// </summary>
public class NamingOptions
{
/// <summary>
/// Initializes a new instance of the <see cref="NamingOptions"/> class.
/// </summary>
public NamingOptions()
{
VideoFileExtensions =
[
".001",
".3g2",
".3gp",
".amv",
".asf",
".asx",
".avi",
".bin",
".bivx",
".divx",
".dv",
".dvr-ms",
".f4v",
".fli",
".flv",
".ifo",
".img",
".iso",
".m2t",
".m2ts",
".m2v",
".m4v",
".mkv",
".mk3d",
".mov",
".mp4",
".mpe",
".mpeg",
".mpg",
".mts",
".mxf",
".nrg",
".nsv",
".nuv",
".ogg",
".ogm",
".ogv",
".pva",
".qt",
".rec",
".rm",
".rmvb",
".strm",
".svq3",
".tp",
".ts",
".ty",
".viv",
".vob",
".vp3",
".webm",
".wmv",
".wtv",
".xvid"
];
VideoFlagDelimiters =
[
'(',
')',
'-',
'.',
'_',
'[',
']'
];
StubFileExtensions =
[
".disc"
];
StubTypes =
[
new StubTypeRule(
stubType: "dvd",
token: "dvd"),
new StubTypeRule(
stubType: "hddvd",
token: "hddvd"),
new StubTypeRule(
stubType: "bluray",
token: "bluray"),
new StubTypeRule(
stubType: "bluray",
token: "brrip"),
new StubTypeRule(
stubType: "bluray",
token: "bd25"),
new StubTypeRule(
stubType: "bluray",
token: "bd50"),
new StubTypeRule(
stubType: "vhs",
token: "vhs"),
new StubTypeRule(
stubType: "tv",
token: "HDTV"),
new StubTypeRule(
stubType: "tv",
token: "PDTV"),
new StubTypeRule(
stubType: "tv",
token: "DSR")
];
VideoFileStackingRules =
[
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[0-9]+)[\)\]]?(?:\.[^.]+)?$", true),
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[a-d])[\)\]]?(?:\.[^.]+)?$", false)
];
CleanDateTimes =
[
@"(.+[^_\,\.\(\)\[\]\-])[_\.\(\)\[\]\-](19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*",
@"(.+[^_\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*"
];
CleanStrings =
[
@"^\s*(?<cleaned>.+?)[ _\,\.\(\)\[\]\-](3d|sbs|tab|hsbs|htab|mvc|HDR|HDC|UHD|UltraHD|4k|ac3|dts|custom|dc|divx|divx5|dsr|dsrip|dutch|dvd|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multi|subs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|cd[1-9]|r5|bd5|bd|se|svcd|swedish|german|read.nfo|nfofix|unrated|ws|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|2160p|hrhd|hrhdtv|hddvd|bluray|blu-ray|x264|x265|h264|h265|xvid|xvidvd|xxx|www.www|AAC|DTS|\[.*\])([ _\,\.\(\)\[\]\-]|$)",
@"^(?<cleaned>.+?)(\[.*\])",
@"^\s*(?<cleaned>.+?)\WE[0-9]+(-|~)E?[0-9]+(\W|$)",
@"^\s*\[[^\]]+\](?!\.\w+$)\s*(?<cleaned>.+)",
@"^\s*(?<cleaned>.+?)\s+-\s+[0-9]+\s*$",
@"^\s*(?<cleaned>.+?)(([-._ ](trailer|sample))|-(scene|clip|behindthescenes|deleted|deletedscene|featurette|short|interview|other|extra))$"
];
SubtitleFileExtensions =
[
".ass",
".mks",
".sami",
".smi",
".srt",
".ssa",
".sub",
".sup",
".vtt",
];
LyricFileExtensions =
[
".lrc",
".elrc",
".txt"
];
AlbumStackingPrefixes =
[
"cd",
"digital media",
"disc",
"disk",
"vol",
"volume",
"part",
"act"
];
ArtistSubfolders =
[
"albums",
"broadcasts",
"bootlegs",
"compilations",
"dj-mixes",
"eps",
"live",
"mixtapes",
"others",
"remixes",
"singles",
"soundtracks",
"spokenwords",
"streets"
];
AudioFileExtensions =
[
".669",
".3gp",
".aa",
".aac",
".aax",
".ac3",
".act",
".adp",
".adplug",
".adx",
".afc",
".amf",
".aif",
".aifc",
".aiff",
".alac",
".amr",
".ape",
".ast",
".au",
".awb",
".cda",
".cue",
".dmf",
".dsf",
".dsm",
".dsp",
".dts",
".dvf",
".eac3",
".ec3",
".far",
".flac",
".gdm",
".gsm",
".gym",
".hps",
".imf",
".it",
".m15",
".m4a",
".m4b",
".mac",
".med",
".mka",
".mmf",
".mod",
".mogg",
".mp2",
".mp3",
".mpa",
".mpc",
".mpp",
".mp+",
".msv",
".nmf",
".nsf",
".nsv",
".oga",
".ogg",
".okt",
".opus",
".pls",
".ra",
".rf64",
".rm",
".s3m",
".sfx",
".shn",
".sid",
".stm",
".strm",
".ult",
".uni",
".vox",
".wav",
".wma",
".wv",
".xm",
".xsp",
".ymf"
];
MediaFlagDelimiters =
[
'.'
];
MediaForcedFlags =
[
"foreign",
"forced"
];
MediaDefaultFlags =
[
"default"
];
MediaHearingImpairedFlags =
[
"cc",
"hi",
"sdh"
];
EpisodeExpressions =
[
// *** Begin Kodi Standard Naming
// <!-- foo.s01.e01, foo.s01_e01, S01E02 foo, S01 - E02 -->
new EpisodeExpression(@".*(\\|\/)(?<seriesname>((?[][ ._-]*[Ee]([0-9]+))[^\\\/])*)?[Ss](?<seasonnumber>[0-9]+)[][ ._-]*[Ee](?<epnumber>[0-9]+)([^\\/]*)$")
{
IsNamed = true
},
// <!-- foo.ep01, foo.EP_01 -->
new EpisodeExpression(@"[\._ -]()[Ee][Pp]_?([0-9]+)([^\\/]*)$"),
// <!-- foo.E01., foo.e01. -->
new EpisodeExpression(@"[^\\/]*?()\.?[Ee]([0-9]+)\.([^\\/]*)$"),
new EpisodeExpression("(?<year>[0-9]{4})[._ -](?<month>[0-9]{2})[._ -](?<day>[0-9]{2})", true)
{
DateTimeFormats =
[
"yyyy.MM.dd",
"yyyy-MM-dd",
"yyyy_MM_dd",
"yyyy MM dd"
]
},
new EpisodeExpression("(?<day>[0-9]{2})[._ -](?<month>[0-9]{2})[._ -](?<year>[0-9]{4})", true)
{
DateTimeFormats =
[
"dd.MM.yyyy",
"dd-MM-yyyy",
"dd_MM_yyyy",
"dd MM yyyy"
]
},
// This isn't a Kodi naming rule, but the expression below causes false episode numbers for
// Title Season X Episode X naming schemes.
// "Series Season X Episode X - Title.avi", "Series S03 E09.avi", "s3 e9 - Title.avi"
new EpisodeExpression(@".*[\\\/]((?<seriesname>[^\\/]+?)\s)?[Ss](?:eason)?\s*(?<seasonnumber>[0-9]+)\s+[Ee](?:pisode)?\s*(?<epnumber>[0-9]+).*$")
{
IsNamed = true
},
// Not a Kodi rule as well, but the expression below also causes false positives,
// so we make sure this one gets tested first.
// "Foo Bar 889"
new EpisodeExpression(@".*[\\\/](?![Ee]pisode)(?<seriesname>[\w\s]+?)\s(?<epnumber>[0-9]{1,4})(-(?<endingepnumber>[0-9]{2,4}))*[^\\\/x]*$")
{
IsNamed = true
},
new EpisodeExpression(@"[\\\/\._ \[\(-]([0-9]+)x([0-9]+(?:(?:[a-i]|\.[1-9])(?![0-9]))?)([^\\\/]*)$")
{
SupportsAbsoluteEpisodeNumbers = true
},
// Not a Kodi rule as well, but below rule also causes false positives for triple-digit episode names
// [bar] Foo - 1 [baz] special case of below expression to prevent false positives with digits in the series name
new EpisodeExpression(@".*[\\\/]?.*?(\[.*?\])+.*?(?<seriesname>[-\w\s]+?)[\s_]*-[\s_]*(?<epnumber>[0-9]+).*$")
{
IsNamed = true
},
// /server/anything_102.mp4
// /server/james.corden.2017.04.20.anne.hathaway.720p.hdtv.x264-crooks.mkv
// /server/anything_1996.11.14.mp4
new EpisodeExpression(@"[\\/._ -](?<seriesname>(?![0-9]+[0-9][0-9])([^\\\/_])*)[\\\/._ -](?<seasonnumber>[0-9]+)(?<epnumber>[0-9][0-9](?:(?:[a-i]|\.[1-9])(?![0-9]))?)([._ -][^\\\/]*)$")
{
IsOptimistic = true,
IsNamed = true,
SupportsAbsoluteEpisodeNumbers = false
},
new EpisodeExpression(@"[\/._ -]p(?:ar)?t[_. -]()([ivx]+|[0-9]+)([._ -][^\/]*)$")
{
SupportsAbsoluteEpisodeNumbers = true
},
// *** End Kodi Standard Naming
// "Episode 16", "Episode 16 - Title"
new EpisodeExpression(@"[Ee]pisode (?<epnumber>[0-9]+)(-(?<endingepnumber>[0-9]+))?[^\\\/]*$")
{
IsNamed = true
},
new EpisodeExpression(@".*(\\|\/)[sS]?(?<seasonnumber>[0-9]+)[xX](?<epnumber>[0-9]+)[^\\\/]*$")
{
IsNamed = true
},
new EpisodeExpression(@".*(\\|\/)[sS](?<seasonnumber>[0-9]+)[x,X]?[eE](?<epnumber>[0-9]+)[^\\\/]*$")
{
IsNamed = true
},
new EpisodeExpression(@".*(\\|\/)(?<seriesname>((?![sS]?[0-9]{1,4}[xX][0-9]{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]+))[^\\\/]*$")
{
IsNamed = true
},
new EpisodeExpression(@".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>[0-9]{1,4})[xX\.]?[eE](?<epnumber>[0-9]+)[^\\\/]*$")
{
IsNamed = true
},
// "01.avi"
new EpisodeExpression(@".*[\\\/](?<epnumber>[0-9]+)(-(?<endingepnumber>[0-9]+))*\.\w+$")
{
IsOptimistic = true,
IsNamed = true
},
// "1-12 episode title"
new EpisodeExpression("([0-9]+)-([0-9]+)"),
// "01 - blah.avi", "01-blah.avi"
new EpisodeExpression(@".*(\\|\/)(?<epnumber>[0-9]{1,3})(-(?<endingepnumber>[0-9]{2,3}))*\s?-\s?[^\\\/]*$")
{
IsOptimistic = true,
IsNamed = true
},
// "01.blah.avi"
new EpisodeExpression(@".*(\\|\/)(?<epnumber>[0-9]{1,3})(-(?<endingepnumber>[0-9]{2,3}))*\.[^\\\/]+$")
{
IsOptimistic = true,
IsNamed = true
},
// "blah - 01.avi", "blah 2 - 01.avi", "blah - 01 blah.avi", "blah 2 - 01 blah", "blah - 01 - blah.avi", "blah 2 - 01 - blah"
new EpisodeExpression(@".*[\\\/][^\\\/]* - (?<epnumber>[0-9]{1,3})(-(?<endingepnumber>[0-9]{2,3}))*[^\\\/]*$")
{
IsOptimistic = true,
IsNamed = true
},
// "01 episode title.avi"
new EpisodeExpression(@"[Ss]eason[\._ ](?<seasonnumber>[0-9]+)[\\\/](?<epnumber>[0-9]{1,3})([^\\\/]*)$")
{
IsOptimistic = true,
IsNamed = true
},
// Series and season only expression
// "the show/season 1", "the show/s01"
new EpisodeExpression(@"(.*(\\|\/))*(?<seriesname>.+)\/[Ss](eason)?[\. _\-]*(?<seasonnumber>[0-9]+)")
{
IsNamed = true
},
// Series and season only expression
// "the show S01", "the show season 1"
new EpisodeExpression(@"(.*(\\|\/))*(?<seriesname>.+)[\. _\-]+[sS](eason)?[\. _\-]*(?<seasonnumber>[0-9]+)")
{
IsNamed = true
},
// Anime style expression
// "[Group][Series Name][21][1080p][FLAC][HASH]"
// "[Group] Series Name [04][BDRIP]"
new EpisodeExpression(@"(?:\[(?:[^\]]+)\]\s*)?(?<seriesname>\[[^\]]+\]|[^[\]]+)\s*\[(?<epnumber>[0-9]+)\]")
{
IsNamed = true
},
];
VideoExtraRules =
[
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.DirectoryName,
"trailers",
MediaType.Video),
new ExtraRule(
ExtraType.ThemeVideo,
ExtraRuleType.DirectoryName,
"backdrops",
MediaType.Video),
new ExtraRule(
ExtraType.ThemeSong,
ExtraRuleType.DirectoryName,
"theme-music",
MediaType.Audio),
new ExtraRule(
ExtraType.BehindTheScenes,
ExtraRuleType.DirectoryName,
"behind the scenes",
MediaType.Video),
new ExtraRule(
ExtraType.DeletedScene,
ExtraRuleType.DirectoryName,
"deleted scenes",
MediaType.Video),
new ExtraRule(
ExtraType.Interview,
ExtraRuleType.DirectoryName,
"interviews",
MediaType.Video),
new ExtraRule(
ExtraType.Scene,
ExtraRuleType.DirectoryName,
"scenes",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.DirectoryName,
"samples",
MediaType.Video),
new ExtraRule(
ExtraType.Short,
ExtraRuleType.DirectoryName,
"shorts",
MediaType.Video),
new ExtraRule(
ExtraType.Featurette,
ExtraRuleType.DirectoryName,
"featurettes",
MediaType.Video),
new ExtraRule(
ExtraType.Unknown,
ExtraRuleType.DirectoryName,
"extras",
MediaType.Video),
new ExtraRule(
ExtraType.Unknown,
ExtraRuleType.DirectoryName,
"extra",
MediaType.Video),
new ExtraRule(
ExtraType.Unknown,
ExtraRuleType.DirectoryName,
"other",
MediaType.Video),
new ExtraRule(
ExtraType.Clip,
ExtraRuleType.DirectoryName,
"clips",
MediaType.Video),
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.Filename,
"trailer",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Filename,
"sample",
MediaType.Video),
new ExtraRule(
ExtraType.ThemeSong,
ExtraRuleType.Filename,
"theme",
MediaType.Audio),
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.Suffix,
"-trailer",
MediaType.Video),
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.Suffix,
".trailer",
MediaType.Video),
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.Suffix,
"_trailer",
MediaType.Video),
new ExtraRule(
ExtraType.Trailer,
ExtraRuleType.Suffix,
"- trailer",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Suffix,
"-sample",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Suffix,
".sample",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Suffix,
"_sample",
MediaType.Video),
new ExtraRule(
ExtraType.Sample,
ExtraRuleType.Suffix,
"- sample",
MediaType.Video),
new ExtraRule(
ExtraType.Scene,
ExtraRuleType.Suffix,
"-scene",
MediaType.Video),
new ExtraRule(
ExtraType.Clip,
ExtraRuleType.Suffix,
"-clip",
MediaType.Video),
new ExtraRule(
ExtraType.Interview,
ExtraRuleType.Suffix,
"-interview",
MediaType.Video),
new ExtraRule(
ExtraType.BehindTheScenes,
ExtraRuleType.Suffix,
"-behindthescenes",
MediaType.Video),
new ExtraRule(
ExtraType.DeletedScene,
ExtraRuleType.Suffix,
"-deleted",
MediaType.Video),
new ExtraRule(
ExtraType.DeletedScene,
ExtraRuleType.Suffix,
"-deletedscene",
MediaType.Video),
new ExtraRule(
ExtraType.Featurette,
ExtraRuleType.Suffix,
"-featurette",
MediaType.Video),
new ExtraRule(
ExtraType.Short,
ExtraRuleType.Suffix,
"-short",
MediaType.Video),
new ExtraRule(
ExtraType.Unknown,
ExtraRuleType.Suffix,
"-extra",
MediaType.Video),
new ExtraRule(
ExtraType.Unknown,
ExtraRuleType.Suffix,
"-other",
MediaType.Video)
];
AllExtrasTypesFolderNames = VideoExtraRules
.Where(i => i.RuleType == ExtraRuleType.DirectoryName)
.ToDictionary(i => i.Token, i => i.ExtraType, StringComparer.OrdinalIgnoreCase);
Format3DRules =
[
// Kodi rules:
new Format3DRule(
precedingToken: "3d",
token: "hsbs"),
new Format3DRule(
precedingToken: "3d",
token: "sbs"),
new Format3DRule(
precedingToken: "3d",
token: "htab"),
new Format3DRule(
precedingToken: "3d",
token: "tab"),
// Media Browser rules:
new Format3DRule("fsbs"),
new Format3DRule("hsbs"),
new Format3DRule("sbs"),
new Format3DRule("ftab"),
new Format3DRule("htab"),
new Format3DRule("tab"),
new Format3DRule("sbs3d"),
new Format3DRule("mvc")
];
AudioBookPartsExpressions =
[
// Detect specified chapters, like CH 01
@"ch(?:apter)?[\s_-]?(?<chapter>[0-9]+)",
// Detect specified parts, like Part 02
@"p(?:ar)?t[\s_-]?(?<part>[0-9]+)",
// Chapter is often beginning of filename
"^(?<chapter>[0-9]+)",
// Part if often ending of filename
"(?<!ch(?:apter) )(?<part>[0-9]+)$",
// Sometimes named as 0001_005 (chapter_part)
"(?<chapter>[0-9]+)_(?<part>[0-9]+)",
// Some audiobooks are ripped from cd's, and will be named by disk number.
@"dis(?:c|k)[\s_-]?(?<chapter>[0-9]+)"
];
AudioBookNamesExpressions =
[
// Detect year usually in brackets after name Batman (2020)
@"^(?<name>.+?)\s*\(\s*(?<year>[0-9]{4})\s*\)\s*$",
@"^\s*(?<name>[^ ].*?)\s*$"
];
MultipleEpisodeExpressions = new[]
{
@".*(\\|\/)[sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3})((-| - )[0-9]{1,4}[eExX](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)[sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3})((-| - )[0-9]{1,4}[xX][eE](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)[sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3})((-| - )?[xXeE](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)[sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3})(-[xE]?[eE]?(?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)(?<seriesname>((?![sS]?[0-9]{1,4}[xX][0-9]{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3}))((-| - )[0-9]{1,4}[xXeE](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)(?<seriesname>((?![sS]?[0-9]{1,4}[xX][0-9]{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3}))((-| - )[0-9]{1,4}[xX][eE](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)(?<seriesname>((?![sS]?[0-9]{1,4}[xX][0-9]{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3}))((-| - )?[xXeE](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)(?<seriesname>((?![sS]?[0-9]{1,4}[xX][0-9]{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>[0-9]{1,4})[xX](?<epnumber>[0-9]{1,3}))(-[xX]?[eE]?(?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>[0-9]{1,4})[xX\.]?[eE](?<epnumber>[0-9]{1,3})((-| - )?[xXeE](?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$",
@".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>[0-9]{1,4})[xX\.]?[eE](?<epnumber>[0-9]{1,3})(-[xX]?[eE]?(?<endingepnumber>[0-9]{1,3}))+[^\\\/]*$"
}.Select(i => new EpisodeExpression(i)
{
IsNamed = true
}).ToArray();
Compile();
}
/// <summary>
/// Gets or sets the folder name to extra types mapping.
/// </summary>
public Dictionary<string, ExtraType> AllExtrasTypesFolderNames { get; set; }
/// <summary>
/// Gets or sets list of audio file extensions.
/// </summary>
public string[] AudioFileExtensions { get; set; }
/// <summary>
/// Gets or sets list of external media flag delimiters.
/// </summary>
public char[] MediaFlagDelimiters { get; set; }
/// <summary>
/// Gets or sets list of external media forced flags.
/// </summary>
public string[] MediaForcedFlags { get; set; }
/// <summary>
/// Gets or sets list of external media default flags.
/// </summary>
public string[] MediaDefaultFlags { get; set; }
/// <summary>
/// Gets or sets list of external media hearing impaired flags.
/// </summary>
public string[] MediaHearingImpairedFlags { get; set; }
/// <summary>
/// Gets or sets list of album stacking prefixes.
/// </summary>
public string[] AlbumStackingPrefixes { get; set; }
/// <summary>
/// Gets or sets list of artist subfolders.
/// </summary>
public string[] ArtistSubfolders { get; set; }
/// <summary>
/// Gets or sets list of subtitle file extensions.
/// </summary>
public string[] SubtitleFileExtensions { get; set; }
/// <summary>
/// Gets the list of lyric file extensions.
/// </summary>
public string[] LyricFileExtensions { get; }
/// <summary>
/// Gets or sets list of episode regular expressions.
/// </summary>
public EpisodeExpression[] EpisodeExpressions { get; set; }
/// <summary>
/// Gets or sets list of video file extensions.
/// </summary>
public string[] VideoFileExtensions { get; set; }
/// <summary>
/// Gets or sets list of video stub file extensions.
/// </summary>
public string[] StubFileExtensions { get; set; }
/// <summary>
/// Gets or sets list of raw audiobook parts regular expressions strings.
/// </summary>
public string[] AudioBookPartsExpressions { get; set; }
/// <summary>
/// Gets or sets list of raw audiobook names regular expressions strings.
/// </summary>
public string[] AudioBookNamesExpressions { get; set; }
/// <summary>
/// Gets or sets list of stub type rules.
/// </summary>
public StubTypeRule[] StubTypes { get; set; }
/// <summary>
/// Gets or sets list of video flag delimiters.
/// </summary>
public char[] VideoFlagDelimiters { get; set; }
/// <summary>
/// Gets or sets list of 3D Format rules.
/// </summary>
public Format3DRule[] Format3DRules { get; set; }
/// <summary>
/// Gets the file stacking rules.
/// </summary>
public FileStackRule[] VideoFileStackingRules { get; }
/// <summary>
/// Gets or sets list of raw clean DateTimes regular expressions strings.
/// </summary>
public string[] CleanDateTimes { get; set; }
/// <summary>
/// Gets or sets list of raw clean strings regular expressions strings.
/// </summary>
public string[] CleanStrings { get; set; }
/// <summary>
/// Gets or sets list of multi-episode regular expressions.
/// </summary>
public EpisodeExpression[] MultipleEpisodeExpressions { get; set; }
/// <summary>
/// Gets or sets list of extra rules for videos.
/// </summary>
public ExtraRule[] VideoExtraRules { get; set; }
/// <summary>
/// Gets list of clean datetime regular expressions.
/// </summary>
public Regex[] CleanDateTimeRegexes { get; private set; } = [];
/// <summary>
/// Gets list of clean string regular expressions.
/// </summary>
public Regex[] CleanStringRegexes { get; private set; } = [];
/// <summary>
/// Compiles raw regex strings into regexes.
/// </summary>
public void Compile()
{
CleanDateTimeRegexes = CleanDateTimes.Select(Compile).ToArray();
CleanStringRegexes = CleanStrings.Select(Compile).ToArray();
}
private Regex Compile(string exp)
{
return new Regex(exp, RegexOptions.IgnoreCase | RegexOptions.Compiled);
}
}
}
================================================
FILE: Emby.Naming/Emby.Naming.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
<!-- ProjectGuid is only included as a requirement for SonarQube analysis -->
<PropertyGroup>
<ProjectGuid>{E5AF7B26-2239-4CE0-B477-0AA2018EDAA2}</ProjectGuid>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Stability)'=='Unstable'">
<!-- Include all symbols in the main nupkg until Azure Artifact Feed starts supporting ingesting NuGet symbol packages. -->
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
</PropertyGroup>
<ItemGroup>
<Compile Include="../SharedVersion.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../MediaBrowser.Common/MediaBrowser.Common.csproj" />
<ProjectReference Include="../MediaBrowser.Model/MediaBrowser.Model.csproj" />
</ItemGroup>
<PropertyGroup>
<Authors>Jellyfin Contributors</Authors>
<PackageId>Jellyfin.Naming</PackageId>
<VersionPrefix>10.12.0</VersionPrefix>
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
</PropertyGroup>
<!-- Code Analyzers -->
<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<PackageReference Include="IDisposableAnalyzers">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="SerilogAnalyzer" PrivateAssets="All" />
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
<PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" PrivateAssets="All" />
</ItemGroup>
</Project>
================================================
FILE: Emby.Naming/ExternalFiles/ExternalPathParser.cs
================================================
using System;
using System.IO;
using System.Linq;
using Emby.Naming.Common;
using Jellyfin.Extensions;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Globalization;
namespace Emby.Naming.ExternalFiles
{
/// <summary>
/// External media file parser class.
/// </summary>
public class ExternalPathParser
{
private readonly NamingOptions _namingOptions;
private readonly DlnaProfileType _type;
private readonly ILocalizationManager _localizationManager;
/// <summary>
/// Initializes a new instance of the <see cref="ExternalPathParser"/> class.
/// </summary>
/// <param name="localizationManager">The localization manager.</param>
/// <param name="namingOptions">The <see cref="NamingOptions"/> object containing FileExtensions, MediaDefaultFlags, MediaForcedFlags and MediaFlagDelimiters.</param>
/// <param name="type">The <see cref="DlnaProfileType"/> of the parsed file.</param>
public ExternalPathParser(NamingOptions namingOptions, ILocalizationManager localizationManager, DlnaProfileType type)
{
_localizationManager = localizationManager;
_namingOptions = namingOptions;
_type = type;
}
/// <summary>
/// Parse filename and extract information.
/// </summary>
/// <param name="path">Path to file.</param>
/// <param name="extraString">Part of the filename only containing the extra information.</param>
/// <returns>Returns null or an <see cref="ExternalPathParserResult"/> object if parsing is successful.</returns>
public ExternalPathParserResult? ParseFile(string path, string? extraString)
{
if (path.Length == 0)
{
return null;
}
var extension = Path.GetExtension(path.AsSpan());
if (!(_type == DlnaProfileType.Subtitle && _namingOptions.SubtitleFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
&& !(_type == DlnaProfileType.Audio && _namingOptions.AudioFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
&& !(_type == DlnaProfileType.Lyric && _namingOptions.LyricFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase)))
{
return null;
}
var pathInfo = new ExternalPathParserResult(path);
if (string.IsNullOrEmpty(extraString))
{
return pathInfo;
}
foreach (var separator in _namingOptions.MediaFlagDelimiters)
{
var languageString = extraString;
var titleString = string.Empty;
const int SeparatorLength = 1;
while (languageString.Length > 0)
{
int lastSeparator = languageString.LastIndexOf(separator);
if (lastSeparator == -1)
{
break;
}
string currentSlice = languageString[lastSeparator..];
string currentSliceWithoutSeparator = currentSlice[SeparatorLength..];
if (_namingOptions.MediaDefaultFlags.Any(s => currentSliceWithoutSeparator.Contains(s, StringComparison.OrdinalIgnoreCase)))
{
pathInfo.IsDefault = true;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
languageString = languageString[..lastSeparator];
continue;
}
if (_namingOptions.MediaForcedFlags.Any(s => currentSliceWithoutSeparator.Contains(s, StringComparison.OrdinalIgnoreCase)))
{
pathInfo.IsForced = true;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
languageString = languageString[..lastSeparator];
continue;
}
// Try to translate to three character code
var culture = _localizationManager.FindLanguageInfo(currentSliceWithoutSeparator);
if (culture is not null && pathInfo.Language is null)
{
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
? culture.Name
: culture.ThreeLetterISOLanguageName;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else if (culture is not null && pathInfo.Language == "hin")
{
// Hindi language code "hi" collides with a hearing impaired flag - use as Hindi only if no other language is set
pathInfo.IsHearingImpaired = true;
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
? culture.Name
: culture.ThreeLetterISOLanguageName;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Equals(s, StringComparison.OrdinalIgnoreCase)))
{
pathInfo.IsHearingImpaired = true;
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
}
else
{
titleString = currentSlice + titleString;
}
languageString = languageString[..lastSeparator];
}
pathInfo.Title = titleString.Length >= SeparatorLength ? titleString[SeparatorLength..] : null;
}
return pathInfo;
}
}
}
================================================
FILE: Emby.Naming/ExternalFiles/ExternalPathParserResult.cs
================================================
namespace Emby.Naming.ExternalFiles
{
/// <summary>
/// Class holding information about external files.
/// </summary>
public class ExternalPathParserResult
{
/// <summary>
/// Initializes a new instance of the <see cref="ExternalPathParserResult"/> class.
/// </summary>
/// <param name="path">Path to file.</param>
/// <param name="isDefault">Is default.</param>
/// <param name="isForced">Is forced.</param>
/// <param name="isHearingImpaired">For the hearing impaired.</param>
public ExternalPathParserResult(string path, bool isDefault = false, bool isForced = false, bool isHearingImpaired = false)
{
Path = path;
IsDefault = isDefault;
IsForced = isForced;
IsHearingImpaired = isHearingImpaired;
}
/// <summary>
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
public string Path { get; set; }
/// <summary>
/// Gets or sets the language.
/// </summary>
/// <value>The language.</value>
public string? Language { get; set; }
/// <summary>
/// Gets or sets the title.
/// </summary>
/// <value>The title.</value>
public string? Title { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is default.
/// </summary>
/// <value><c>true</c> if this instance is default; otherwise, <c>false</c>.</value>
public bool IsDefault { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is forced.
/// </summary>
/// <value><c>true</c> if this instance is forced; otherwise, <c>false</c>.</value>
public bool IsForced { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is for the hearing impaired.
/// </summary>
/// <value><c>true</c> if this instance is for the hearing impaired; otherwise, <c>false</c>.</value>
public bool IsHearingImpaired { get; set; }
}
}
================================================
FILE: Emby.Naming/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Emby.Naming")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Jellyfin Project")]
[assembly: AssemblyProduct("Jellyfin Server")]
[assembly: AssemblyCopyright("Copyright © 2019 Jellyfin Contributors. Code released under the GNU General Public License")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("en")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
================================================
FILE: Emby.Naming/TV/EpisodeInfo.cs
================================================
namespace Emby.Naming.TV
{
/// <summary>
/// Holder object for Episode information.
/// </summary>
public class EpisodeInfo
{
/// <summary>
/// Initializes a new instance of the <see cref="EpisodeInfo"/> class.
/// </summary>
/// <param name="path">Path to the file.</param>
public EpisodeInfo(string path)
{
Path = path;
}
/// <summary>
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
public string Path { get; set; }
/// <summary>
/// Gets or sets the container.
/// </summary>
/// <value>The container.</value>
public string? Container { get; set; }
/// <summary>
/// Gets or sets the name of the series.
/// </summary>
/// <value>The name of the series.</value>
public string? SeriesName { get; set; }
/// <summary>
/// Gets or sets the format3 d.
/// </summary>
/// <value>The format3 d.</value>
public string? Format3D { get; set; }
/// <summary>
/// Gets or sets a value indicating whether [is3 d].
/// </summary>
/// <value><c>true</c> if [is3 d]; otherwise, <c>false</c>.</value>
public bool Is3D { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is stub.
/// </summary>
/// <value><c>true</c> if this instance is stub; otherwise, <c>false</c>.</value>
public bool IsStub { get; set; }
/// <summary>
/// Gets or sets the type of the stub.
/// </summary>
/// <value>The type of the stub.</value>
public string? StubType { get; set; }
/// <summary>
/// Gets or sets optional season number.
/// </summary>
public int? SeasonNumber { get; set; }
/// <summary>
/// Gets or sets optional episode number.
/// </summary>
public int? EpisodeNumber { get; set; }
/// <summary>
/// Gets or sets optional ending episode number. For multi-episode files 1-13.
/// </summary>
public int? EndingEpisodeNumber { get; set; }
/// <summary>
/// Gets or sets optional year of release.
/// </summary>
public int? Year { get; set; }
/// <summary>
/// Gets or sets optional year of release.
/// </summary>
public int? Month { get; set; }
/// <summary>
/// Gets or sets optional day of release.
/// </summary>
public int? Day { get; set; }
/// <summary>
/// Gets or sets a value indicating whether by date expression was used.
/// </summary>
public bool IsByDate { get; set; }
}
}
================================================
FILE: Emby.Naming/TV/EpisodePathParser.cs
================================================
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Emby.Naming.Common;
namespace Emby.Naming.TV
{
/// <summary>
/// Used to parse information about episode from path.
/// </summary>
public class EpisodePathParser
{
private readonly NamingOptions _options;
/// <summary>
/// Initializes a new instance of the <see cref="EpisodePathParser"/> class.
/// </summary>
/// <param name="options"><see cref="NamingOptions"/> object containing EpisodeExpressions and MultipleEpisodeExpressions.</param>
public EpisodePathParser(NamingOptions options)
{
_options = options;
}
/// <summary>
/// Parses information about episode from path.
/// </summary>
/// <param name="path">Path.</param>
/// <param name="isDirectory">Is path for a directory or file.</param>
/// <param name="isNamed">Do we want to use IsNamed expressions.</param>
/// <param name="isOptimistic">Do we want to use Optimistic expressions.</param>
/// <param name="supportsAbsoluteNumbers">Do we want to use expressions supporting absolute episode numbers.</param>
/// <param name="fillExtendedInfo">Should we attempt to retrieve extended information.</param>
/// <returns>Returns <see cref="EpisodePathParserResult"/> object.</returns>
public EpisodePathParserResult Parse(
string path,
bool isDirectory,
bool? isNamed = null,
bool? isOptimistic = null,
bool? supportsAbsoluteNumbers = null,
bool fillExtendedInfo = true)
{
// Added to be able to use regex patterns which require a file extension.
// There were no failed tests without this block, but to be safe, we can keep it until
// the regex which require file extensions are modified so that they don't need them.
if (isDirectory)
{
path += ".mp4";
}
EpisodePathParserResult? result = null;
foreach (var expression in _options.EpisodeExpressions)
{
if (supportsAbsoluteNumbers.HasValue
&& expression.SupportsAbsoluteEpisodeNumbers != supportsAbsoluteNumbers.Value)
{
continue;
}
if (isNamed.HasValue && expression.IsNamed != isNamed.Value)
{
continue;
}
if (isOptimistic.HasValue && expression.IsOptimistic != isOptimistic.Value)
{
continue;
}
var currentResult = Parse(path, expression);
if (currentResult.Success)
{
result = currentResult;
break;
}
}
if (result is not null && fillExtendedInfo)
{
FillAdditional(path, result);
if (!string.IsNullOrEmpty(result.SeriesName))
{
result.SeriesName = result.SeriesName
.Trim()
.Trim('_', '.', '-')
.Trim();
}
}
return result ?? new EpisodePathParserResult();
}
private static EpisodePathParserResult Parse(string name, EpisodeExpression expression)
{
var result = new EpisodePathParserResult();
// This is a hack to handle wmc naming
if (expression.IsByDate)
{
name = name.Replace('_', '-');
}
var match = expression.Regex.Match(name);
// (Full)(Season)(Episode)(Extension)
if (match.Success && match.Groups.Count >= 3)
{
if (expression.IsByDate)
{
DateTime date;
if (expression.DateTimeFormats.Length > 0)
{
if (DateTime.TryParseExact(
match.Groups[0].ValueSpan,
expression.DateTimeFormats,
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date))
{
result.Year = date.Year;
result.Month = date.Month;
result.Day = date.Day;
result.Success = true;
}
}
else if (DateTime.TryParse(match.Groups[0].ValueSpan, out date))
{
result.Year = date.Year;
result.Month = date.Month;
result.Day = date.Day;
result.Success = true;
}
// TODO: Only consider success if date successfully parsed?
result.Success = true;
}
else if (expression.IsNamed)
{
if (int.TryParse(match.Groups["seasonnumber"].ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out var num))
{
result.SeasonNumber = num;
}
if (int.TryParse(match.Groups["epnumber"].ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out num))
{
result.EpisodeNumber = num;
}
var endingNumberGroup = match.Groups["endingepnumber"];
if (endingNumberGroup.Success)
{
// Will only set EndingEpisodeNumber if the captured number is not followed by additional numbers
// or a 'p' or 'i' as what you would get with a pixel resolution specification.
// It avoids erroneous parsing of something like "series-s09e14-1080p.mkv" as a multi-episode from E14 to E108
int nextIndex = endingNumberGroup.Index + endingNumberGroup.Length;
if (nextIndex >= name.Length
|| !"0123456789iIpP".Contains(name[nextIndex], StringComparison.Ordinal))
{
if (int.TryParse(endingNumberGroup.ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out num))
{
result.EndingEpisodeNumber = num;
}
}
}
result.SeriesName = match.Groups["seriesname"].Value;
result.Success = result.EpisodeNumber.HasValue;
}
else
{
if (int.TryParse(match.Groups[1].ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out var num))
{
result.SeasonNumber = num;
}
if (int.TryParse(match.Groups[2].ValueSpan, NumberStyles.Integer, CultureInfo.InvariantCulture, out num))
{
result.EpisodeNumber = num;
}
result.Success = result.EpisodeNumber.HasValue;
}
// Invalidate match when the season is 200 through 1927 or above 2500
// because it is an error unless the TV show is intentionally using false season numbers.
// It avoids erroneous parsing of something like "Series Special (1920x1080).mkv" as being season 1920 episode 1080.
if ((result.SeasonNumber >= 200 && result.SeasonNumber < 1928)
|| result.SeasonNumber > 2500)
{
result.Success = false;
}
result.IsByDate = expression.IsByDate;
}
return result;
}
private void FillAdditional(string path, EpisodePathParserResult info)
{
var expressions = _options.MultipleEpisodeExpressions.Where(i => i.IsNamed).ToList();
if (string.IsNullOrEmpty(info.SeriesName))
{
expressions.InsertRange(0, _options.EpisodeExpressions.Where(i => i.IsNamed));
}
FillAdditional(path, info, expressions);
}
private void FillAdditional(string path, EpisodePathParserResult info, IEnumerable<EpisodeExpression> expressions)
{
foreach (var i in expressions)
{
var result = Parse(path, i);
if (!result.Success)
{
continue;
}
if (string.IsNullOrEmpty(info.SeriesName))
{
info.SeriesName = result.SeriesName;
}
if (!info.EndingEpisodeNumber.HasValue && info.EpisodeNumber.HasValue)
{
info.EndingEpisodeNumber = result.EndingEpisodeNumber;
}
if (!string.IsNullOrEmpty(info.SeriesName)
&& (!info.EpisodeNumber.HasValue || info.EndingEpisodeNumber.HasValue))
{
break;
}
}
}
}
}
================================================
FILE: Emby.Naming/TV/EpisodePathParserResult.cs
================================================
namespace Emby.Naming.TV
{
/// <summary>
/// Holder object for <see cref="EpisodePathParser"/> result.
/// </summary>
public class EpisodePathParserResult
{
/// <summary>
/// Gets or sets optional season number.
/// </summary>
public int? SeasonNumber { get; set; }
/// <summary>
/// Gets or sets optional episode number.
/// </summary>
public int? EpisodeNumber { get; set; }
/// <summary>
/// Gets or sets optional ending episode number. For multi-episode files 1-13.
/// </summary>
public int? EndingEpisodeNumber { get; set; }
/// <summary>
/// Gets or sets the name of the series.
/// </summary>
/// <value>The name of the series.</value>
public string? SeriesName { get; set; }
/// <summary>
/// Gets or sets a value indicating whether parsing was successful.
/// </summary>
public bool Success { get; set; }
/// <summary>
/// Gets or sets a value indicating whether by date expression was used.
/// </summary>
public bool IsByDate { get; set; }
/// <summary>
/// Gets or sets optional year of release.
/// </summary>
public int? Year { get; set; }
/// <summary>
/// Gets or sets optional year of release.
/// </summary>
public int? Month { get; set; }
/// <summary>
/// Gets or sets optional day of release.
/// </summary>
public int? Day { get; set; }
}
}
================================================
FILE: Emby.Naming/TV/EpisodeResolver.cs
================================================
using System;
using System.IO;
using Emby.Naming.Common;
using Emby.Naming.Video;
using Jellyfin.Extensions;
namespace Emby.Naming.TV
{
/// <summary>
/// Used to resolve information about episode from path.
/// </summary>
public class EpisodeResolver
{
private readonly NamingOptions _options;
/// <summary>
/// Initializes a new instance of the <see cref="EpisodeResolver"/> class.
/// </summary>
/// <param name="options"><see cref="NamingOptions"/> object containing VideoFileExtensions and passed to <see cref="StubResolver"/>, <see cref="Format3DParser"/> and <see cref="EpisodePathParser"/>.</param>
public EpisodeResolver(NamingOptions options)
{
_options = options;
}
/// <summary>
/// Resolve information about episode from path.
/// </summary>
/// <param name="path">Path.</param>
/// <param name="isDirectory">Is path for a directory or file.</param>
/// <param name="isNamed">Do we want to use IsNamed expressions.</param>
/// <param name="isOptimistic">Do we want to use Optimistic expressions.</param>
/// <param name="supportsAbsoluteNumbers">Do we want to use expressions supporting absolute episode numbers.</param>
/// <param name="fillExtendedInfo">Should we attempt to retrieve extended information.</param>
/// <returns>Returns null or <see cref="EpisodeInfo"/> object if successful.</returns>
public EpisodeInfo? Resolve(
string path,
bool isDirectory,
bool? isNamed = null,
bool? isOptimistic = null,
bool? supportsAbsoluteNumbers = null,
bool fillExtendedInfo = true)
{
bool isStub = false;
string? container = null;
string? stubType = null;
if (!isDirectory)
{
var extension = Path.GetExtension(path);
// Check supported extensions
if (!_options.VideoFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase))
{
// It's not supported. Check stub extensions
if (!StubResolver.TryResolveFile(path, _options, out stubType))
{
return null;
}
isStub = true;
}
container = extension.TrimStart('.');
}
var format3DResult = Format3DParser.Parse(path, _options);
var parsingResult = new EpisodePathParser(_options)
.Parse(path, isDirectory, isNamed, isOptimistic, supportsAbsoluteNumbers, fillExtendedInfo);
if (!parsingResult.Success && !isStub)
{
return null;
}
return new EpisodeInfo(path)
{
Container = container,
IsStub = isStub,
EndingEpisodeNumber = parsingResult.EndingEpisodeNumber,
EpisodeNumber = parsingResult.EpisodeNumber,
SeasonNumber = parsingResult.SeasonNumber,
SeriesName = parsingResult.SeriesName,
StubType = stubType,
Is3D = format3DResult.Is3D,
Format3D = format3DResult.Format3D,
IsByDate = parsingResult.IsByDate,
Day = parsingResult.Day,
Month = parsingResult.Month,
Year = parsingResult.Year
};
}
}
}
================================================
FILE: Emby.Naming/TV/SeasonPathParser.cs
================================================
using System;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
namespace Emby.Naming.TV
{
/// <summary>
/// Class to parse season paths.
/// </summary>
public static partial class SeasonPathParser
{
private static readonly Regex CleanNameRegex = new(@"[ ._\-\[\]]", RegexOptions.Compiled);
[GeneratedRegex(@"^\s*((?<seasonnumber>(?>\d+))(?:st|nd|rd|th|\.)*(?!\s*[Ee]\d+))\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
private static partial Regex ProcessPre();
[GeneratedRegex(@"^\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<seasonnumber>\d+?)(?=\d{3,4}p|[^\d]|$)(?!\s*[Ee]\d)(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
private static partial Regex ProcessPost();
[GeneratedRegex(@"[sS](\d{1,4})(?!\d|[eE]\d)(?=\.|_|-|\[|\]|\s|$)", RegexOptions.None)]
private static partial Regex SeasonPrefix();
/// <summary>
/// Attempts to parse season number from path.
/// </summary>
/// <param name="path">Path to season.</param>
/// <param name="parentPath">Folder name of the parent.</param>
/// <param name="supportSpecialAliases">Support special aliases when parsing.</param>
/// <param name="supportNumericSeasonFolders">Support numeric season folders when parsing.</param>
/// <returns>Returns <see cref="SeasonPathParserResult"/> object.</returns>
public static SeasonPathParserResult Parse(string path, string? parentPath, bool supportSpecialAliases, bool supportNumericSeasonFolders)
{
var result = new SeasonPathParserResult();
var parentFolderName = parentPath is null ? null : new DirectoryInfo(parentPath).Name;
var (seasonNumber, isSeasonFolder) = GetSeasonNumberFromPath(path, parentFolderName, supportSpecialAliases, supportNumericSeasonFolders);
result.SeasonNumber = seasonNumber;
if (result.SeasonNumber.HasValue)
{
result.Success = true;
result.IsSeasonFolder = isSeasonFolder;
}
return result;
}
/// <summary>
/// Gets the season number from path.
/// </summary>
/// <param name="path">The path.</param>
/// <param name="parentFolderName">The parent folder name.</param>
/// <param name="supportSpecialAliases">if set to <c>true</c> [support special aliases].</param>
/// <param name="supportNumericSeasonFolders">if set to <c>true</c> [support numeric season folders].</param>
/// <returns>System.Nullable{System.Int32}.</returns>
private static (int? SeasonNumber, bool IsSeasonFolder) GetSeasonNumberFromPath(
string path,
string? parentFolderName,
bool supportSpecialAliases,
bool supportNumericSeasonFolders)
{
var fileName = Path.GetFileName(path);
var seasonPrefixMatch = SeasonPrefix().Match(fileName);
if (seasonPrefixMatch.Success &&
int.TryParse(seasonPrefixMatch.Groups[1].Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
{
return (val, true);
}
string filename = CleanNameRegex.Replace(fileName, string.Empty);
if (parentFolderName is not null)
{
var cleanParent = CleanNameRegex.Replace(parentFolderName, string.Empty);
filename = filename.Replace(cleanParent, string.Empty, StringComparison.OrdinalIgnoreCase);
}
if (supportSpecialAliases &&
(filename.Equals("specials", StringComparison.OrdinalIgnoreCase) ||
filename.Equals("extras", StringComparison.OrdinalIgnoreCase)))
{
return (0, true);
}
if (supportNumericSeasonFolders &&
int.TryParse(filename, NumberStyles.Integer, CultureInfo.InvariantCulture, out val))
{
return (val, true);
}
var preMatch = ProcessPre().Match(filename);
if (preMatch.Success)
{
return CheckMatch(preMatch);
}
else
{
var postMatch = ProcessPost().Match(filename);
return CheckMatch(postMatch);
}
}
private static (int? SeasonNumber, bool IsSeasonFolder) CheckMatch(Match match)
{
var numberString = match.Groups["seasonnumber"];
if (numberString.Success)
{
if (int.TryParse(numberString.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var seasonNumber))
{
return (seasonNumber, true);
}
}
return (null, false);
}
/// <summary>
/// Extracts the season number from the second half of the Season folder name (everything after "Season", or "Staffel").
/// </summary>
/// <param name="path">The path.</param>
/// <returns>System.Nullable{System.Int32}.</returns>
private static (int? SeasonNumber, bool IsSeasonFolder) GetSeasonNumberFromPathSubstring(ReadOnlySpan<char> path)
{
var numericStart = -1;
var length = 0;
var hasOpenParenthesis = false;
var isSeasonFolder = true;
// Find out where the numbers start, and then keep going until they end
for (var i = 0; i < path.Length; i++)
{
if (char.IsNumber(path[i]))
{
if (!hasOpenParenthesis)
{
if (numericStart == -1)
{
numericStart = i;
}
length++;
}
}
else if (numericStart != -1)
{
// There's other stuff after the season number, e.g. episode number
isSeasonFolder = false;
break;
}
var currentChar = path[i];
if (currentChar == '(')
{
hasOpenParenthesis = true;
}
else if (currentChar == ')')
{
hasOpenParenthesis = false;
}
}
if (numericStart == -1)
{
return (null, isSeasonFolder);
}
return (int.Parse(path.Slice(numericStart, length), provider: CultureInfo.InvariantCulture), isSeasonFolder);
}
}
}
================================================
FILE: Emby.Naming/TV/SeasonPathParserResult.cs
================================================
namespace Emby.Naming.TV
{
/// <summary>
/// Data object to pass result of <see cref="SeasonPathParser"/>.
/// </summary>
public class SeasonPathParserResult
{
/// <summary>
/// Gets or sets the season number.
/// </summary>
/// <value>The season number.</value>
public int? SeasonNumber { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="SeasonPathParserResult" /> is success.
/// </summary>
/// <value><c>true</c> if success; otherwise, <c>false</c>.<
gitextract_vipu_rbm/
├── .config/
│ └── dotnet-tools.json
├── .devcontainer/
│ ├── devcontainer.json
│ └── install-ffmpeg.sh
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── feature_request.md
│ │ └── issue report.yml
│ ├── pull_request_template.md
│ ├── renovate.json
│ └── workflows/
│ ├── ci-codeql-analysis.yml
│ ├── ci-compat.yml
│ ├── ci-openapi.yml
│ ├── ci-tests.yml
│ ├── commands.yml
│ ├── issue-stale.yml
│ ├── issue-template-check.yml
│ ├── project-automation.yml
│ ├── pull-request-conflict.yml
│ ├── pull-request-stale.yaml
│ └── release-bump-version.yaml
├── .gitignore
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ ├── settings.json
│ └── tasks.json
├── BannedSymbols.txt
├── CONTRIBUTORS.md
├── Directory.Build.props
├── Directory.Packages.props
├── Emby.Naming/
│ ├── Audio/
│ │ ├── AlbumParser.cs
│ │ └── AudioFileParser.cs
│ ├── AudioBook/
│ │ ├── AudioBookFileInfo.cs
│ │ ├── AudioBookFilePathParser.cs
│ │ ├── AudioBookFilePathParserResult.cs
│ │ ├── AudioBookInfo.cs
│ │ ├── AudioBookListResolver.cs
│ │ ├── AudioBookNameParser.cs
│ │ ├── AudioBookNameParserResult.cs
│ │ └── AudioBookResolver.cs
│ ├── Book/
│ │ ├── BookFileNameParser.cs
│ │ └── BookFileNameParserResult.cs
│ ├── Common/
│ │ ├── EpisodeExpression.cs
│ │ ├── MediaType.cs
│ │ └── NamingOptions.cs
│ ├── Emby.Naming.csproj
│ ├── ExternalFiles/
│ │ ├── ExternalPathParser.cs
│ │ └── ExternalPathParserResult.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── TV/
│ │ ├── EpisodeInfo.cs
│ │ ├── EpisodePathParser.cs
│ │ ├── EpisodePathParserResult.cs
│ │ ├── EpisodeResolver.cs
│ │ ├── SeasonPathParser.cs
│ │ ├── SeasonPathParserResult.cs
│ │ ├── SeriesInfo.cs
│ │ ├── SeriesPathParser.cs
│ │ ├── SeriesPathParserResult.cs
│ │ ├── SeriesResolver.cs
│ │ └── TvParserHelpers.cs
│ └── Video/
│ ├── CleanDateTimeParser.cs
│ ├── CleanDateTimeResult.cs
│ ├── CleanStringParser.cs
│ ├── ExtraResult.cs
│ ├── ExtraRule.cs
│ ├── ExtraRuleResolver.cs
│ ├── ExtraRuleType.cs
│ ├── FileStack.cs
│ ├── FileStackRule.cs
│ ├── Format3DParser.cs
│ ├── Format3DResult.cs
│ ├── Format3DRule.cs
│ ├── StackResolver.cs
│ ├── StubResolver.cs
│ ├── StubTypeRule.cs
│ ├── VideoFileInfo.cs
│ ├── VideoInfo.cs
│ ├── VideoListResolver.cs
│ └── VideoResolver.cs
├── Emby.Photos/
│ ├── Emby.Photos.csproj
│ ├── PhotoProvider.cs
│ └── Properties/
│ └── AssemblyInfo.cs
├── Emby.Server.Implementations/
│ ├── AppBase/
│ │ ├── BaseApplicationPaths.cs
│ │ ├── BaseConfigurationManager.cs
│ │ └── ConfigurationHelper.cs
│ ├── ApplicationHost.cs
│ ├── Branding/
│ │ └── BrandingConfigurationFactory.cs
│ ├── Chapters/
│ │ └── ChapterManager.cs
│ ├── Collections/
│ │ ├── CollectionImageProvider.cs
│ │ └── CollectionManager.cs
│ ├── Configuration/
│ │ └── ServerConfigurationManager.cs
│ ├── ConfigurationOptions.cs
│ ├── Cryptography/
│ │ └── CryptographyProvider.cs
│ ├── Data/
│ │ ├── CleanDatabaseScheduledTask.cs
│ │ ├── ItemTypeLookup.cs
│ │ ├── SqliteExtensions.cs
│ │ └── TypeMapper.cs
│ ├── Devices/
│ │ └── DeviceId.cs
│ ├── Dto/
│ │ └── DtoService.cs
│ ├── Emby.Server.Implementations.csproj
│ ├── EntryPoints/
│ │ ├── LibraryChangedNotifier.cs
│ │ └── UserDataChangeNotifier.cs
│ ├── HttpServer/
│ │ ├── Security/
│ │ │ └── AuthService.cs
│ │ ├── WebSocketConnection.cs
│ │ └── WebSocketManager.cs
│ ├── IO/
│ │ ├── FileRefresher.cs
│ │ ├── LibraryMonitor.cs
│ │ ├── ManagedFileSystem.cs
│ │ └── MbLinkShortcutHandler.cs
│ ├── IStartupOptions.cs
│ ├── Images/
│ │ ├── ArtistImageProvider.cs
│ │ ├── BaseDynamicImageProvider.cs
│ │ ├── BaseFolderImageProvider.cs
│ │ ├── CollectionFolderImageProvider.cs
│ │ ├── DynamicImageProvider.cs
│ │ ├── FolderImageProvider.cs
│ │ ├── GenreImageProvider.cs
│ │ ├── MusicAlbumImageProvider.cs
│ │ ├── MusicGenreImageProvider.cs
│ │ ├── PhotoAlbumImageProvider.cs
│ │ └── PlaylistImageProvider.cs
│ ├── Library/
│ │ ├── CoreResolutionIgnoreRule.cs
│ │ ├── DotIgnoreIgnoreRule.cs
│ │ ├── ExternalDataManager.cs
│ │ ├── IgnorePatterns.cs
│ │ ├── KeyframeManager.cs
│ │ ├── LibraryManager.cs
│ │ ├── LiveStreamHelper.cs
│ │ ├── MediaSourceManager.cs
│ │ ├── MediaStreamSelector.cs
│ │ ├── MusicManager.cs
│ │ ├── PathExtensions.cs
│ │ ├── PathManager.cs
│ │ ├── ResolverHelper.cs
│ │ ├── Resolvers/
│ │ │ ├── Audio/
│ │ │ │ ├── AudioResolver.cs
│ │ │ │ ├── MusicAlbumResolver.cs
│ │ │ │ └── MusicArtistResolver.cs
│ │ │ ├── BaseVideoResolver.cs
│ │ │ ├── Books/
│ │ │ │ └── BookResolver.cs
│ │ │ ├── ExtraResolver.cs
│ │ │ ├── FolderResolver.cs
│ │ │ ├── GenericFolderResolver.cs
│ │ │ ├── GenericVideoResolver.cs
│ │ │ ├── Movies/
│ │ │ │ ├── BoxSetResolver.cs
│ │ │ │ └── MovieResolver.cs
│ │ │ ├── PhotoAlbumResolver.cs
│ │ │ ├── PhotoResolver.cs
│ │ │ ├── PlaylistResolver.cs
│ │ │ ├── SpecialFolderResolver.cs
│ │ │ └── TV/
│ │ │ ├── EpisodeResolver.cs
│ │ │ ├── SeasonResolver.cs
│ │ │ └── SeriesResolver.cs
│ │ ├── SearchEngine.cs
│ │ ├── SplashscreenPostScanTask.cs
│ │ ├── UserDataManager.cs
│ │ ├── UserViewManager.cs
│ │ └── Validators/
│ │ ├── ArtistsPostScanTask.cs
│ │ ├── ArtistsValidator.cs
│ │ ├── CollectionPostScanTask.cs
│ │ ├── GenresPostScanTask.cs
│ │ ├── GenresValidator.cs
│ │ ├── MusicGenresPostScanTask.cs
│ │ ├── MusicGenresValidator.cs
│ │ ├── PeopleValidator.cs
│ │ ├── StudiosPostScanTask.cs
│ │ └── StudiosValidator.cs
│ ├── Localization/
│ │ ├── Core/
│ │ │ ├── ab.json
│ │ │ ├── af.json
│ │ │ ├── ar.json
│ │ │ ├── as.json
│ │ │ ├── be.json
│ │ │ ├── bg-BG.json
│ │ │ ├── bn.json
│ │ │ ├── ca.json
│ │ │ ├── chr.json
│ │ │ ├── cs.json
│ │ │ ├── cy.json
│ │ │ ├── da.json
│ │ │ ├── de.json
│ │ │ ├── el.json
│ │ │ ├── en-GB.json
│ │ │ ├── en-US.json
│ │ │ ├── enm.json
│ │ │ ├── eo.json
│ │ │ ├── es-AR.json
│ │ │ ├── es-MX.json
│ │ │ ├── es.json
│ │ │ ├── es_419.json
│ │ │ ├── es_DO.json
│ │ │ ├── et.json
│ │ │ ├── eu.json
│ │ │ ├── fa.json
│ │ │ ├── fi.json
│ │ │ ├── fil.json
│ │ │ ├── fo.json
│ │ │ ├── fr-CA.json
│ │ │ ├── fr.json
│ │ │ ├── ga.json
│ │ │ ├── gl.json
│ │ │ ├── gsw.json
│ │ │ ├── he.json
│ │ │ ├── he_IL.json
│ │ │ ├── hi.json
│ │ │ ├── hr.json
│ │ │ ├── ht.json
│ │ │ ├── hu.json
│ │ │ ├── hy.json
│ │ │ ├── id.json
│ │ │ ├── is.json
│ │ │ ├── it.json
│ │ │ ├── ja.json
│ │ │ ├── jbo.json
│ │ │ ├── ka.json
│ │ │ ├── kab.json
│ │ │ ├── kk.json
│ │ │ ├── km.json
│ │ │ ├── kn.json
│ │ │ ├── ko.json
│ │ │ ├── kw.json
│ │ │ ├── ky.json
│ │ │ ├── lb.json
│ │ │ ├── lt-LT.json
│ │ │ ├── lv.json
│ │ │ ├── lzh.json
│ │ │ ├── mi.json
│ │ │ ├── mk.json
│ │ │ ├── ml.json
│ │ │ ├── mn.json
│ │ │ ├── mr.json
│ │ │ ├── ms.json
│ │ │ ├── mt.json
│ │ │ ├── my.json
│ │ │ ├── nb.json
│ │ │ ├── ne.json
│ │ │ ├── nl.json
│ │ │ ├── nn.json
│ │ │ ├── oc.json
│ │ │ ├── or.json
│ │ │ ├── pa.json
│ │ │ ├── pl.json
│ │ │ ├── pr.json
│ │ │ ├── pt-BR.json
│ │ │ ├── pt-PT.json
│ │ │ ├── pt.json
│ │ │ ├── ro.json
│ │ │ ├── ru.json
│ │ │ ├── si.json
│ │ │ ├── sk.json
│ │ │ ├── sl-SI.json
│ │ │ ├── sn.json
│ │ │ ├── sq.json
│ │ │ ├── sr.json
│ │ │ ├── sv.json
│ │ │ ├── sw.json
│ │ │ ├── ta.json
│ │ │ ├── te.json
│ │ │ ├── th.json
│ │ │ ├── tr.json
│ │ │ ├── ug.json
│ │ │ ├── uk.json
│ │ │ ├── ur.json
│ │ │ ├── ur_PK.json
│ │ │ ├── uz.json
│ │ │ ├── vi.json
│ │ │ ├── zh-CN.json
│ │ │ ├── zh-HK.json
│ │ │ ├── zh-TW.json
│ │ │ └── zu.json
│ │ ├── LocalizationManager.cs
│ │ ├── Ratings/
│ │ │ ├── 0-prefer.json
│ │ │ ├── ar.json
│ │ │ ├── au.json
│ │ │ ├── be.json
│ │ │ ├── bg.json
│ │ │ ├── br.json
│ │ │ ├── ca.json
│ │ │ ├── cl.json
│ │ │ ├── co.json
│ │ │ ├── cz.json
│ │ │ ├── de.json
│ │ │ ├── dk.json
│ │ │ ├── es.json
│ │ │ ├── fi.json
│ │ │ ├── fr.json
│ │ │ ├── gb.json
│ │ │ ├── gr.json
│ │ │ ├── hu.json
│ │ │ ├── id.json
│ │ │ ├── ie.json
│ │ │ ├── in.json
│ │ │ ├── it.json
│ │ │ ├── jp.json
│ │ │ ├── kr.json
│ │ │ ├── kz.json
│ │ │ ├── lt.json
│ │ │ ├── mx.json
│ │ │ ├── nl.json
│ │ │ ├── no.json
│ │ │ ├── nz.json
│ │ │ ├── ph.json
│ │ │ ├── pl.json
│ │ │ ├── pt.json
│ │ │ ├── ro.json
│ │ │ ├── ru.json
│ │ │ ├── se.json
│ │ │ ├── sg.json
│ │ │ ├── sk.json
│ │ │ ├── th.json
│ │ │ ├── tr.json
│ │ │ ├── tw.json
│ │ │ ├── ua.json
│ │ │ ├── uk.json
│ │ │ ├── us.json
│ │ │ └── za.json
│ │ ├── countries.json
│ │ └── iso6392.txt
│ ├── Playlists/
│ │ ├── PlaylistManager.cs
│ │ └── PlaylistsFolder.cs
│ ├── Plugins/
│ │ ├── PluginLoadContext.cs
│ │ └── PluginManager.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── QuickConnect/
│ │ └── QuickConnectManager.cs
│ ├── ScheduledTasks/
│ │ ├── ScheduledTaskWorker.cs
│ │ ├── TaskManager.cs
│ │ ├── Tasks/
│ │ │ ├── AudioNormalizationTask.cs
│ │ │ ├── ChapterImagesTask.cs
│ │ │ ├── CleanActivityLogTask.cs
│ │ │ ├── CleanupCollectionAndPlaylistPathsTask.cs
│ │ │ ├── CleanupUserDataTask.cs
│ │ │ ├── DeleteCacheFileTask.cs
│ │ │ ├── DeleteLogFileTask.cs
│ │ │ ├── DeleteTranscodeFileTask.cs
│ │ │ ├── MediaSegmentExtractionTask.cs
│ │ │ ├── OptimizeDatabaseTask.cs
│ │ │ ├── PeopleValidationTask.cs
│ │ │ ├── PluginUpdateTask.cs
│ │ │ └── RefreshMediaLibraryTask.cs
│ │ └── Triggers/
│ │ ├── DailyTrigger.cs
│ │ ├── IntervalTrigger.cs
│ │ ├── StartupTrigger.cs
│ │ └── WeeklyTrigger.cs
│ ├── Serialization/
│ │ └── MyXmlSerializer.cs
│ ├── ServerApplicationPaths.cs
│ ├── Session/
│ │ ├── SessionManager.cs
│ │ ├── SessionWebSocketListener.cs
│ │ └── WebSocketController.cs
│ ├── Sorting/
│ │ ├── AiredEpisodeOrderComparer.cs
│ │ ├── AlbumArtistComparer.cs
│ │ ├── AlbumComparer.cs
│ │ ├── ArtistComparer.cs
│ │ ├── CommunityRatingComparer.cs
│ │ ├── CriticRatingComparer.cs
│ │ ├── DateCreatedComparer.cs
│ │ ├── DateLastMediaAddedComparer.cs
│ │ ├── DatePlayedComparer.cs
│ │ ├── IndexNumberComparer.cs
│ │ ├── IsFavoriteOrLikeComparer.cs
│ │ ├── IsFolderComparer.cs
│ │ ├── IsPlayedComparer.cs
│ │ ├── IsUnplayedComparer.cs
│ │ ├── NameComparer.cs
│ │ ├── OfficialRatingComparer.cs
│ │ ├── ParentIndexNumberComparer.cs
│ │ ├── PlayCountComparer.cs
│ │ ├── PremiereDateComparer.cs
│ │ ├── ProductionYearComparer.cs
│ │ ├── RandomComparer.cs
│ │ ├── RuntimeComparer.cs
│ │ ├── SeriesSortNameComparer.cs
│ │ ├── SortNameComparer.cs
│ │ ├── StartDateComparer.cs
│ │ └── StudioComparer.cs
│ ├── SyncPlay/
│ │ ├── Group.cs
│ │ └── SyncPlayManager.cs
│ ├── SystemManager.cs
│ ├── TV/
│ │ └── TVSeriesManager.cs
│ └── Updates/
│ └── InstallationManager.cs
├── Jellyfin.Api/
│ ├── Attributes/
│ │ ├── AcceptsFileAttribute.cs
│ │ ├── AcceptsImageFileAttribute.cs
│ │ ├── ParameterObsoleteAttribute.cs
│ │ ├── ProducesAudioFileAttribute.cs
│ │ ├── ProducesFileAttribute.cs
│ │ ├── ProducesImageFileAttribute.cs
│ │ ├── ProducesPlaylistFileAttribute.cs
│ │ └── ProducesVideoFileAttribute.cs
│ ├── Auth/
│ │ ├── AnonymousLanAccessPolicy/
│ │ │ ├── AnonymousLanAccessHandler.cs
│ │ │ └── AnonymousLanAccessRequirement.cs
│ │ ├── CustomAuthenticationHandler.cs
│ │ ├── DefaultAuthorizationPolicy/
│ │ │ ├── DefaultAuthorizationHandler.cs
│ │ │ └── DefaultAuthorizationRequirement.cs
│ │ ├── FirstTimeSetupPolicy/
│ │ │ ├── FirstTimeSetupHandler.cs
│ │ │ └── FirstTimeSetupRequirement.cs
│ │ ├── LocalAccessOrRequiresElevationPolicy/
│ │ │ ├── LocalAccessOrRequiresElevationHandler.cs
│ │ │ └── LocalAccessOrRequiresElevationRequirement.cs
│ │ ├── SyncPlayAccessPolicy/
│ │ │ ├── SyncPlayAccessHandler.cs
│ │ │ └── SyncPlayAccessRequirement.cs
│ │ └── UserPermissionPolicy/
│ │ ├── UserPermissionHandler.cs
│ │ └── UserPermissionRequirement.cs
│ ├── BaseJellyfinApiController.cs
│ ├── Constants/
│ │ ├── AuthenticationSchemes.cs
│ │ ├── InternalClaimTypes.cs
│ │ └── UserRoles.cs
│ ├── Controllers/
│ │ ├── ActivityLogController.cs
│ │ ├── ApiKeyController.cs
│ │ ├── ArtistsController.cs
│ │ ├── AudioController.cs
│ │ ├── BackupController.cs
│ │ ├── BrandingController.cs
│ │ ├── ChannelsController.cs
│ │ ├── ClientLogController.cs
│ │ ├── CollectionController.cs
│ │ ├── ConfigurationController.cs
│ │ ├── DashboardController.cs
│ │ ├── DevicesController.cs
│ │ ├── DisplayPreferencesController.cs
│ │ ├── DynamicHlsController.cs
│ │ ├── EnvironmentController.cs
│ │ ├── FilterController.cs
│ │ ├── GenresController.cs
│ │ ├── HlsSegmentController.cs
│ │ ├── ImageController.cs
│ │ ├── InstantMixController.cs
│ │ ├── ItemLookupController.cs
│ │ ├── ItemRefreshController.cs
│ │ ├── ItemUpdateController.cs
│ │ ├── ItemsController.cs
│ │ ├── LibraryController.cs
│ │ ├── LibraryStructureController.cs
│ │ ├── LiveTvController.cs
│ │ ├── LocalizationController.cs
│ │ ├── LyricsController.cs
│ │ ├── MediaInfoController.cs
│ │ ├── MediaSegmentsController.cs
│ │ ├── MoviesController.cs
│ │ ├── MusicGenresController.cs
│ │ ├── PackageController.cs
│ │ ├── PersonsController.cs
│ │ ├── PlaylistsController.cs
│ │ ├── PlaystateController.cs
│ │ ├── PluginsController.cs
│ │ ├── QuickConnectController.cs
│ │ ├── RemoteImageController.cs
│ │ ├── ScheduledTasksController.cs
│ │ ├── SearchController.cs
│ │ ├── SessionController.cs
│ │ ├── StartupController.cs
│ │ ├── StudiosController.cs
│ │ ├── SubtitleController.cs
│ │ ├── SuggestionsController.cs
│ │ ├── SyncPlayController.cs
│ │ ├── SystemController.cs
│ │ ├── TimeSyncController.cs
│ │ ├── TrailersController.cs
│ │ ├── TrickplayController.cs
│ │ ├── TvShowsController.cs
│ │ ├── UniversalAudioController.cs
│ │ ├── UserController.cs
│ │ ├── UserLibraryController.cs
│ │ ├── UserViewsController.cs
│ │ ├── VideoAttachmentsController.cs
│ │ ├── VideosController.cs
│ │ └── YearsController.cs
│ ├── Extensions/
│ │ ├── ClaimsPrincipalExtensions.cs
│ │ └── DtoExtensions.cs
│ ├── Formatters/
│ │ ├── CamelCaseJsonProfileFormatter.cs
│ │ ├── CssOutputFormatter.cs
│ │ ├── PascalCaseJsonProfileFormatter.cs
│ │ └── XmlOutputFormatter.cs
│ ├── Helpers/
│ │ ├── AudioHelper.cs
│ │ ├── DynamicHlsHelper.cs
│ │ ├── FileStreamResponseHelpers.cs
│ │ ├── HlsCodecStringHelpers.cs
│ │ ├── HlsHelpers.cs
│ │ ├── MediaInfoHelper.cs
│ │ ├── RequestHelpers.cs
│ │ └── StreamingHelpers.cs
│ ├── Jellyfin.Api.csproj
│ ├── Middleware/
│ │ ├── BaseUrlRedirectionMiddleware.cs
│ │ ├── ExceptionMiddleware.cs
│ │ ├── IpBasedAccessValidationMiddleware.cs
│ │ ├── QueryStringDecodingMiddleware.cs
│ │ ├── ResponseTimeMiddleware.cs
│ │ ├── RobotsRedirectionMiddleware.cs
│ │ ├── ServerStartupMessageMiddleware.cs
│ │ ├── UrlDecodeQueryFeature.cs
│ │ └── WebSocketHandlerMiddleware.cs
│ ├── ModelBinders/
│ │ ├── CommaDelimitedCollectionModelBinder.cs
│ │ ├── LegacyDateTimeModelBinder.cs
│ │ ├── NullableEnumModelBinder.cs
│ │ ├── NullableEnumModelBinderProvider.cs
│ │ └── PipeDelimitedCollectionModelBinder.cs
│ ├── Models/
│ │ ├── ClientLogDtos/
│ │ │ └── ClientLogDocumentResponseDto.cs
│ │ ├── ConfigurationPageInfo.cs
│ │ ├── EnvironmentDtos/
│ │ │ ├── DefaultDirectoryBrowserInfoDto.cs
│ │ │ └── ValidatePathDto.cs
│ │ ├── LibraryDtos/
│ │ │ ├── LibraryOptionInfoDto.cs
│ │ │ ├── LibraryOptionsResultDto.cs
│ │ │ ├── LibraryTypeOptionsDto.cs
│ │ │ ├── MediaUpdateInfoDto.cs
│ │ │ └── MediaUpdateInfoPathDto.cs
│ │ ├── LibraryStructureDto/
│ │ │ ├── AddVirtualFolderDto.cs
│ │ │ ├── MediaPathDto.cs
│ │ │ ├── UpdateLibraryOptionsDto.cs
│ │ │ └── UpdateMediaPathRequestDto.cs
│ │ ├── LiveTvDtos/
│ │ │ ├── GetProgramsDto.cs
│ │ │ └── SetChannelMappingDto.cs
│ │ ├── MediaInfoDtos/
│ │ │ ├── OpenLiveStreamDto.cs
│ │ │ └── PlaybackInfoDto.cs
│ │ ├── PlaylistDtos/
│ │ │ ├── CreatePlaylistDto.cs
│ │ │ ├── UpdatePlaylistDto.cs
│ │ │ └── UpdatePlaylistUserDto.cs
│ │ ├── StartupDtos/
│ │ │ ├── StartupConfigurationDto.cs
│ │ │ ├── StartupRemoteAccessDto.cs
│ │ │ └── StartupUserDto.cs
│ │ ├── StreamingDtos/
│ │ │ ├── HlsAudioRequestDto.cs
│ │ │ └── HlsVideoRequestDto.cs
│ │ ├── SubtitleDtos/
│ │ │ └── UploadSubtitleDto.cs
│ │ ├── SyncPlayDtos/
│ │ │ ├── BufferRequestDto.cs
│ │ │ ├── IgnoreWaitRequestDto.cs
│ │ │ ├── JoinGroupRequestDto.cs
│ │ │ ├── MovePlaylistItemRequestDto.cs
│ │ │ ├── NewGroupRequestDto.cs
│ │ │ ├── NextItemRequestDto.cs
│ │ │ ├── PingRequestDto.cs
│ │ │ ├── PlayRequestDto.cs
│ │ │ ├── PreviousItemRequestDto.cs
│ │ │ ├── QueueRequestDto.cs
│ │ │ ├── ReadyRequestDto.cs
│ │ │ ├── RemoveFromPlaylistRequestDto.cs
│ │ │ ├── SeekRequestDto.cs
│ │ │ ├── SetPlaylistItemRequestDto.cs
│ │ │ ├── SetRepeatModeRequestDto.cs
│ │ │ └── SetShuffleModeRequestDto.cs
│ │ ├── SystemInfoDtos/
│ │ │ ├── FolderStorageDto.cs
│ │ │ ├── LibraryStorageDto.cs
│ │ │ └── SystemStorageDto.cs
│ │ ├── UserDtos/
│ │ │ ├── AuthenticateUserByName.cs
│ │ │ ├── CreateUserByName.cs
│ │ │ ├── ForgotPasswordDto.cs
│ │ │ ├── ForgotPasswordPinDto.cs
│ │ │ ├── QuickConnectDto.cs
│ │ │ └── UpdateUserPassword.cs
│ │ └── UserViewDtos/
│ │ └── SpecialViewOptionDto.cs
│ ├── Results/
│ │ └── OkResultOfT.cs
│ └── WebSocketListeners/
│ ├── ActivityLogWebSocketListener.cs
│ ├── ScheduledTasksWebSocketListener.cs
│ └── SessionInfoWebSocketListener.cs
├── Jellyfin.Data/
│ ├── Attributes/
│ │ └── OpenApiIgnoreEnumAttribute.cs
│ ├── DayOfWeekHelper.cs
│ ├── Dtos/
│ │ └── DeviceOptionsDto.cs
│ ├── Enums/
│ │ ├── ActivityLogSortBy.cs
│ │ ├── AudioSpatialFormat.cs
│ │ ├── BaseItemKind.cs
│ │ ├── CollectionType.cs
│ │ ├── ItemSortBy.cs
│ │ ├── MediaStreamProtocol.cs
│ │ ├── MediaType.cs
│ │ ├── PersonKind.cs
│ │ ├── SyncPlayAccessRequirementType.cs
│ │ ├── UnratedItem.cs
│ │ ├── VideoRange.cs
│ │ └── VideoRangeType.cs
│ ├── Events/
│ │ ├── GenericEventArgs.cs
│ │ ├── System/
│ │ │ └── PendingRestartEventArgs.cs
│ │ └── Users/
│ │ ├── UserCreatedEventArgs.cs
│ │ ├── UserDeletedEventArgs.cs
│ │ ├── UserLockedOutEventArgs.cs
│ │ ├── UserPasswordChangedEventArgs.cs
│ │ └── UserUpdatedEventArgs.cs
│ ├── Jellyfin.Data.csproj
│ ├── Queries/
│ │ ├── ActivityLogQuery.cs
│ │ ├── DeviceQuery.cs
│ │ └── PaginatedQuery.cs
│ └── UserEntityExtensions.cs
├── Jellyfin.Server/
│ ├── Configuration/
│ │ └── CorsPolicyProvider.cs
│ ├── CoreAppHost.cs
│ ├── Extensions/
│ │ ├── ApiApplicationBuilderExtensions.cs
│ │ ├── ApiServiceCollectionExtensions.cs
│ │ └── WebHostBuilderExtensions.cs
│ ├── Filters/
│ │ ├── AdditionalModelFilter.cs
│ │ ├── CachingOpenApiProvider.cs
│ │ ├── FileRequestFilter.cs
│ │ ├── FileResponseFilter.cs
│ │ ├── FlagsEnumSchemaFilter.cs
│ │ ├── IgnoreEnumSchemaFilter.cs
│ │ ├── ParameterObsoleteFilter.cs
│ │ ├── RetryOnTemporarilyUnavailableFilter.cs
│ │ ├── SecurityRequirementsOperationFilter.cs
│ │ └── SecuritySchemeReferenceFixupFilter.cs
│ ├── HealthChecks/
│ │ └── DbContextFactoryHealthCheck.cs
│ ├── Helpers/
│ │ └── StartupHelpers.cs
│ ├── Jellyfin.Server.csproj
│ ├── Migrations/
│ │ ├── IAsyncMigrationRoutine.cs
│ │ ├── IDatabaseMigrationRoutine.cs
│ │ ├── JellyfinMigrationAttribute.cs
│ │ ├── JellyfinMigrationBackupAttribute.cs
│ │ ├── JellyfinMigrationService.cs
│ │ ├── MigrationOptions.cs
│ │ ├── PreStartupRoutines/
│ │ │ ├── CreateNetworkConfiguration.cs
│ │ │ ├── MigrateEncodingOptions.cs
│ │ │ ├── MigrateMusicBrainzTimeout.cs
│ │ │ ├── MigrateNetworkConfiguration.cs
│ │ │ └── RenameEnableGroupingIntoCollections.cs
│ │ ├── Routines/
│ │ │ ├── AddDefaultCastReceivers.cs
│ │ │ ├── AddDefaultPluginRepository.cs
│ │ │ ├── CleanMusicArtist.cs
│ │ │ ├── CreateUserLoggingConfigFile.cs
│ │ │ ├── DisableLegacyAuthorization.cs
│ │ │ ├── DisableTranscodingThrottling.cs
│ │ │ ├── FixAudioData.cs
│ │ │ ├── FixDates.cs
│ │ │ ├── FixLibrarySubtitleDownloadLanguages.cs
│ │ │ ├── FixPlaylistOwner.cs
│ │ │ ├── MigrateActivityLogDb.cs
│ │ │ ├── MigrateAuthenticationDb.cs
│ │ │ ├── MigrateDisplayPreferencesDb.cs
│ │ │ ├── MigrateKeyframeData.cs
│ │ │ ├── MigrateLibraryDb.cs
│ │ │ ├── MigrateLibraryDbCompatibilityCheck.cs
│ │ │ ├── MigrateLibraryUserData.cs
│ │ │ ├── MigrateRatingLevels.cs
│ │ │ ├── MigrateUserDb.cs
│ │ │ ├── MoveExtractedFiles.cs
│ │ │ ├── MoveTrickplayFiles.cs
│ │ │ ├── ReaddDefaultPluginRepository.cs
│ │ │ ├── RefreshCleanNames.cs
│ │ │ ├── RefreshInternalDateModified.cs
│ │ │ ├── RemoveDownloadImagesInAdvance.cs
│ │ │ ├── RemoveDuplicateExtras.cs
│ │ │ ├── RemoveDuplicatePlaylistChildren.cs
│ │ │ ├── ReseedFolderFlag.cs
│ │ │ └── UpdateDefaultPluginRepository.cs
│ │ └── Stages/
│ │ ├── CodeMigration.cs
│ │ ├── JellyfinMigrationStageTypes.cs
│ │ └── MigrationStage.cs
│ ├── Program.cs
│ ├── Properties/
│ │ ├── AssemblyInfo.cs
│ │ └── launchSettings.json
│ ├── Resources/
│ │ └── Configuration/
│ │ └── logging.json
│ ├── ServerSetupApp/
│ │ ├── IStartupLogger.cs
│ │ ├── SetupServer.cs
│ │ ├── StartupLogTopic.cs
│ │ ├── StartupLogger.cs
│ │ ├── StartupLoggerExtensions.cs
│ │ ├── StartupLoggerOfCategory.cs
│ │ └── index.mstemplate.html
│ ├── Startup.cs
│ ├── StartupOptions.cs
│ └── wwwroot/
│ └── api-docs/
│ ├── redoc/
│ │ └── custom.css
│ └── swagger/
│ └── custom.css
├── Jellyfin.Server.Implementations/
│ ├── Activity/
│ │ └── ActivityManager.cs
│ ├── DbConfiguration/
│ │ ├── DatabaseConfigurationFactory.cs
│ │ └── DatabaseConfigurationStore.cs
│ ├── Devices/
│ │ └── DeviceManager.cs
│ ├── Events/
│ │ ├── Consumers/
│ │ │ ├── Library/
│ │ │ │ ├── LyricDownloadFailureLogger.cs
│ │ │ │ └── SubtitleDownloadFailureLogger.cs
│ │ │ ├── Security/
│ │ │ │ ├── AuthenticationFailedLogger.cs
│ │ │ │ └── AuthenticationSucceededLogger.cs
│ │ │ ├── Session/
│ │ │ │ ├── PlaybackStartLogger.cs
│ │ │ │ ├── PlaybackStopLogger.cs
│ │ │ │ ├── SessionEndedLogger.cs
│ │ │ │ └── SessionStartedLogger.cs
│ │ │ ├── System/
│ │ │ │ ├── PendingRestartNotifier.cs
│ │ │ │ ├── TaskCompletedLogger.cs
│ │ │ │ └── TaskCompletedNotifier.cs
│ │ │ ├── Updates/
│ │ │ │ ├── PluginInstallationCancelledNotifier.cs
│ │ │ │ ├── PluginInstallationFailedLogger.cs
│ │ │ │ ├── PluginInstallationFailedNotifier.cs
│ │ │ │ ├── PluginInstalledLogger.cs
│ │ │ │ ├── PluginInstalledNotifier.cs
│ │ │ │ ├── PluginInstallingNotifier.cs
│ │ │ │ ├── PluginUninstalledLogger.cs
│ │ │ │ ├── PluginUninstalledNotifier.cs
│ │ │ │ └── PluginUpdatedLogger.cs
│ │ │ └── Users/
│ │ │ ├── UserCreatedLogger.cs
│ │ │ ├── UserDeletedLogger.cs
│ │ │ ├── UserDeletedNotifier.cs
│ │ │ ├── UserLockedOutLogger.cs
│ │ │ ├── UserPasswordChangedLogger.cs
│ │ │ └── UserUpdatedNotifier.cs
│ │ ├── EventManager.cs
│ │ └── EventingServiceCollectionExtensions.cs
│ ├── Extensions/
│ │ ├── ExpressionExtensions.cs
│ │ └── ServiceCollectionExtensions.cs
│ ├── FullSystemBackup/
│ │ ├── BackupManifest.cs
│ │ ├── BackupOptions.cs
│ │ └── BackupService.cs
│ ├── Item/
│ │ ├── BaseItemRepository.cs
│ │ ├── ChapterRepository.cs
│ │ ├── KeyframeRepository.cs
│ │ ├── MediaAttachmentRepository.cs
│ │ ├── MediaStreamRepository.cs
│ │ ├── OrderMapper.cs
│ │ └── PeopleRepository.cs
│ ├── Jellyfin.Server.Implementations.csproj
│ ├── MediaSegments/
│ │ └── MediaSegmentManager.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Security/
│ │ ├── AuthenticationManager.cs
│ │ └── AuthorizationContext.cs
│ ├── StorageHelpers/
│ │ └── StorageHelper.cs
│ ├── Trickplay/
│ │ └── TrickplayManager.cs
│ └── Users/
│ ├── DefaultAuthenticationProvider.cs
│ ├── DefaultPasswordResetProvider.cs
│ ├── DeviceAccessHost.cs
│ ├── DisplayPreferencesManager.cs
│ ├── InvalidAuthProvider.cs
│ └── UserManager.cs
├── Jellyfin.sln
├── Jellyfin.sln.DotSettings
├── LICENSE
├── MediaBrowser.Common/
│ ├── Api/
│ │ └── Policies.cs
│ ├── Configuration/
│ │ ├── ConfigurationStore.cs
│ │ ├── ConfigurationUpdateEventArgs.cs
│ │ ├── EncodingConfigurationExtensions.cs
│ │ ├── IApplicationPaths.cs
│ │ ├── IConfigurationFactory.cs
│ │ ├── IConfigurationManager.cs
│ │ └── IValidatingConfiguration.cs
│ ├── Crc32.cs
│ ├── Events/
│ │ └── EventHelper.cs
│ ├── Extensions/
│ │ ├── BaseExtensions.cs
│ │ ├── HttpContextExtensions.cs
│ │ ├── MethodNotAllowedException.cs
│ │ ├── ProcessExtensions.cs
│ │ ├── RateLimitExceededException.cs
│ │ └── ResourceNotFoundException.cs
│ ├── FfmpegException.cs
│ ├── IApplicationHost.cs
│ ├── MediaBrowser.Common.csproj
│ ├── Net/
│ │ ├── INetworkManager.cs
│ │ ├── NamedClient.cs
│ │ ├── NetworkConfiguration.cs
│ │ ├── NetworkConfigurationExtensions.cs
│ │ ├── NetworkConfigurationFactory.cs
│ │ ├── NetworkConfigurationStore.cs
│ │ ├── NetworkConstants.cs
│ │ ├── NetworkUtils.cs
│ │ └── RemoteAccessPolicyResult.cs
│ ├── Plugins/
│ │ ├── BasePlugin.cs
│ │ ├── BasePluginOfT.cs
│ │ ├── IHasPluginConfiguration.cs
│ │ ├── IPlugin.cs
│ │ ├── IPluginAssembly.cs
│ │ ├── IPluginManager.cs
│ │ ├── LocalPlugin.cs
│ │ └── PluginManifest.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── ProviderIdParsers.cs
│ │ └── SubtitleConfigurationFactory.cs
│ ├── RequiresSourceSerialisationAttribute.cs
│ └── Updates/
│ ├── IInstallationManager.cs
│ ├── InstallationEventArgs.cs
│ └── InstallationFailedEventArgs.cs
├── MediaBrowser.Controller/
│ ├── Authentication/
│ │ ├── AuthenticationException.cs
│ │ ├── AuthenticationResult.cs
│ │ ├── IAuthenticationProvider.cs
│ │ └── IPasswordResetProvider.cs
│ ├── BaseItemManager/
│ │ ├── BaseItemManager.cs
│ │ └── IBaseItemManager.cs
│ ├── Channels/
│ │ ├── Channel.cs
│ │ ├── ChannelItemInfo.cs
│ │ ├── ChannelItemResult.cs
│ │ ├── ChannelItemType.cs
│ │ ├── ChannelLatestMediaSearch.cs
│ │ ├── ChannelParentalRating.cs
│ │ ├── ChannelSearchInfo.cs
│ │ ├── IChannel.cs
│ │ ├── IChannelManager.cs
│ │ ├── IDisableMediaSourceDisplay.cs
│ │ ├── IHasCacheKey.cs
│ │ ├── IHasFolderAttributes.cs
│ │ ├── IRequiresMediaInfoCallback.cs
│ │ ├── ISupportsDelete.cs
│ │ ├── ISupportsLatestMedia.cs
│ │ ├── ISupportsMediaProbe.cs
│ │ ├── InternalChannelFeatures.cs
│ │ └── InternalChannelItemQuery.cs
│ ├── Chapters/
│ │ └── IChapterManager.cs
│ ├── ClientEvent/
│ │ ├── ClientEventLogger.cs
│ │ └── IClientEventLogger.cs
│ ├── Collections/
│ │ ├── CollectionCreatedEventArgs.cs
│ │ ├── CollectionCreationOptions.cs
│ │ ├── CollectionModifiedEventArgs.cs
│ │ └── ICollectionManager.cs
│ ├── Configuration/
│ │ └── IServerConfigurationManager.cs
│ ├── Devices/
│ │ └── IDeviceManager.cs
│ ├── Drawing/
│ │ ├── IImageEncoder.cs
│ │ ├── IImageProcessor.cs
│ │ ├── ImageCollageOptions.cs
│ │ ├── ImageHelper.cs
│ │ ├── ImageProcessingOptions.cs
│ │ └── ImageProcessorExtensions.cs
│ ├── Dto/
│ │ ├── DtoOptions.cs
│ │ └── IDtoService.cs
│ ├── Entities/
│ │ ├── AggregateFolder.cs
│ │ ├── Audio/
│ │ │ ├── Audio.cs
│ │ │ ├── IHasAlbumArtist.cs
│ │ │ ├── IHasMusicGenres.cs
│ │ │ ├── MusicAlbum.cs
│ │ │ ├── MusicArtist.cs
│ │ │ └── MusicGenre.cs
│ │ ├── AudioBook.cs
│ │ ├── BaseItem.cs
│ │ ├── BaseItemExtensions.cs
│ │ ├── BasePluginFolder.cs
│ │ ├── Book.cs
│ │ ├── CollectionFolder.cs
│ │ ├── Extensions.cs
│ │ ├── Folder.cs
│ │ ├── Genre.cs
│ │ ├── ICollectionFolder.cs
│ │ ├── IHasAspectRatio.cs
│ │ ├── IHasDisplayOrder.cs
│ │ ├── IHasMediaSources.cs
│ │ ├── IHasProgramAttributes.cs
│ │ ├── IHasSeries.cs
│ │ ├── IHasSpecialFeatures.cs
│ │ ├── IHasStartDate.cs
│ │ ├── IHasTrailers.cs
│ │ ├── IItemByName.cs
│ │ ├── IMetadataContainer.cs
│ │ ├── ISupportsBoxSetGrouping.cs
│ │ ├── ISupportsPlaceHolders.cs
│ │ ├── InternalItemsQuery.cs
│ │ ├── InternalPeopleQuery.cs
│ │ ├── ItemImageInfo.cs
│ │ ├── LinkedChild.cs
│ │ ├── LinkedChildComparer.cs
│ │ ├── LinkedChildType.cs
│ │ ├── MediaSourceWidthComparator.cs
│ │ ├── Movies/
│ │ │ ├── BoxSet.cs
│ │ │ └── Movie.cs
│ │ ├── MusicVideo.cs
│ │ ├── PeopleHelper.cs
│ │ ├── Person.cs
│ │ ├── PersonInfo.cs
│ │ ├── Photo.cs
│ │ ├── PhotoAlbum.cs
│ │ ├── SourceType.cs
│ │ ├── Studio.cs
│ │ ├── TV/
│ │ │ ├── Episode.cs
│ │ │ ├── Season.cs
│ │ │ └── Series.cs
│ │ ├── TagExtensions.cs
│ │ ├── Trailer.cs
│ │ ├── UserItemData.cs
│ │ ├── UserRootFolder.cs
│ │ ├── UserView.cs
│ │ ├── UserViewBuilder.cs
│ │ ├── Video.cs
│ │ └── Year.cs
│ ├── Events/
│ │ ├── Authentication/
│ │ │ ├── AuthenticationRequestEventArgs.cs
│ │ │ └── AuthenticationResultEventArgs.cs
│ │ ├── IEventConsumer.cs
│ │ ├── IEventManager.cs
│ │ ├── Session/
│ │ │ ├── SessionEndedEventArgs.cs
│ │ │ └── SessionStartedEventArgs.cs
│ │ └── Updates/
│ │ ├── PluginInstallationCancelledEventArgs.cs
│ │ ├── PluginInstalledEventArgs.cs
│ │ ├── PluginInstallingEventArgs.cs
│ │ ├── PluginUninstalledEventArgs.cs
│ │ └── PluginUpdatedEventArgs.cs
│ ├── Extensions/
│ │ ├── ConfigurationExtensions.cs
│ │ └── XmlReaderExtensions.cs
│ ├── IDisplayPreferencesManager.cs
│ ├── IO/
│ │ ├── FileData.cs
│ │ ├── FileSystemHelper.cs
│ │ ├── IExternalDataManager.cs
│ │ └── IPathManager.cs
│ ├── IServerApplicationHost.cs
│ ├── IServerApplicationPaths.cs
│ ├── ISystemManager.cs
│ ├── Library/
│ │ ├── DeleteOptions.cs
│ │ ├── IDirectStreamProvider.cs
│ │ ├── IIntroProvider.cs
│ │ ├── IKeyframeManager.cs
│ │ ├── ILibraryManager.cs
│ │ ├── ILibraryMonitor.cs
│ │ ├── ILibraryPostScanTask.cs
│ │ ├── ILiveStream.cs
│ │ ├── IMediaSourceManager.cs
│ │ ├── IMediaSourceProvider.cs
│ │ ├── IMetadataFileSaver.cs
│ │ ├── IMetadataSaver.cs
│ │ ├── IMusicManager.cs
│ │ ├── ISearchEngine.cs
│ │ ├── IUserDataManager.cs
│ │ ├── IUserManager.cs
│ │ ├── IUserViewManager.cs
│ │ ├── IntroInfo.cs
│ │ ├── ItemChangeEventArgs.cs
│ │ ├── ItemResolveArgs.cs
│ │ ├── ItemUpdateType.cs
│ │ ├── LibraryManagerExtensions.cs
│ │ ├── MetadataConfigurationExtensions.cs
│ │ ├── MetadataConfigurationStore.cs
│ │ ├── NameExtensions.cs
│ │ ├── PlaybackProgressEventArgs.cs
│ │ ├── PlaybackStartEventArgs.cs
│ │ ├── PlaybackStopEventArgs.cs
│ │ ├── SearchHintInfo.cs
│ │ ├── TVUtils.cs
│ │ └── UserDataSaveEventArgs.cs
│ ├── LibraryTaskScheduler/
│ │ ├── ILimitedConcurrencyLibraryScheduler.cs
│ │ └── LimitedConcurrencyLibraryScheduler.cs
│ ├── LiveTv/
│ │ ├── ActiveRecordingInfo.cs
│ │ ├── ChannelInfo.cs
│ │ ├── IGuideManager.cs
│ │ ├── IListingsManager.cs
│ │ ├── IListingsProvider.cs
│ │ ├── ILiveTvManager.cs
│ │ ├── ILiveTvService.cs
│ │ ├── IRecordingsManager.cs
│ │ ├── ITunerHost.cs
│ │ ├── ITunerHostManager.cs
│ │ ├── LiveTvChannel.cs
│ │ ├── LiveTvConflictException.cs
│ │ ├── LiveTvProgram.cs
│ │ ├── ProgramInfo.cs
│ │ ├── SeriesTimerInfo.cs
│ │ ├── TimerEventInfo.cs
│ │ └── TimerInfo.cs
│ ├── Lyrics/
│ │ ├── ILyricManager.cs
│ │ ├── ILyricParser.cs
│ │ ├── ILyricProvider.cs
│ │ └── LyricDownloadFailureEventArgs.cs
│ ├── MediaBrowser.Controller.csproj
│ ├── MediaEncoding/
│ │ ├── BaseEncodingJobOptions.cs
│ │ ├── BitStreamFilterOptionType.cs
│ │ ├── DownMixAlgorithmsHelper.cs
│ │ ├── EncodingHelper.cs
│ │ ├── EncodingJobInfo.cs
│ │ ├── FilterOptionType.cs
│ │ ├── IAttachmentExtractor.cs
│ │ ├── IMediaEncoder.cs
│ │ ├── ISubtitleEncoder.cs
│ │ ├── ITranscodeManager.cs
│ │ ├── JobLogger.cs
│ │ ├── MediaInfoRequest.cs
│ │ ├── TranscodingJob.cs
│ │ ├── TranscodingJobType.cs
│ │ ├── TranscodingSegmentCleaner.cs
│ │ └── TranscodingThrottler.cs
│ ├── MediaSegments/
│ │ ├── IMediaSegmentManager.cs
│ │ └── IMediaSegmentProvider.cs
│ ├── Net/
│ │ ├── AuthorizationInfo.cs
│ │ ├── BasePeriodicWebSocketListener.cs
│ │ ├── IAuthService.cs
│ │ ├── IAuthorizationContext.cs
│ │ ├── IWebSocketConnection.cs
│ │ ├── IWebSocketListener.cs
│ │ ├── IWebSocketManager.cs
│ │ ├── SecurityException.cs
│ │ ├── WebSocketListenerState.cs
│ │ ├── WebSocketMessage.cs
│ │ ├── WebSocketMessageInfo.cs
│ │ ├── WebSocketMessageOfT.cs
│ │ └── WebSocketMessages/
│ │ ├── IInboundWebSocketMessage.cs
│ │ ├── IOutboundWebSocketMessage.cs
│ │ ├── Inbound/
│ │ │ ├── ActivityLogEntryStartMessage.cs
│ │ │ ├── ActivityLogEntryStopMessage.cs
│ │ │ ├── InboundKeepAliveMessage.cs
│ │ │ ├── ScheduledTasksInfoStartMessage.cs
│ │ │ ├── ScheduledTasksInfoStopMessage.cs
│ │ │ ├── SessionsStartMessage.cs
│ │ │ └── SessionsStopMessage.cs
│ │ ├── InboundWebSocketMessage.cs
│ │ ├── InboundWebSocketMessageOfT.cs
│ │ ├── Outbound/
│ │ │ ├── ActivityLogEntryMessage.cs
│ │ │ ├── ForceKeepAliveMessage.cs
│ │ │ ├── GeneralCommandMessage.cs
│ │ │ ├── LibraryChangedMessage.cs
│ │ │ ├── OutboundKeepAliveMessage.cs
│ │ │ ├── PlayMessage.cs
│ │ │ ├── PlaystateMessage.cs
│ │ │ ├── PluginInstallationCancelledMessage.cs
│ │ │ ├── PluginInstallationCompletedMessage.cs
│ │ │ ├── PluginInstallationFailedMessage.cs
│ │ │ ├── PluginInstallingMessage.cs
│ │ │ ├── PluginUninstalledMessage.cs
│ │ │ ├── RefreshProgressMessage.cs
│ │ │ ├── RestartRequiredMessage.cs
│ │ │ ├── ScheduledTaskEndedMessage.cs
│ │ │ ├── ScheduledTasksInfoMessage.cs
│ │ │ ├── SeriesTimerCancelledMessage.cs
│ │ │ ├── SeriesTimerCreatedMessage.cs
│ │ │ ├── ServerRestartingMessage.cs
│ │ │ ├── ServerShuttingDownMessage.cs
│ │ │ ├── SessionsMessage.cs
│ │ │ ├── SyncPlayCommandMessage.cs
│ │ │ ├── TimerCancelledMessage.cs
│ │ │ ├── TimerCreatedMessage.cs
│ │ │ ├── UserDataChangedMessage.cs
│ │ │ ├── UserDeletedMessage.cs
│ │ │ └── UserUpdatedMessage.cs
│ │ ├── OutboundWebSocketMessage.cs
│ │ └── OutboundWebSocketMessageOfT.cs
│ ├── Persistence/
│ │ ├── IChapterRepository.cs
│ │ ├── IItemRepository.cs
│ │ ├── IItemTypeLookup.cs
│ │ ├── IKeyframeRepository.cs
│ │ ├── IMediaAttachmentRepository.cs
│ │ ├── IMediaStreamRepository.cs
│ │ ├── IPeopleRepository.cs
│ │ ├── MediaAttachmentQuery.cs
│ │ └── MediaStreamQuery.cs
│ ├── Playlists/
│ │ ├── IPlaylistManager.cs
│ │ └── Playlist.cs
│ ├── Plugins/
│ │ └── IPluginServiceRegistrator.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── AlbumInfo.cs
│ │ ├── ArtistInfo.cs
│ │ ├── BookInfo.cs
│ │ ├── BoxSetInfo.cs
│ │ ├── DirectoryService.cs
│ │ ├── DynamicImageResponse.cs
│ │ ├── EpisodeInfo.cs
│ │ ├── ICustomMetadataProvider.cs
│ │ ├── IDirectoryService.cs
│ │ ├── IDynamicImageProvider.cs
│ │ ├── IExternalId.cs
│ │ ├── IExternalUrlProvider.cs
│ │ ├── IForcedProvider.cs
│ │ ├── IHasItemChangeMonitor.cs
│ │ ├── IHasLookupInfo.cs
│ │ ├── IHasOrder.cs
│ │ ├── IImageProvider.cs
│ │ ├── ILocalImageProvider.cs
│ │ ├── ILocalMetadataProvider.cs
│ │ ├── IMetadataProvider.cs
│ │ ├── IMetadataService.cs
│ │ ├── IPreRefreshProvider.cs
│ │ ├── IProviderManager.cs
│ │ ├── IRemoteImageProvider.cs
│ │ ├── IRemoteMetadataProvider.cs
│ │ ├── IRemoteSearchProvider.cs
│ │ ├── ImageRefreshOptions.cs
│ │ ├── ItemInfo.cs
│ │ ├── ItemLookupInfo.cs
│ │ ├── LocalImageInfo.cs
│ │ ├── MetadataRefreshMode.cs
│ │ ├── MetadataRefreshOptions.cs
│ │ ├── MetadataResult.cs
│ │ ├── MovieInfo.cs
│ │ ├── MusicVideoInfo.cs
│ │ ├── PersonLookupInfo.cs
│ │ ├── RefreshPriority.cs
│ │ ├── RemoteSearchQuery.cs
│ │ ├── SeasonInfo.cs
│ │ ├── SeriesInfo.cs
│ │ ├── SongInfo.cs
│ │ ├── TrailerInfo.cs
│ │ └── VideoContentType.cs
│ ├── QuickConnect/
│ │ └── IQuickConnect.cs
│ ├── Resolvers/
│ │ ├── IItemResolver.cs
│ │ ├── IResolverIgnoreRule.cs
│ │ ├── ItemResolver.cs
│ │ └── ResolverPriority.cs
│ ├── Security/
│ │ ├── AuthenticationInfo.cs
│ │ └── IAuthenticationManager.cs
│ ├── Session/
│ │ ├── AuthenticationRequest.cs
│ │ ├── ISessionController.cs
│ │ ├── ISessionManager.cs
│ │ ├── SessionEventArgs.cs
│ │ └── SessionInfo.cs
│ ├── Sorting/
│ │ ├── IBaseItemComparer.cs
│ │ ├── IUserBaseItemComparer.cs
│ │ └── SortExtensions.cs
│ ├── Streaming/
│ │ ├── ProgressiveFileStream.cs
│ │ ├── StreamState.cs
│ │ ├── StreamingRequestDto.cs
│ │ └── VideoRequestDto.cs
│ ├── Subtitles/
│ │ ├── ISubtitleManager.cs
│ │ ├── ISubtitleProvider.cs
│ │ ├── SubtitleDownloadFailureEventArgs.cs
│ │ ├── SubtitleResponse.cs
│ │ └── SubtitleSearchRequest.cs
│ ├── SyncPlay/
│ │ ├── GroupMember.cs
│ │ ├── GroupStates/
│ │ │ ├── AbstractGroupState.cs
│ │ │ ├── IdleGroupState.cs
│ │ │ ├── PausedGroupState.cs
│ │ │ ├── PlayingGroupState.cs
│ │ │ └── WaitingGroupState.cs
│ │ ├── IGroupPlaybackRequest.cs
│ │ ├── IGroupState.cs
│ │ ├── IGroupStateContext.cs
│ │ ├── ISyncPlayManager.cs
│ │ ├── ISyncPlayRequest.cs
│ │ ├── PlaybackRequests/
│ │ │ ├── AbstractPlaybackRequest.cs
│ │ │ ├── BufferGroupRequest.cs
│ │ │ ├── IgnoreWaitGroupRequest.cs
│ │ │ ├── MovePlaylistItemGroupRequest.cs
│ │ │ ├── NextItemGroupRequest.cs
│ │ │ ├── PauseGroupRequest.cs
│ │ │ ├── PingGroupRequest.cs
│ │ │ ├── PlayGroupRequest.cs
│ │ │ ├── PreviousItemGroupRequest.cs
│ │ │ ├── QueueGroupRequest.cs
│ │ │ ├── ReadyGroupRequest.cs
│ │ │ ├── RemoveFromPlaylistGroupRequest.cs
│ │ │ ├── SeekGroupRequest.cs
│ │ │ ├── SetPlaylistItemGroupRequest.cs
│ │ │ ├── SetRepeatModeGroupRequest.cs
│ │ │ ├── SetShuffleModeGroupRequest.cs
│ │ │ ├── StopGroupRequest.cs
│ │ │ └── UnpauseGroupRequest.cs
│ │ ├── Queue/
│ │ │ └── PlayQueueManager.cs
│ │ └── Requests/
│ │ ├── JoinGroupRequest.cs
│ │ ├── LeaveGroupRequest.cs
│ │ ├── ListGroupsRequest.cs
│ │ └── NewGroupRequest.cs
│ ├── SystemBackupService/
│ │ ├── BackupManifestDto.cs
│ │ ├── BackupOptionsDto.cs
│ │ ├── BackupRestoreRequestDto.cs
│ │ └── IBackupService.cs
│ ├── TV/
│ │ └── ITVSeriesManager.cs
│ └── Trickplay/
│ └── ITrickplayManager.cs
├── MediaBrowser.LocalMetadata/
│ ├── BaseXmlProvider.cs
│ ├── Images/
│ │ ├── CollectionFolderLocalImageProvider.cs
│ │ ├── EpisodeLocalImageProvider.cs
│ │ ├── InternalMetadataFolderImageProvider.cs
│ │ └── LocalImageProvider.cs
│ ├── MediaBrowser.LocalMetadata.csproj
│ ├── Parsers/
│ │ ├── BaseItemXmlParser.cs
│ │ ├── BoxSetXmlParser.cs
│ │ └── PlaylistXmlParser.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── BoxSetXmlProvider.cs
│ │ └── PlaylistXmlProvider.cs
│ ├── Savers/
│ │ ├── BaseXmlSaver.cs
│ │ ├── BoxSetXmlSaver.cs
│ │ └── PlaylistXmlSaver.cs
│ └── XmlProviderUtils.cs
├── MediaBrowser.MediaEncoding/
│ ├── Attachments/
│ │ └── AttachmentExtractor.cs
│ ├── BdInfo/
│ │ ├── BdInfoDirectoryInfo.cs
│ │ ├── BdInfoExaminer.cs
│ │ └── BdInfoFileInfo.cs
│ ├── Configuration/
│ │ ├── EncodingConfigurationFactory.cs
│ │ └── EncodingConfigurationStore.cs
│ ├── Encoder/
│ │ ├── ApplePlatformHelper.cs
│ │ ├── EncoderValidator.cs
│ │ ├── EncodingUtils.cs
│ │ └── MediaEncoder.cs
│ ├── MediaBrowser.MediaEncoding.csproj
│ ├── Probing/
│ │ ├── CodecType.cs
│ │ ├── FFProbeHelpers.cs
│ │ ├── InternalMediaInfoResult.cs
│ │ ├── MediaChapter.cs
│ │ ├── MediaFormatInfo.cs
│ │ ├── MediaFrameInfo.cs
│ │ ├── MediaFrameSideDataInfo.cs
│ │ ├── MediaStreamInfo.cs
│ │ ├── MediaStreamInfoSideData.cs
│ │ └── ProbeResultNormalizer.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Subtitles/
│ │ ├── AssWriter.cs
│ │ ├── ISubtitleParser.cs
│ │ ├── ISubtitleWriter.cs
│ │ ├── JsonWriter.cs
│ │ ├── SrtWriter.cs
│ │ ├── SsaWriter.cs
│ │ ├── SubtitleEditParser.cs
│ │ ├── SubtitleEncoder.cs
│ │ ├── SubtitleFormatExtensions.cs
│ │ ├── TtmlWriter.cs
│ │ └── VttWriter.cs
│ └── Transcoding/
│ └── TranscodeManager.cs
├── MediaBrowser.Model/
│ ├── Activity/
│ │ ├── ActivityLogEntry.cs
│ │ └── IActivityManager.cs
│ ├── ApiClient/
│ │ └── ServerDiscoveryInfo.cs
│ ├── Branding/
│ │ ├── BrandingOptions.cs
│ │ └── BrandingOptionsDto.cs
│ ├── Channels/
│ │ ├── ChannelFeatures.cs
│ │ ├── ChannelFolderType.cs
│ │ ├── ChannelItemSortField.cs
│ │ ├── ChannelMediaContentType.cs
│ │ ├── ChannelMediaType.cs
│ │ └── ChannelQuery.cs
│ ├── Collections/
│ │ └── CollectionCreationResult.cs
│ ├── Configuration/
│ │ ├── BaseApplicationConfiguration.cs
│ │ ├── EmbeddedSubtitleOptions.cs
│ │ ├── EncodingOptions.cs
│ │ ├── HlsAudioSeekStrategy.cs
│ │ ├── ImageOption.cs
│ │ ├── ImageSavingConvention.cs
│ │ ├── LibraryOptions.cs
│ │ ├── MediaPathInfo.cs
│ │ ├── MetadataConfiguration.cs
│ │ ├── MetadataOptions.cs
│ │ ├── MetadataPlugin.cs
│ │ ├── MetadataPluginSummary.cs
│ │ ├── MetadataPluginType.cs
│ │ ├── PathSubstitution.cs
│ │ ├── ServerConfiguration.cs
│ │ ├── TrickplayOptions.cs
│ │ ├── TrickplayScanBehavior.cs
│ │ ├── TypeOptions.cs
│ │ ├── UserConfiguration.cs
│ │ └── XbmcMetadataOptions.cs
│ ├── Cryptography/
│ │ ├── Constants.cs
│ │ ├── ICryptoProvider.cs
│ │ └── PasswordHash.cs
│ ├── Devices/
│ │ └── DeviceInfo.cs
│ ├── Dlna/
│ │ ├── CodecProfile.cs
│ │ ├── CodecType.cs
│ │ ├── ConditionProcessor.cs
│ │ ├── ContainerProfile.cs
│ │ ├── DeviceProfile.cs
│ │ ├── DirectPlayProfile.cs
│ │ ├── DlnaProfileType.cs
│ │ ├── EncodingContext.cs
│ │ ├── ITranscoderSupport.cs
│ │ ├── MediaOptions.cs
│ │ ├── PlaybackErrorCode.cs
│ │ ├── ProfileCondition.cs
│ │ ├── ProfileConditionType.cs
│ │ ├── ProfileConditionValue.cs
│ │ ├── ResolutionConfiguration.cs
│ │ ├── ResolutionNormalizer.cs
│ │ ├── ResolutionOptions.cs
│ │ ├── StreamBuilder.cs
│ │ ├── StreamInfo.cs
│ │ ├── SubtitleDeliveryMethod.cs
│ │ ├── SubtitleProfile.cs
│ │ ├── SubtitleStreamInfo.cs
│ │ ├── TranscodeSeekInfo.cs
│ │ └── TranscodingProfile.cs
│ ├── Drawing/
│ │ ├── DrawingUtils.cs
│ │ ├── ImageDimensions.cs
│ │ ├── ImageFormat.cs
│ │ ├── ImageFormatExtensions.cs
│ │ ├── ImageOrientation.cs
│ │ └── ImageResolution.cs
│ ├── Dto/
│ │ ├── BaseItemDto.cs
│ │ ├── BaseItemPerson.cs
│ │ ├── ClientCapabilitiesDto.cs
│ │ ├── DeviceInfoDto.cs
│ │ ├── DisplayPreferencesDto.cs
│ │ ├── IHasServerId.cs
│ │ ├── IItemDto.cs
│ │ ├── ImageInfo.cs
│ │ ├── ItemCounts.cs
│ │ ├── MediaSourceInfo.cs
│ │ ├── MediaSourceType.cs
│ │ ├── MetadataEditorInfo.cs
│ │ ├── NameGuidPair.cs
│ │ ├── NameIdPair.cs
│ │ ├── NameValuePair.cs
│ │ ├── PlaylistDto.cs
│ │ ├── RatingType.cs
│ │ ├── RecommendationDto.cs
│ │ ├── RecommendationType.cs
│ │ ├── SessionInfoDto.cs
│ │ ├── TrickplayInfoDto.cs
│ │ ├── UpdateUserItemDataDto.cs
│ │ ├── UserDto.cs
│ │ └── UserItemDataDto.cs
│ ├── Entities/
│ │ ├── ChapterInfo.cs
│ │ ├── CollectionTypeOptions.cs
│ │ ├── DeinterlaceMethod.cs
│ │ ├── DownMixStereoAlgorithms.cs
│ │ ├── EncoderPreset.cs
│ │ ├── ExtraType.cs
│ │ ├── HardwareAccelerationType.cs
│ │ ├── IHasProviderIds.cs
│ │ ├── IHasShares.cs
│ │ ├── ImageType.cs
│ │ ├── IsoType.cs
│ │ ├── LibraryUpdateInfo.cs
│ │ ├── LocationType.cs
│ │ ├── MediaAttachment.cs
│ │ ├── MediaStream.cs
│ │ ├── MediaStreamType.cs
│ │ ├── MediaUrl.cs
│ │ ├── MetadataField.cs
│ │ ├── MetadataProvider.cs
│ │ ├── ParentalRating.cs
│ │ ├── ParentalRatingEntry.cs
│ │ ├── ParentalRatingScore.cs
│ │ ├── ParentalRatingSystem.cs
│ │ ├── PersonType.cs
│ │ ├── PlaylistUserPermissions.cs
│ │ ├── ProviderIdsExtensions.cs
│ │ ├── SeriesStatus.cs
│ │ ├── TonemappingAlgorithm.cs
│ │ ├── TonemappingMode.cs
│ │ ├── TonemappingRange.cs
│ │ ├── TrailerType.cs
│ │ ├── UserDataSaveReason.cs
│ │ ├── Video3DFormat.cs
│ │ ├── VideoType.cs
│ │ └── VirtualFolderInfo.cs
│ ├── Extensions/
│ │ ├── ContainerHelper.cs
│ │ ├── EnumerableExtensions.cs
│ │ ├── LibraryOptionsExtension.cs
│ │ └── StringHelper.cs
│ ├── Globalization/
│ │ ├── CountryInfo.cs
│ │ ├── CultureDto.cs
│ │ ├── ILocalizationManager.cs
│ │ └── LocalizationOption.cs
│ ├── IO/
│ │ ├── AsyncFile.cs
│ │ ├── FileSystemEntryInfo.cs
│ │ ├── FileSystemEntryType.cs
│ │ ├── FileSystemMetadata.cs
│ │ ├── IFileSystem.cs
│ │ ├── IODefaults.cs
│ │ ├── IShortcutHandler.cs
│ │ └── IStreamHelper.cs
│ ├── Library/
│ │ ├── PlayAccess.cs
│ │ └── UserViewQuery.cs
│ ├── LiveTv/
│ │ ├── BaseTimerInfoDto.cs
│ │ ├── ChannelMappingOptionsDto.cs
│ │ ├── ChannelType.cs
│ │ ├── DayPattern.cs
│ │ ├── GuideInfo.cs
│ │ ├── ListingsProviderInfo.cs
│ │ ├── LiveTvChannelQuery.cs
│ │ ├── LiveTvInfo.cs
│ │ ├── LiveTvOptions.cs
│ │ ├── LiveTvServiceInfo.cs
│ │ ├── LiveTvServiceStatus.cs
│ │ ├── ProgramAudio.cs
│ │ ├── RecordingQuery.cs
│ │ ├── RecordingStatus.cs
│ │ ├── SeriesTimerInfoDto.cs
│ │ ├── SeriesTimerQuery.cs
│ │ ├── TimerInfoDto.cs
│ │ ├── TimerQuery.cs
│ │ ├── TunerChannelMapping.cs
│ │ └── TunerHostInfo.cs
│ ├── Lyrics/
│ │ ├── LyricDto.cs
│ │ ├── LyricFile.cs
│ │ ├── LyricLine.cs
│ │ ├── LyricLineCue.cs
│ │ ├── LyricMetadata.cs
│ │ ├── LyricResponse.cs
│ │ ├── LyricSearchRequest.cs
│ │ ├── RemoteLyricInfoDto.cs
│ │ └── UploadLyricDto.cs
│ ├── MediaBrowser.Model.csproj
│ ├── MediaInfo/
│ │ ├── AudioCodec.cs
│ │ ├── AudioIndexSource.cs
│ │ ├── BlurayDiscInfo.cs
│ │ ├── IBlurayExaminer.cs
│ │ ├── LiveStreamRequest.cs
│ │ ├── LiveStreamResponse.cs
│ │ ├── MediaInfo.cs
│ │ ├── MediaProtocol.cs
│ │ ├── PlaybackInfoResponse.cs
│ │ ├── SubtitleFormat.cs
│ │ ├── SubtitleTrackEvent.cs
│ │ ├── SubtitleTrackInfo.cs
│ │ └── TransportStreamTimestamp.cs
│ ├── MediaSegments/
│ │ ├── MediaSegmentDto.cs
│ │ └── MediaSegmentGenerationRequest.cs
│ ├── Net/
│ │ ├── EndPointInfo.cs
│ │ ├── IPData.cs
│ │ ├── ISocketFactory.cs
│ │ ├── MimeTypes.cs
│ │ └── PublishedServerUriOverride.cs
│ ├── Notifications/
│ │ └── NotificationType.cs
│ ├── Playlists/
│ │ ├── PlaylistCreationRequest.cs
│ │ ├── PlaylistCreationResult.cs
│ │ ├── PlaylistUpdateRequest.cs
│ │ └── PlaylistUserUpdateRequest.cs
│ ├── Plugins/
│ │ ├── BasePluginConfiguration.cs
│ │ ├── IHasWebPages.cs
│ │ ├── PluginInfo.cs
│ │ ├── PluginPageInfo.cs
│ │ └── PluginStatus.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── ExternalIdInfo.cs
│ │ ├── ExternalIdMediaType.cs
│ │ ├── ExternalUrl.cs
│ │ ├── ImageProviderInfo.cs
│ │ ├── LyricProviderInfo.cs
│ │ ├── RemoteImageInfo.cs
│ │ ├── RemoteImageQuery.cs
│ │ ├── RemoteImageResult.cs
│ │ ├── RemoteLyricInfo.cs
│ │ ├── RemoteSearchResult.cs
│ │ ├── RemoteSubtitleInfo.cs
│ │ ├── SubtitleOptions.cs
│ │ └── SubtitleProviderInfo.cs
│ ├── Querying/
│ │ ├── AllThemeMediaResult.cs
│ │ ├── ItemFields.cs
│ │ ├── ItemFilter.cs
│ │ ├── LatestItemsQuery.cs
│ │ ├── NextUpQuery.cs
│ │ ├── QueryFilters.cs
│ │ ├── QueryFiltersLegacy.cs
│ │ ├── QueryResult.cs
│ │ └── ThemeMediaResult.cs
│ ├── QuickConnect/
│ │ └── QuickConnectResult.cs
│ ├── Search/
│ │ ├── SearchHint.cs
│ │ ├── SearchHintResult.cs
│ │ └── SearchQuery.cs
│ ├── Serialization/
│ │ └── IXmlSerializer.cs
│ ├── Session/
│ │ ├── BrowseRequest.cs
│ │ ├── ClientCapabilities.cs
│ │ ├── GeneralCommand.cs
│ │ ├── GeneralCommandType.cs
│ │ ├── MessageCommand.cs
│ │ ├── PlayCommand.cs
│ │ ├── PlayMethod.cs
│ │ ├── PlayRequest.cs
│ │ ├── PlaybackOrder.cs
│ │ ├── PlaybackProgressInfo.cs
│ │ ├── PlaybackStartInfo.cs
│ │ ├── PlaybackStopInfo.cs
│ │ ├── PlayerStateInfo.cs
│ │ ├── PlaystateCommand.cs
│ │ ├── PlaystateRequest.cs
│ │ ├── QueueItem.cs
│ │ ├── RepeatMode.cs
│ │ ├── SessionMessageType.cs
│ │ ├── SessionUserInfo.cs
│ │ ├── TranscodeReason.cs
│ │ ├── TranscodingInfo.cs
│ │ └── UserDataChangeInfo.cs
│ ├── Subtitles/
│ │ └── FontFile.cs
│ ├── SyncPlay/
│ │ ├── GroupInfoDto.cs
│ │ ├── GroupQueueMode.cs
│ │ ├── GroupRepeatMode.cs
│ │ ├── GroupShuffleMode.cs
│ │ ├── GroupStateType.cs
│ │ ├── GroupStateUpdate.cs
│ │ ├── GroupUpdate.cs
│ │ ├── GroupUpdateType.cs
│ │ ├── PlayQueueUpdate.cs
│ │ ├── PlayQueueUpdateReason.cs
│ │ ├── PlaybackRequestType.cs
│ │ ├── RequestType.cs
│ │ ├── SendCommand.cs
│ │ ├── SendCommandType.cs
│ │ ├── SyncPlayBroadcastType.cs
│ │ ├── SyncPlayGroupDoesNotExistUpdate.cs
│ │ ├── SyncPlayGroupJoinedUpdate.cs
│ │ ├── SyncPlayGroupLeftUpdate.cs
│ │ ├── SyncPlayLibraryAccessDeniedUpdate.cs
│ │ ├── SyncPlayNotInGroupUpdate.cs
│ │ ├── SyncPlayPlayQueueUpdate.cs
│ │ ├── SyncPlayQueueItem.cs
│ │ ├── SyncPlayStateUpdate.cs
│ │ ├── SyncPlayUserJoinedUpdate.cs
│ │ ├── SyncPlayUserLeftUpdate.cs
│ │ └── UtcTimeResponse.cs
│ ├── System/
│ │ ├── CastReceiverApplication.cs
│ │ ├── FolderStorageInfo.cs
│ │ ├── LibraryStorageInfo.cs
│ │ ├── LogFile.cs
│ │ ├── PublicSystemInfo.cs
│ │ ├── SystemInfo.cs
│ │ └── SystemStorageInfo.cs
│ ├── Tasks/
│ │ ├── IConfigurableScheduledTask.cs
│ │ ├── IScheduledTask.cs
│ │ ├── IScheduledTaskWorker.cs
│ │ ├── ITaskManager.cs
│ │ ├── ITaskTrigger.cs
│ │ ├── ScheduledTaskHelpers.cs
│ │ ├── TaskCompletionEventArgs.cs
│ │ ├── TaskCompletionStatus.cs
│ │ ├── TaskInfo.cs
│ │ ├── TaskOptions.cs
│ │ ├── TaskResult.cs
│ │ ├── TaskState.cs
│ │ ├── TaskTriggerInfo.cs
│ │ └── TaskTriggerInfoType.cs
│ ├── Updates/
│ │ ├── InstallationInfo.cs
│ │ ├── PackageInfo.cs
│ │ ├── RepositoryInfo.cs
│ │ └── VersionInfo.cs
│ └── Users/
│ ├── ForgotPasswordAction.cs
│ ├── ForgotPasswordResult.cs
│ ├── PinRedeemResult.cs
│ └── UserPolicy.cs
├── MediaBrowser.Providers/
│ ├── Books/
│ │ ├── AudioBookMetadataService.cs
│ │ ├── BookMetadataService.cs
│ │ └── OpenPackagingFormat/
│ │ ├── EpubImageProvider.cs
│ │ ├── EpubProvider.cs
│ │ ├── EpubUtils.cs
│ │ ├── OpfProvider.cs
│ │ └── OpfReader.cs
│ ├── BoxSets/
│ │ └── BoxSetMetadataService.cs
│ ├── Channels/
│ │ └── ChannelMetadataService.cs
│ ├── Folders/
│ │ ├── CollectionFolderMetadataService.cs
│ │ ├── FolderMetadataService.cs
│ │ └── UserViewMetadataService.cs
│ ├── Genres/
│ │ └── GenreMetadataService.cs
│ ├── LiveTv/
│ │ └── LiveTvMetadataService.cs
│ ├── Lyric/
│ │ ├── LrcLyricParser.cs
│ │ ├── LyricManager.cs
│ │ ├── LyricScheduledTask.cs
│ │ └── TxtLyricParser.cs
│ ├── Manager/
│ │ ├── ImageSaver.cs
│ │ ├── ItemImageProvider.cs
│ │ ├── MetadataService.cs
│ │ ├── ProviderManager.cs
│ │ └── RefreshResult.cs
│ ├── MediaBrowser.Providers.csproj
│ ├── MediaInfo/
│ │ ├── AudioFileProber.cs
│ │ ├── AudioImageProvider.cs
│ │ ├── AudioResolver.cs
│ │ ├── EmbeddedImageProvider.cs
│ │ ├── FFProbeVideoInfo.cs
│ │ ├── LyricResolver.cs
│ │ ├── MediaInfoResolver.cs
│ │ ├── ProbeProvider.cs
│ │ ├── SubtitleDownloader.cs
│ │ ├── SubtitleResolver.cs
│ │ ├── SubtitleScheduledTask.cs
│ │ └── VideoImageProvider.cs
│ ├── Movies/
│ │ ├── ImdbExternalId.cs
│ │ ├── ImdbExternalUrlProvider.cs
│ │ ├── ImdbPersonExternalId.cs
│ │ ├── MovieMetadataService.cs
│ │ └── TrailerMetadataService.cs
│ ├── Music/
│ │ ├── AlbumInfoExtensions.cs
│ │ ├── AlbumMetadataService.cs
│ │ ├── ArtistMetadataService.cs
│ │ ├── AudioMetadataService.cs
│ │ ├── ImvdbId.cs
│ │ └── MusicVideoMetadataService.cs
│ ├── MusicGenres/
│ │ └── MusicGenreMetadataService.cs
│ ├── People/
│ │ └── PersonMetadataService.cs
│ ├── Photos/
│ │ ├── PhotoAlbumMetadataService.cs
│ │ └── PhotoMetadataService.cs
│ ├── Playlists/
│ │ ├── PlaylistItemsProvider.cs
│ │ └── PlaylistMetadataService.cs
│ ├── Plugins/
│ │ ├── AudioDb/
│ │ │ ├── AudioDbAlbumExternalId.cs
│ │ │ ├── AudioDbAlbumExternalUrlProvider.cs
│ │ │ ├── AudioDbAlbumImageProvider.cs
│ │ │ ├── AudioDbAlbumProvider.cs
│ │ │ ├── AudioDbArtistExternalId.cs
│ │ │ ├── AudioDbArtistExternalUrlProvider.cs
│ │ │ ├── AudioDbArtistImageProvider.cs
│ │ │ ├── AudioDbArtistProvider.cs
│ │ │ ├── AudioDbOtherAlbumExternalId.cs
│ │ │ ├── AudioDbOtherArtistExternalId.cs
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ └── Plugin.cs
│ │ ├── MusicBrainz/
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ ├── MusicBrainzAlbumArtistExternalId.cs
│ │ │ ├── MusicBrainzAlbumArtistExternalUrlProvider.cs
│ │ │ ├── MusicBrainzAlbumExternalId.cs
│ │ │ ├── MusicBrainzAlbumExternalUrlProvider.cs
│ │ │ ├── MusicBrainzAlbumProvider.cs
│ │ │ ├── MusicBrainzArtistExternalId.cs
│ │ │ ├── MusicBrainzArtistExternalUrlProvider.cs
│ │ │ ├── MusicBrainzArtistProvider.cs
│ │ │ ├── MusicBrainzOtherArtistExternalId.cs
│ │ │ ├── MusicBrainzRecordingId.cs
│ │ │ ├── MusicBrainzReleaseGroupExternalId.cs
│ │ │ ├── MusicBrainzReleaseGroupExternalUrlProvider.cs
│ │ │ ├── MusicBrainzTrackExternalUrlProvider.cs
│ │ │ ├── MusicBrainzTrackId.cs
│ │ │ └── Plugin.cs
│ │ ├── Omdb/
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ ├── JsonOmdbNotAvailableInt32Converter.cs
│ │ │ ├── JsonOmdbNotAvailableStringConverter.cs
│ │ │ ├── OmdbEpisodeProvider.cs
│ │ │ ├── OmdbImageProvider.cs
│ │ │ ├── OmdbItemProvider.cs
│ │ │ ├── OmdbProvider.cs
│ │ │ └── Plugin.cs
│ │ ├── StudioImages/
│ │ │ ├── Configuration/
│ │ │ │ ├── PluginConfiguration.cs
│ │ │ │ └── config.html
│ │ │ ├── Plugin.cs
│ │ │ └── StudiosImageProvider.cs
│ │ └── Tmdb/
│ │ ├── Api/
│ │ │ └── TmdbController.cs
│ │ ├── BoxSets/
│ │ │ ├── TmdbBoxSetExternalId.cs
│ │ │ ├── TmdbBoxSetImageProvider.cs
│ │ │ └── TmdbBoxSetProvider.cs
│ │ ├── Configuration/
│ │ │ ├── PluginConfiguration.cs
│ │ │ └── config.html
│ │ ├── Movies/
│ │ │ ├── TmdbMovieExternalId.cs
│ │ │ ├── TmdbMovieImageProvider.cs
│ │ │ └── TmdbMovieProvider.cs
│ │ ├── People/
│ │ │ ├── TmdbPersonExternalId.cs
│ │ │ ├── TmdbPersonImageProvider.cs
│ │ │ └── TmdbPersonProvider.cs
│ │ ├── Plugin.cs
│ │ ├── TV/
│ │ │ ├── TmdbEpisodeImageProvider.cs
│ │ │ ├── TmdbEpisodeProvider.cs
│ │ │ ├── TmdbSeasonImageProvider.cs
│ │ │ ├── TmdbSeasonProvider.cs
│ │ │ ├── TmdbSeriesExternalId.cs
│ │ │ ├── TmdbSeriesImageProvider.cs
│ │ │ └── TmdbSeriesProvider.cs
│ │ ├── TmdbClientManager.cs
│ │ ├── TmdbExternalUrlProvider.cs
│ │ └── TmdbUtils.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Studios/
│ │ └── StudioMetadataService.cs
│ ├── Subtitles/
│ │ └── SubtitleManager.cs
│ ├── TV/
│ │ ├── EpisodeMetadataService.cs
│ │ ├── SeasonMetadataService.cs
│ │ ├── SeriesMetadataService.cs
│ │ ├── Zap2ItExternalId.cs
│ │ └── Zap2ItExternalUrlProvider.cs
│ ├── Trickplay/
│ │ ├── TrickplayImagesTask.cs
│ │ ├── TrickplayMoveImagesTask.cs
│ │ └── TrickplayProvider.cs
│ ├── Videos/
│ │ └── VideoMetadataService.cs
│ └── Years/
│ └── YearMetadataService.cs
├── MediaBrowser.XbmcMetadata/
│ ├── Configuration/
│ │ ├── NfoConfigurationExtension.cs
│ │ └── NfoConfigurationFactory.cs
│ ├── MediaBrowser.XbmcMetadata.csproj
│ ├── NfoUserDataSaver.cs
│ ├── Parsers/
│ │ ├── BaseNfoParser.cs
│ │ ├── EpisodeNfoParser.cs
│ │ ├── MovieNfoParser.cs
│ │ ├── SeasonNfoParser.cs
│ │ ├── SeriesNfoParser.cs
│ │ └── SeriesNfoSeasonParser.cs
│ ├── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Providers/
│ │ ├── AlbumNfoProvider.cs
│ │ ├── ArtistNfoProvider.cs
│ │ ├── BaseNfoProvider.cs
│ │ ├── BaseVideoNfoProvider.cs
│ │ ├── EpisodeNfoProvider.cs
│ │ ├── MovieNfoProvider.cs
│ │ ├── MusicVideoNfoProvider.cs
│ │ ├── SeasonNfoProvider.cs
│ │ ├── SeriesNfoProvider.cs
│ │ ├── SeriesNfoSeasonProvider.cs
│ │ └── VideoNfoProvider.cs
│ └── Savers/
│ ├── AlbumNfoSaver.cs
│ ├── ArtistNfoSaver.cs
│ ├── BaseNfoSaver.cs
│ ├── EpisodeNfoSaver.cs
│ ├── MovieNfoSaver.cs
│ ├── SeasonNfoSaver.cs
│ └── SeriesNfoSaver.cs
├── README.md
├── SharedVersion.cs
├── bump_version
├── deployment/
│ └── unraid/
│ └── docker-templates/
│ ├── README.md
│ └── jellyfin.xml
├── fuzz/
│ ├── .gitignore
│ ├── Emby.Server.Implementations.Fuzz/
│ │ ├── Emby.Server.Implementations.Fuzz.csproj
│ │ ├── Program.cs
│ │ ├── Testcases/
│ │ │ ├── PathExtensions.TryReplaceSubPath/
│ │ │ │ └── test1.txt
│ │ │ └── SqliteItemRepository.ItemImageInfoFromValueString/
│ │ │ └── test1.txt
│ │ └── fuzz.sh
│ ├── Jellyfin.Api.Fuzz/
│ │ ├── Jellyfin.Api.Fuzz.csproj
│ │ ├── Program.cs
│ │ ├── Testcases/
│ │ │ └── UrlDecodeQueryFeature/
│ │ │ └── test1.txt
│ │ └── fuzz.sh
│ └── README.md
├── global.json
├── jellyfin.code-workspace
├── nuget.config
├── src/
│ ├── Directory.Build.props
│ ├── Jellyfin.CodeAnalysis/
│ │ ├── AnalyzerReleases.Shipped.md
│ │ ├── AsyncDisposalPatternAnalyzer.cs
│ │ └── Jellyfin.CodeAnalysis.csproj
│ ├── Jellyfin.Database/
│ │ ├── Jellyfin.Database.Implementations/
│ │ │ ├── DbConfiguration/
│ │ │ │ ├── CustomDatabaseOption.cs
│ │ │ │ ├── CustomDatabaseOptions.cs
│ │ │ │ ├── DatabaseConfigurationOptions.cs
│ │ │ │ └── DatabaseLockingBehaviorTypes.cs
│ │ │ ├── Entities/
│ │ │ │ ├── AccessSchedule.cs
│ │ │ │ ├── ActivityLog.cs
│ │ │ │ ├── AncestorId.cs
│ │ │ │ ├── AttachmentStreamInfo.cs
│ │ │ │ ├── BaseItemEntity.cs
│ │ │ │ ├── BaseItemExtraType.cs
│ │ │ │ ├── BaseItemImageInfo.cs
│ │ │ │ ├── BaseItemMetadataField.cs
│ │ │ │ ├── BaseItemProvider.cs
│ │ │ │ ├── BaseItemTrailerType.cs
│ │ │ │ ├── Chapter.cs
│ │ │ │ ├── CustomItemDisplayPreferences.cs
│ │ │ │ ├── DisplayPreferences.cs
│ │ │ │ ├── Group.cs
│ │ │ │ ├── HomeSection.cs
│ │ │ │ ├── ImageInfo.cs
│ │ │ │ ├── ImageInfoImageType.cs
│ │ │ │ ├── ItemDisplayPreferences.cs
│ │ │ │ ├── ItemValue.cs
│ │ │ │ ├── ItemValueMap.cs
│ │ │ │ ├── ItemValueType.cs
│ │ │ │ ├── KeyframeData.cs
│ │ │ │ ├── Libraries/
│ │ │ │ │ ├── Artwork.cs
│ │ │ │ │ ├── Book.cs
│ │ │ │ │ ├── BookMetadata.cs
│ │ │ │ │ ├── Chapter.cs
│ │ │ │ │ ├── Collection.cs
│ │ │ │ │ ├── CollectionItem.cs
│ │ │ │ │ ├── Company.cs
│ │ │ │ │ ├── CompanyMetadata.cs
│ │ │ │ │ ├── CustomItem.cs
│ │ │ │ │ ├── CustomItemMetadata.cs
│ │ │ │ │ ├── Episode.cs
│ │ │ │ │ ├── EpisodeMetadata.cs
│ │ │ │ │ ├── Genre.cs
│ │ │ │ │ ├── ItemMetadata.cs
│ │ │ │ │ ├── Library.cs
│ │ │ │ │ ├── LibraryItem.cs
│ │ │ │ │ ├── MediaFile.cs
│ │ │ │ │ ├── MediaFileStream.cs
│ │ │ │ │ ├── MetadataProvider.cs
│ │ │ │ │ ├── MetadataProviderId.cs
│ │ │ │ │ ├── Movie.cs
│ │ │ │ │ ├── MovieMetadata.cs
│ │ │ │ │ ├── MusicAlbum.cs
│ │ │ │ │ ├── MusicAlbumMetadata.cs
│ │ │ │ │ ├── Person.cs
│ │ │ │ │ ├── PersonRole.cs
│ │ │ │ │ ├── Photo.cs
│ │ │ │ │ ├── PhotoMetadata.cs
│ │ │ │ │ ├── Rating.cs
│ │ │ │ │ ├── RatingSource.cs
│ │ │ │ │ ├── Release.cs
│ │ │ │ │ ├── Season.cs
│ │ │ │ │ ├── SeasonMetadata.cs
│ │ │ │ │ ├── Series.cs
│ │ │ │ │ ├── SeriesMetadata.cs
│ │ │ │ │ ├── Track.cs
│ │ │ │ │ └── TrackMetadata.cs
│ │ │ │ ├── MediaSegment.cs
│ │ │ │ ├── MediaStreamInfo.cs
│ │ │ │ ├── MediaStreamTypeEntity.cs
│ │ │ │ ├── People.cs
│ │ │ │ ├── PeopleBaseItemMap.cs
│ │ │ │ ├── Permission.cs
│ │ │ │ ├── Preference.cs
│ │ │ │ ├── ProgramAudioEntity.cs
│ │ │ │ ├── Security/
│ │ │ │ │ ├── ApiKey.cs
│ │ │ │ │ ├── Device.cs
│ │ │ │ │ └── DeviceOptions.cs
│ │ │ │ ├── TrickplayInfo.cs
│ │ │ │ ├── User.cs
│ │ │ │ └── UserData.cs
│ │ │ ├── Enums/
│ │ │ │ ├── ArtKind.cs
│ │ │ │ ├── ChromecastVersion.cs
│ │ │ │ ├── DynamicDayOfWeek.cs
│ │ │ │ ├── HomeSectionType.cs
│ │ │ │ ├── IndexingKind.cs
│ │ │ │ ├── MediaFileKind.cs
│ │ │ │ ├── MediaSegmentType.cs
│ │ │ │ ├── PermissionKind.cs
│ │ │ │ ├── PersonRoleType.cs
│ │ │ │ ├── PreferenceKind.cs
│ │ │ │ ├── ScrollDirection.cs
│ │ │ │ ├── SortOrder.cs
│ │ │ │ ├── SubtitlePlaybackMode.cs
│ │ │ │ ├── SyncPlayUserAccessType.cs
│ │ │ │ └── ViewType.cs
│ │ │ ├── IJellyfinDatabaseProvider.cs
│ │ │ ├── Interfaces/
│ │ │ │ ├── IHasArtwork.cs
│ │ │ │ ├── IHasCompanies.cs
│ │ │ │ ├── IHasConcurrencyToken.cs
│ │ │ │ ├── IHasPermissions.cs
│ │ │ │ └── IHasReleases.cs
│ │ │ ├── Jellyfin.Database.Implementations.csproj
│ │ │ ├── JellyfinDatabaseProviderKeyAttribute.cs
│ │ │ ├── JellyfinDbContext.cs
│ │ │ ├── JellyfinQueryHelperExtensions.cs
│ │ │ ├── Locking/
│ │ │ │ ├── IEntityFrameworkCoreLockingBehavior.cs
│ │ │ │ ├── NoLockBehavior.cs
│ │ │ │ ├── OptimisticLockBehavior.cs
│ │ │ │ └── PessimisticLockBehavior.cs
│ │ │ ├── ModelConfiguration/
│ │ │ │ ├── ActivityLogConfiguration.cs
│ │ │ │ ├── AncestorIdConfiguration.cs
│ │ │ │ ├── ApiKeyConfiguration.cs
│ │ │ │ ├── AttachmentStreamInfoConfiguration.cs
│ │ │ │ ├── BaseItemConfiguration.cs
│ │ │ │ ├── BaseItemMetadataFieldConfiguration.cs
│ │ │ │ ├── BaseItemProviderConfiguration.cs
│ │ │ │ ├── BaseItemTrailerTypeConfiguration.cs
│ │ │ │ ├── ChapterConfiguration.cs
│ │ │ │ ├── CustomItemDisplayPreferencesConfiguration.cs
│ │ │ │ ├── DeviceConfiguration.cs
│ │ │ │ ├── DeviceOptionsConfiguration.cs
│ │ │ │ ├── DisplayPreferencesConfiguration.cs
│ │ │ │ ├── ItemValuesConfiguration.cs
│ │ │ │ ├── ItemValuesMapConfiguration.cs
│ │ │ │ ├── KeyframeDataConfiguration.cs
│ │ │ │ ├── MediaStreamInfoConfiguration.cs
│ │ │ │ ├── PeopleBaseItemMapConfiguration.cs
│ │ │ │ ├── PeopleConfiguration.cs
│ │ │ │ ├── PermissionConfiguration.cs
│ │ │ │ ├── PreferenceConfiguration.cs
│ │ │ │ ├── TrickplayInfoConfiguration.cs
│ │ │ │ ├── UserConfiguration.cs
│ │ │ │ └── UserDataConfiguration.cs
│ │ │ ├── ProgressablePartitionReporting.cs
│ │ │ └── QueryPartitionHelpers.cs
│ │ ├── Jellyfin.Database.Providers.Sqlite/
│ │ │ ├── DoNotUseReturningClauseConvention.cs
│ │ │ ├── Jellyfin.Database.Providers.Sqlite.csproj
│ │ │ ├── Migrations/
│ │ │ │ ├── .gitattributes
│ │ │ │ ├── 20200514181226_AddActivityLog.Designer.cs
│ │ │ │ ├── 20200514181226_AddActivityLog.cs
│ │ │ │ ├── 20200613202153_AddUsers.Designer.cs
│ │ │ │ ├── 20200613202153_AddUsers.cs
│ │ │ │ ├── 20200728005145_AddDisplayPreferences.Designer.cs
│ │ │ │ ├── 20200728005145_AddDisplayPreferences.cs
│ │ │ │ ├── 20200905220533_FixDisplayPreferencesIndex.Designer.cs
│ │ │ │ ├── 20200905220533_FixDisplayPreferencesIndex.cs
│ │ │ │ ├── 20201004171403_AddMaxActiveSessions.Designer.cs
│ │ │ │ ├── 20201004171403_AddMaxActiveSessions.cs
│ │ │ │ ├── 20201204223655_AddCustomDisplayPreferences.Designer.cs
│ │ │ │ ├── 20201204223655_AddCustomDisplayPreferences.cs
│ │ │ │ ├── 20210320181425_AddIndexesAndCollations.Designer.cs
│ │ │ │ ├── 20210320181425_AddIndexesAndCollations.cs
│ │ │ │ ├── 20210407110544_NullableCustomPrefValue.Designer.cs
│ │ │ │ ├── 20210407110544_NullableCustomPrefValue.cs
│ │ │ │ ├── 20210814002109_AddDevices.Designer.cs
│ │ │ │ ├── 20210814002109_AddDevices.cs
│ │ │ │ ├── 20221022080052_AddIndexActivityLogsDateCreated.Designer.cs
│ │ │ │ ├── 20221022080052_AddIndexActivityLogsDateCreated.cs
│ │ │ │ ├── 20230526173516_RemoveEasyPassword.Designer.cs
│ │ │ │ ├── 20230526173516_RemoveEasyPassword.cs
│ │ │ │ ├── 20230626233818_AddTrickplayInfos.Designer.cs
│ │ │ │ ├── 20230626233818_AddTrickplayInfos.cs
│ │ │ │ ├── 20230923170422_UserCastReceiver.Designer.cs
│ │ │ │ ├── 20230923170422_UserCastReceiver.cs
│ │ │ │ ├── 20240729140605_AddMediaSegments.Designer.cs
│ │ │ │ ├── 20240729140605_AddMediaSegments.cs
│ │ │ │ ├── 20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs
│ │ │ │ ├── 20240928082930_MarkSegmentProviderIdNonNullable.cs
│ │ │ │ ├── 20241020103111_LibraryDbMigration.Designer.cs
│ │ │ │ ├── 20241020103111_LibraryDbMigration.cs
│ │ │ │ ├── 20241111131257_AddedCustomDataKey.Designer.cs
│ │ │ │ ├── 20241111131257_AddedCustomDataKey.cs
│ │ │ │ ├── 20241111135439_AddedCustomDataKeyKey.Designer.cs
│ │ │ │ ├── 20241111135439_AddedCustomDataKeyKey.cs
│ │ │ │ ├── 20241112152323_FixAncestorIdConfig.Designer.cs
│ │ │ │ ├── 20241112152323_FixAncestorIdConfig.cs
│ │ │ │ ├── 20241112232041_fixMediaStreams.Designer.cs
│ │ │ │ ├── 20241112232041_fixMediaStreams.cs
│ │ │ │ ├── 20241112234144_FixMediaStreams2.Designer.cs
│ │ │ │ ├── 20241112234144_FixMediaStreams2.cs
│ │ │ │ ├── 20241113133548_EnforceUniqueItemValue.Designer.cs
│ │ │ │ ├── 20241113133548_EnforceUniqueItemValue.cs
│ │ │ │ ├── 20250202021306_FixedCollation.Designer.cs
│ │ │ │ ├── 20250202021306_FixedCollation.cs
│ │ │ │ ├── 20250204092455_MakeStartEndDateNullable.Designer.cs
│ │ │ │ ├── 20250204092455_MakeStartEndDateNullable.cs
│ │ │ │ ├── 20250214031148_ChannelIdGuid.Designer.cs
│ │ │ │ ├── 20250214031148_ChannelIdGuid.cs
│ │ │ │ ├── 20250326065026_AddInheritedParentalRatingSubValue.Designer.cs
│ │ │ │ ├── 20250326065026_AddInheritedParentalRatingSubValue.cs
│ │ │ │ ├── 20250327101120_AddKeyframeData.Designer.cs
│ │ │ │ ├── 20250327101120_AddKeyframeData.cs
│ │ │ │ ├── 20250327171413_AddHdr10PlusFlag.Designer.cs
│ │ │ │ ├── 20250327171413_AddHdr10PlusFlag.cs
│ │ │ │ ├── 20250331182844_FixAttachmentMigration.Designer.cs
│ │ │ │ ├── 20250331182844_FixAttachmentMigration.cs
│ │ │ │ ├── 20250401142247_FixAncestors.Designer.cs
│ │ │ │ ├── 20250401142247_FixAncestors.cs
│ │ │ │ ├── 20250405075612_FixItemValuesIndices.Designer.cs
│ │ │ │ ├── 20250405075612_FixItemValuesIndices.cs
│ │ │ │ ├── 20250609115616_DetachUserDataInsteadOfDelete.Designer.cs
│ │ │ │ ├── 20250609115616_DetachUserDataInsteadOfDelete.cs
│ │ │ │ ├── 20250622170802_BaseItemImageInfoDateModifiedNullable.Designer.cs
│ │ │ │ ├── 20250622170802_BaseItemImageInfoDateModifiedNullable.cs
│ │ │ │ ├── 20250714044826_ResetJournalMode.Designer.cs
│ │ │ │ ├── 20250714044826_ResetJournalMode.cs
│ │ │ │ ├── 20250913211637_AddProperParentChildRelationBaseItemWithCascade.Designer.cs
│ │ │ │ ├── 20250913211637_AddProperParentChildRelationBaseItemWithCascade.cs
│ │ │ │ ├── 20250925203415_ExtendPeopleMapKey.Designer.cs
│ │ │ │ ├── 20250925203415_ExtendPeopleMapKey.cs
│ │ │ │ ├── JellyfinDbModelSnapshot.cs
│ │ │ │ └── SqliteDesignTimeJellyfinDbFactory.cs
│ │ │ ├── ModelBuilderExtensions.cs
│ │ │ ├── PragmaConnectionInterceptor.cs
│ │ │ ├── Properties/
│ │ │ │ └── AssemblyInfo.cs
│ │ │ ├── SqliteDatabaseProvider.cs
│ │ │ └── ValueConverters/
│ │ │ └── DateTimeKindValueConverter.cs
│ │ └── readme.md
│ ├── Jellyfin.Drawing/
│ │ ├── ImageProcessor.cs
│ │ ├── Jellyfin.Drawing.csproj
│ │ ├── NullImageEncoder.cs
│ │ └── Properties/
│ │ └── AssemblyInfo.cs
│ ├── Jellyfin.Drawing.Skia/
│ │ ├── Jellyfin.Drawing.Skia.csproj
│ │ ├── PercentPlayedDrawer.cs
│ │ ├── Properties/
│ │ │ └── AssemblyInfo.cs
│ │ ├── SkiaEncoder.cs
│ │ ├── SkiaExtensions.cs
│ │ ├── SkiaHelper.cs
│ │ ├── SplashscreenBuilder.cs
│ │ ├── StripCollageBuilder.cs
│ │ └── UnplayedCountIndicator.cs
│ ├── Jellyfin.Extensions/
│ │ ├── CopyToExtensions.cs
│ │ ├── DictionaryExtensions.cs
│ │ ├── EnumerableExtensions.cs
│ │ ├── FileHelper.cs
│ │ ├── FormattingStreamWriter.cs
│ │ ├── GuidExtensions.cs
│ │ ├── Jellyfin.Extensions.csproj
│ │ ├── Json/
│ │ │ ├── Converters/
│ │ │ │ ├── JsonBoolNumberConverter.cs
│ │ │ │ ├── JsonBoolStringConverter.cs
│ │ │ │ ├── JsonCommaDelimitedCollectionConverter.cs
│ │ │ │ ├── JsonCommaDelimitedCollectionConverterFactory.cs
│ │ │ │ ├── JsonDateTimeConverter.cs
│ │ │ │ ├── JsonDefaultStringEnumConverter.cs
│ │ │ │ ├── JsonDefaultStringEnumConverterFactory.cs
│ │ │ │ ├── JsonDelimitedCollectionConverter.cs
│ │ │ │ ├── JsonFlagEnumConverter.cs
│ │ │ │ ├── JsonFlagEnumConverterFactory.cs
│ │ │ │ ├── JsonGuidConverter.cs
│ │ │ │ ├── JsonNullableGuidConverter.cs
│ │ │ │ ├── JsonNullableStructConverter.cs
│ │ │ │ ├── JsonNullableStructConverterFactory.cs
│ │ │ │ ├── JsonPipeDelimitedCollectionConverter.cs
│ │ │ │ ├── JsonPipeDelimitedCollectionConverterFactory.cs
│ │ │ │ ├── JsonStringConverter.cs
│ │ │ │ └── JsonVersionConverter.cs
│ │ │ ├── JsonDefaults.cs
│ │ │ └── Utf8JsonExtensions.cs
│ │ ├── ReadOnlyListExtension.cs
│ │ ├── ShuffleExtensions.cs
│ │ ├── SplitStringExtensions.cs
│ │ ├── StreamExtensions.cs
│ │ ├── StringBuilderExtensions.cs
│ │ └── StringExtensions.cs
│ ├── Jellyfin.LiveTv/
│ │ ├── Channels/
│ │ │ ├── ChannelDynamicMediaSourceProvider.cs
│ │ │ ├── ChannelImageProvider.cs
│ │ │ ├── ChannelManager.cs
│ │ │ ├── ChannelPostScanTask.cs
│ │ │ └── RefreshChannelsScheduledTask.cs
│ │ ├── Configuration/
│ │ │ ├── LiveTvConfigurationExtensions.cs
│ │ │ └── LiveTvConfigurationFactory.cs
│ │ ├── DefaultLiveTvService.cs
│ │ ├── Extensions/
│ │ │ └── LiveTvServiceCollectionExtensions.cs
│ │ ├── Guide/
│ │ │ ├── GuideManager.cs
│ │ │ └── RefreshGuideScheduledTask.cs
│ │ ├── IO/
│ │ │ ├── DirectRecorder.cs
│ │ │ ├── EncodedRecorder.cs
│ │ │ ├── ExclusiveLiveStream.cs
│ │ │ ├── IRecorder.cs
│ │ │ └── StreamHelper.cs
│ │ ├── Jellyfin.LiveTv.csproj
│ │ ├── Listings/
│ │ │ ├── EpgChannelData.cs
│ │ │ ├── ListingsManager.cs
│ │ │ ├── SchedulesDirect.cs
│ │ │ ├── SchedulesDirectDtos/
│ │ │ │ ├── BroadcasterDto.cs
│ │ │ │ ├── CaptionDto.cs
│ │ │ │ ├── CastDto.cs
│ │ │ │ ├── ChannelDto.cs
│ │ │ │ ├── ContentRatingDto.cs
│ │ │ │ ├── CrewDto.cs
│ │ │ │ ├── DayDto.cs
│ │ │ │ ├── Description1000Dto.cs
│ │ │ │ ├── Description100Dto.cs
│ │ │ │ ├── DescriptionsProgramDto.cs
│ │ │ │ ├── EventDetailsDto.cs
│ │ │ │ ├── GracenoteDto.cs
│ │ │ │ ├── HeadendsDto.cs
│ │ │ │ ├── ImageDataDto.cs
│ │ │ │ ├── LineupDto.cs
│ │ │ │ ├── LineupsDto.cs
│ │ │ │ ├── LogoDto.cs
│ │ │ │ ├── MapDto.cs
│ │ │ │ ├── MetadataDto.cs
│ │ │ │ ├── MetadataProgramsDto.cs
│ │ │ │ ├── MetadataScheduleDto.cs
│ │ │ │ ├── MovieDto.cs
│ │ │ │ ├── MultipartDto.cs
│ │ │ │ ├── ProgramDetailsDto.cs
│ │ │ │ ├── ProgramDto.cs
│ │ │ │ ├── QualityRatingDto.cs
│ │ │ │ ├── RatingDto.cs
│ │ │ │ ├── RecommendationDto.cs
│ │ │ │ ├── RequestScheduleForChannelDto.cs
│ │ │ │ ├── ShowImagesDto.cs
│ │ │ │ ├── StationDto.cs
│ │ │ │ ├── TitleDto.cs
│ │ │ │ └── TokenDto.cs
│ │ │ └── XmlTvListingsProvider.cs
│ │ ├── LiveTvDtoService.cs
│ │ ├── LiveTvManager.cs
│ │ ├── LiveTvMediaSourceProvider.cs
│ │ ├── Recordings/
│ │ │ ├── RecordingHelper.cs
│ │ │ ├── RecordingNotifier.cs
│ │ │ ├── RecordingsHost.cs
│ │ │ ├── RecordingsManager.cs
│ │ │ └── RecordingsMetadataManager.cs
│ │ ├── Timers/
│ │ │ ├── ItemDataProvider.cs
│ │ │ ├── SeriesTimerManager.cs
│ │ │ └── TimerManager.cs
│ │ └── TunerHosts/
│ │ ├── BaseTunerHost.cs
│ │ ├── HdHomerun/
│ │ │ ├── Channels.cs
│ │ │ ├── DiscoverResponse.cs
│ │ │ ├── HdHomerunChannelCommands.cs
│ │ │ ├── HdHomerunHost.cs
│ │ │ ├── HdHomerunManager.cs
│ │ │ ├── HdHomerunUdpStream.cs
│ │ │ ├── IHdHomerunChannelCommands.cs
│ │ │ └── LegacyHdHomerunChannelCommands.cs
│ │ ├── LiveStream.cs
│ │ ├── M3UTunerHost.cs
│ │ ├── M3uParser.cs
│ │ ├── SharedHttpStream.cs
│ │ └── TunerHostManager.cs
│ ├── Jellyfin.MediaEncoding.Hls/
│ │ ├── Cache/
│ │ │ └── CacheDecorator.cs
│ │ ├── Extensions/
│ │ │ └── MediaEncodingHlsServiceCollectionExtensions.cs
│ │ ├── Extractors/
│ │ │ ├── FfProbeKeyframeExtractor.cs
│ │ │ ├── IKeyframeExtractor.cs
│ │ │ └── MatroskaKeyframeExtractor.cs
│ │ ├── Jellyfin.MediaEncoding.Hls.csproj
│ │ ├── Playlist/
│ │ │ ├── CreateMainPlaylistRequest.cs
│ │ │ ├── DynamicHlsPlaylistGenerator.cs
│ │ │ └── IDynamicHlsPlaylistGenerator.cs
│ │ └── ScheduledTasks/
│ │ └── KeyframeExtractionScheduledTask.cs
│ ├── Jellyfin.MediaEncoding.Keyframes/
│ │ ├── FfProbe/
│ │ │ └── FfProbeKeyframeExtractor.cs
│ │ ├── FfTool/
│ │ │ └── FfToolKeyframeExtractor.cs
│ │ ├── Jellyfin.MediaEncoding.Keyframes.csproj
│ │ ├── KeyframeData.cs
│ │ └── Matroska/
│ │ ├── Extensions/
│ │ │ └── EbmlReaderExtensions.cs
│ │ ├── MatroskaConstants.cs
│ │ ├── MatroskaKeyframeExtractor.cs
│ │ └── Models/
│ │ ├── Info.cs
│ │ └── SeekHead.cs
│ └── Jellyfin.Networking/
│ ├── AutoDiscoveryHost.cs
│ ├── HappyEyeballs/
│ │ └── HttpClientExtension.cs
│ ├── Jellyfin.Networking.csproj
│ ├── Manager/
│ │ └── NetworkManager.cs
│ └── Udp/
│ └── SocketFactory.cs
├── stylecop.json
└── tests/
├── Directory.Build.props
├── Jellyfin.Api.Tests/
│ ├── Auth/
│ │ ├── CustomAuthenticationHandlerTests.cs
│ │ ├── DefaultAuthorizationPolicy/
│ │ │ └── DefaultAuthorizationHandlerTests.cs
│ │ ├── FirstTimeSetupPolicy/
│ │ │ └── FirstTimeSetupHandlerTests.cs
│ │ └── IgnoreSchedulePolicy/
│ │ └── IgnoreScheduleHandlerTests.cs
│ ├── Controllers/
│ │ ├── DynamicHlsControllerTests.cs
│ │ ├── ImageControllerTests.cs
│ │ ├── SystemControllerTests.cs
│ │ └── UserControllerTests.cs
│ ├── Helpers/
│ │ └── RequestHelpersTests.cs
│ ├── Jellyfin.Api.Tests.csproj
│ ├── Middleware/
│ │ └── UrlDecodeQueryFeatureTests.cs
│ ├── ModelBinders/
│ │ ├── CommaDelimitedCollectionModelBinderTests.cs
│ │ ├── PipeDelimitedCollectionModelBinderTests.cs
│ │ └── TestType.cs
│ └── TestHelpers.cs
├── Jellyfin.Common.Tests/
│ ├── Crc32Tests.cs
│ ├── Jellyfin.Common.Tests.csproj
│ └── Providers/
│ └── ProviderIdParserTests.cs
├── Jellyfin.Controller.Tests/
│ ├── BaseItemManagerTests.cs
│ ├── DirectoryServiceTests.cs
│ ├── Entities/
│ │ ├── BaseItemTests.cs
│ │ └── InternalItemsQueryTests.cs
│ └── Jellyfin.Controller.Tests.csproj
├── Jellyfin.Extensions.Tests/
│ ├── CopyToExtensionsTests.cs
│ ├── FileHelperTests.cs
│ ├── FormattingStreamWriterTests.cs
│ ├── Jellyfin.Extensions.Tests.csproj
│ ├── Json/
│ │ ├── Converters/
│ │ │ ├── JsonBoolNumberTests.cs
│ │ │ ├── JsonBoolStringTests.cs
│ │ │ ├── JsonCommaDelimitedCollectionTests.cs
│ │ │ ├── JsonCommaDelimitedIReadOnlyListTests.cs
│ │ │ ├── JsonDefaultStringEnumConverterTests.cs
│ │ │ ├── JsonFlagEnumTests.cs
│ │ │ ├── JsonGuidConverterTests.cs
│ │ │ ├── JsonNullableGuidConverterTests.cs
│ │ │ ├── JsonStringConverterTests.cs
│ │ │ └── JsonVersionConverterTests.cs
│ │ └── Models/
│ │ ├── GenericBodyArrayModel.cs
│ │ ├── GenericBodyIReadOnlyCollectionModel.cs
│ │ ├── GenericBodyIReadOnlyListModel.cs
│ │ └── GenericBodyListModel.cs
│ ├── ShuffleExtensionsTests.cs
│ └── StringExtensionsTests.cs
├── Jellyfin.LiveTv.Tests/
│ ├── HdHomerunHostTests.cs
│ ├── HdHomerunManagerTests.cs
│ ├── Jellyfin.LiveTv.Tests.csproj
│ ├── Listings/
│ │ ├── ListingsManagerTests.cs
│ │ └── XmlTvListingsProviderTests.cs
│ ├── RecordingHelperTests.cs
│ ├── SchedulesDirect/
│ │ └── SchedulesDirectDeserializeTests.cs
│ └── Test Data/
│ ├── LiveTv/
│ │ ├── 10.10.10.100/
│ │ │ ├── discover.json
│ │ │ └── lineup.json
│ │ ├── 192.168.1.182/
│ │ │ ├── discover.json
│ │ │ └── lineup.json
│ │ └── Listings/
│ │ └── XmlTv/
│ │ ├── emptycategory.xml
│ │ └── notitle.xml
│ └── SchedulesDirect/
│ ├── headends_response.json
│ ├── lineup_response.json
│ ├── lineups_response.json
│ ├── metadata_programs_response.json
│ ├── programs_response.json
│ ├── schedules_request.json
│ ├── schedules_response.json
│ ├── token_live_response.json
│ └── token_offline_response.json
├── Jellyfin.MediaEncoding.Hls.Tests/
│ ├── Jellyfin.MediaEncoding.Hls.Tests.csproj
│ └── Playlist/
│ └── DynamicHlsPlaylistGeneratorTests.cs
├── Jellyfin.MediaEncoding.Keyframes.Tests/
│ ├── FfProbe/
│ │ ├── FfProbeKeyframeExtractorTests.cs
│ │ └── Test Data/
│ │ ├── keyframes.txt
│ │ ├── keyframes_result.json
│ │ ├── keyframes_streamduration.txt
│ │ └── keyframes_streamduration_result.json
│ └── Jellyfin.MediaEncoding.Keyframes.Tests.csproj
├── Jellyfin.MediaEncoding.Tests/
│ ├── EncoderValidatorTests.cs
│ ├── EncoderValidatorTestsData.cs
│ ├── Jellyfin.MediaEncoding.Tests.csproj
│ ├── Probing/
│ │ ├── ProbeExternalSourcesTests.cs
│ │ └── ProbeResultNormalizerTests.cs
│ ├── Subtitles/
│ │ ├── AssParserTests.cs
│ │ ├── SrtParserTests.cs
│ │ ├── SsaParserTests.cs
│ │ └── SubtitleEncoderTests.cs
│ └── Test Data/
│ ├── Probing/
│ │ ├── music_metadata.json
│ │ ├── music_video_metadata.json
│ │ ├── music_year_only_metadata.json
│ │ ├── video_interlaced.json
│ │ ├── video_metadata.json
│ │ ├── video_mp4_metadata.json
│ │ ├── video_progressive_no_field_order.json
│ │ ├── video_progressive_no_field_order2.json
│ │ ├── video_single_frame_mjpeg.json
│ │ ├── video_ts.json
│ │ ├── video_web_like_mkv_with_subtitle.json
│ │ └── video_webm.json
│ ├── example.ass
│ ├── example.srt
│ ├── example.ssa
│ └── example2.srt
├── Jellyfin.Model.Tests/
│ ├── Cryptography/
│ │ └── PasswordHashTests.cs
│ ├── Dlna/
│ │ ├── ContainerHelperTests.cs
│ │ ├── LegacyStreamInfo.cs
│ │ ├── StreamBuilderTests.cs
│ │ └── StreamInfoTests.cs
│ ├── Drawing/
│ │ └── ImageFormatExtensionsTests.cs
│ ├── Entities/
│ │ ├── MediaStreamTests.cs
│ │ └── ProviderIdsExtensionsTests.cs
│ ├── Extensions/
│ │ ├── EnumerableExtensionsTests.cs
│ │ └── StringHelperTests.cs
│ ├── Jellyfin.Model.Tests.csproj
│ ├── Net/
│ │ └── MimeTypesTests.cs
│ └── Test Data/
│ ├── DeviceProfile-AndroidPixel.json
│ ├── DeviceProfile-AndroidTVExoPlayer.json
│ ├── DeviceProfile-Chrome-NoHLS.json
│ ├── DeviceProfile-Chrome.json
│ ├── DeviceProfile-DirectMedia.json
│ ├── DeviceProfile-Firefox.json
│ ├── DeviceProfile-JellyfinMediaPlayer.json
│ ├── DeviceProfile-LowBandwidth.json
│ ├── DeviceProfile-Null.json
│ ├── DeviceProfile-RokuSSPlus.json
│ ├── DeviceProfile-RokuSSPlusNext.json
│ ├── DeviceProfile-SafariNext.json
│ ├── DeviceProfile-Tizen3-stereo.json
│ ├── DeviceProfile-Tizen4-4K-5.1.json
│ ├── DeviceProfile-TranscodeMedia.json
│ ├── DeviceProfile-WebOS-23.json
│ ├── DeviceProfile-Yatse.json
│ ├── DeviceProfile-Yatse2.json
│ ├── MediaSourceInfo-mkv-av1-aac-srt-2600k.json
│ ├── MediaSourceInfo-mkv-av1-vorbis-srt-2600k.json
│ ├── MediaSourceInfo-mkv-dvhe.05-eac3-28000k.json
│ ├── MediaSourceInfo-mkv-dvhe.08-eac3-15200k.json
│ ├── MediaSourceInfo-mkv-h264-ac3-srt-2600k.json
│ ├── MediaSourceInfo-mkv-h264-hi10p-aac-5000k-brokenfps.json
│ ├── MediaSourceInfo-mkv-vp9-aac-srt-2600k.json
│ ├── MediaSourceInfo-mkv-vp9-ac3-srt-2600k.json
│ ├── MediaSourceInfo-mkv-vp9-vorbis-srt-2600k.json
│ ├── MediaSourceInfo-mkv-vp9-vorbis-vtt-2600k.json
│ ├── MediaSourceInfo-mp4-dvh1.05-eac3-15200k.json
│ ├── MediaSourceInfo-mp4-dvhe.08-eac3-15200k.json
│ ├── MediaSourceInfo-mp4-h264-aac-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-aac-vtt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aac-aac-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aac-mp3-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aac-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aacDef-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-aacExt-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-ac3-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-dts-srt-2600k.json
│ ├── MediaSourceInfo-mp4-h264-hi10p-aac-5000k.json
│ ├── MediaSourceInfo-mp4-hevc-aac-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-aac-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-aacDef-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-aacExt-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-ac3-srt-15200k.json
│ ├── MediaSourceInfo-mp4-hevc-truehd-srt-15200k.json
│ ├── MediaSourceInfo-no-streams.json
│ ├── MediaSourceInfo-numstreams-32.json
│ ├── MediaSourceInfo-numstreams-33.json
│ └── MediaSourceInfo-raw.json
├── Jellyfin.Naming.Tests/
│ ├── AudioBook/
│ │ ├── AudioBookFileInfoTests.cs
│ │ ├── AudioBookListResolverTests.cs
│ │ └── AudioBookResolverTests.cs
│ ├── Common/
│ │ └── NamingOptionsTest.cs
│ ├── ExternalFiles/
│ │ └── ExternalPathParserTests.cs
│ ├── Jellyfin.Naming.Tests.csproj
│ ├── Music/
│ │ └── MultiDiscAlbumTests.cs
│ ├── TV/
│ │ ├── AbsoluteEpisodeNumberTests.cs
│ │ ├── DailyEpisodeTests.cs
│ │ ├── EpisodeNumberTests.cs
│ │ ├── EpisodeNumberWithoutSeasonTests.cs
│ │ ├── EpisodePathParserTest.cs
│ │ ├── MultiEpisodeTests.cs
│ │ ├── SeasonNumberTests.cs
│ │ ├── SeasonPathParserTests.cs
│ │ ├── SeriesPathParserTest.cs
│ │ ├── SeriesResolverTests.cs
│ │ ├── SimpleEpisodeTests.cs
│ │ └── TvParserHelpersTest.cs
│ └── Video/
│ ├── CleanDateTimeTests.cs
│ ├── CleanStringTests.cs
│ ├── ExtraTests.cs
│ ├── Format3DTests.cs
│ ├── MultiVersionTests.cs
│ ├── StackTests.cs
│ ├── StubTests.cs
│ ├── VideoListResolverTests.cs
│ └── VideoResolverTests.cs
├── Jellyfin.Networking.Tests/
│ ├── Configuration/
│ │ └── NetworkConfigurationTests.cs
│ ├── Jellyfin.Networking.Tests.csproj
│ ├── NetworkExtensionsTests.cs
│ ├── NetworkManagerTests.cs
│ └── NetworkParseTests.cs
├── Jellyfin.Providers.Tests/
│ ├── Jellyfin.Providers.Tests.csproj
│ ├── Lyrics/
│ │ └── LrcLyricParserTests.cs
│ ├── Manager/
│ │ ├── ItemImageProviderTests.cs
│ │ ├── MetadataServiceTests.cs
│ │ └── ProviderManagerTests.cs
│ ├── MediaInfo/
│ │ ├── AudioResolverTests.cs
│ │ ├── EmbeddedImageProviderTests.cs
│ │ ├── FFProbeVideoInfoTests.cs
│ │ ├── MediaInfoResolverTests.cs
│ │ ├── SubtitleResolverTests.cs
│ │ └── VideoImageProviderTests.cs
│ ├── Omdb/
│ │ └── JsonOmdbConverterTests.cs
│ ├── Test Data/
│ │ └── Lyrics/
│ │ └── Fleetwood Mac - Rumors.elrc
│ └── Tmdb/
│ └── TmdbUtilsTests.cs
├── Jellyfin.Server.Implementations.Tests/
│ ├── Cryptography/
│ │ └── CryptographyProviderTests.cs
│ ├── Data/
│ │ ├── SearchPunctuationTests.cs
│ │ └── SqliteItemRepositoryTests.cs
│ ├── EfMigrations/
│ │ └── EfMigrationTests.cs
│ ├── HttpServer/
│ │ └── WebSocketConnectionTests.cs
│ ├── IO/
│ │ └── ManagedFileSystemTests.cs
│ ├── Item/
│ │ ├── BaseItemRepositoryTests.cs
│ │ └── OrderMapperTests.cs
│ ├── Jellyfin.Server.Implementations.Tests.csproj
│ ├── Library/
│ │ ├── AudioResolverTests.cs
│ │ ├── CoreResolutionIgnoreRuleTest.cs
│ │ ├── DotIgnoreIgnoreRuleTest.cs
│ │ ├── EpisodeResolverTest.cs
│ │ ├── IgnorePatternsTests.cs
│ │ ├── LibraryManager/
│ │ │ └── FindExtrasTests.cs
│ │ ├── MediaSourceManagerTests.cs
│ │ ├── MediaStreamSelectorTests.cs
│ │ ├── MovieResolverTests.cs
│ │ └── PathExtensionsTests.cs
│ ├── Localization/
│ │ └── LocalizationManagerTests.cs
│ ├── Playlists/
│ │ └── PlaylistManagerTests.cs
│ ├── Plugins/
│ │ └── PluginManagerTests.cs
│ ├── QuickConnect/
│ │ └── QuickConnectManagerTests.cs
│ ├── SessionManager/
│ │ └── SessionManagerTests.cs
│ ├── Sorting/
│ │ ├── AiredEpisodeOrderComparerTests.cs
│ │ ├── IndexNumberComparerTests.cs
│ │ ├── ParentIndexNumberComparerTests.cs
│ │ └── PremiereDateComparerTests.cs
│ ├── Test Data/
│ │ ├── HttpServer/
│ │ │ ├── ForceKeepAlive.json
│ │ │ ├── Partial.json
│ │ │ └── ValidPartial.json
│ │ └── Updates/
│ │ └── manifest.json
│ ├── TypedBaseItem/
│ │ └── BaseItemKindTests.cs
│ ├── Updates/
│ │ └── InstallationManagerTests.cs
│ └── Users/
│ └── UserManagerTests.cs
├── Jellyfin.Server.Integration.Tests/
│ ├── AuthHelper.cs
│ ├── Controllers/
│ │ ├── ActivityLogControllerTests.cs
│ │ ├── BaseJellyfinTestController.cs
│ │ ├── BrandingControllerTests.cs
│ │ ├── DashboardControllerTests.cs
│ │ ├── EncoderController.cs
│ │ ├── ItemsControllerTests.cs
│ │ ├── LibraryControllerTests.cs
│ │ ├── LibraryStructureControllerTests.cs
│ │ ├── LiveTvControllerTests.cs
│ │ ├── MediaInfoControllerTests.cs
│ │ ├── MediaStructureControllerTests.cs
│ │ ├── MusicGenreControllerTests.cs
│ │ ├── PersonsControllerTests.cs
│ │ ├── PlaystateControllerTests.cs
│ │ ├── PluginsControllerTests.cs
│ │ ├── StartupControllerTests.cs
│ │ ├── UserControllerTests.cs
│ │ ├── UserLibraryControllerTests.cs
│ │ └── VideosControllerTests.cs
│ ├── EncodedQueryStringTest.cs
│ ├── Jellyfin.Server.Integration.Tests.csproj
│ ├── JellyfinApplicationFactory.cs
│ ├── Middleware/
│ │ └── RobotsRedirectionMiddlewareTests.cs
│ ├── OpenApiSpecTests.cs
│ ├── Test Data/
│ │ └── dummy.m3u8
│ ├── TestAppHost.cs
│ ├── TestPage.html
│ ├── TestPlugin.cs
│ ├── TestPluginWithoutPages.cs
│ ├── WebSocketTests.cs
│ └── xunit.runner.json
├── Jellyfin.Server.Tests/
│ ├── Jellyfin.Server.Tests.csproj
│ └── ParseNetworkTests.cs
├── Jellyfin.XbmcMetadata.Tests/
│ ├── Jellyfin.XbmcMetadata.Tests.csproj
│ ├── Location/
│ │ └── MovieNfoLocationTests.cs
│ ├── Parsers/
│ │ ├── EpisodeNfoProviderTests.cs
│ │ ├── MovieNfoParserTests.cs
│ │ ├── MusicAlbumNfoProviderTests.cs
│ │ ├── MusicArtistNfoParserTests.cs
│ │ ├── MusicVideoNfoParserTests.cs
│ │ ├── SeasonNfoProviderTests.cs
│ │ └── SeriesNfoParserTests.cs
│ └── Test Data/
│ ├── American Gods.nfo
│ ├── Dancing Queen.nfo
│ ├── Fanart.nfo
│ ├── Imdb.nfo
│ ├── Justice League.nfo
│ ├── Lilo & Stitch.nfo
│ ├── Radarr.nfo
│ ├── Rising.nfo
│ ├── Season 01.nfo
│ ├── Sonarr-Thumb.nfo
│ ├── Stargate Atlantis S01E01-E04.nfo
│ ├── The Best of 1980-1990.nfo
│ ├── The Bone Orchard.nfo
│ ├── Tmdb.nfo
│ ├── Tvdb.nfo
│ └── U2.nfo
└── coverletArgs.runsettings
Showing preview only (1,010K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9378 symbols across 1948 files)
FILE: Emby.Naming/Audio/AlbumParser.cs
class AlbumParser (line 13) | public partial class AlbumParser
method AlbumParser (line 21) | public AlbumParser(NamingOptions options)
method CleanRegex (line 26) | [GeneratedRegex(@"[-\.\(\)\s]+")]
method IsMultiPart (line 34) | public bool IsMultiPart(string path)
FILE: Emby.Naming/Audio/AudioFileParser.cs
class AudioFileParser (line 11) | public static class AudioFileParser
method IsAudioFile (line 19) | public static bool IsAudioFile(string path, NamingOptions options)
FILE: Emby.Naming/AudioBook/AudioBookFileInfo.cs
class AudioBookFileInfo (line 8) | public class AudioBookFileInfo : IComparable<AudioBookFileInfo>
method AudioBookFileInfo (line 17) | public AudioBookFileInfo(string path, string container, int? partNumbe...
method CompareTo (line 50) | public int CompareTo(AudioBookFileInfo? other)
FILE: Emby.Naming/AudioBook/AudioBookFilePathParser.cs
class AudioBookFilePathParser (line 11) | public class AudioBookFilePathParser
method AudioBookFilePathParser (line 19) | public AudioBookFilePathParser(NamingOptions options)
method Parse (line 29) | public AudioBookFilePathParserResult Parse(string path)
FILE: Emby.Naming/AudioBook/AudioBookFilePathParserResult.cs
type AudioBookFilePathParserResult (line 6) | public record struct AudioBookFilePathParserResult
FILE: Emby.Naming/AudioBook/AudioBookInfo.cs
class AudioBookInfo (line 8) | public class AudioBookInfo
method AudioBookInfo (line 18) | public AudioBookInfo(string name, int? year, IReadOnlyList<AudioBookFi...
FILE: Emby.Naming/AudioBook/AudioBookListResolver.cs
class AudioBookListResolver (line 14) | public class AudioBookListResolver
method AudioBookListResolver (line 23) | public AudioBookListResolver(NamingOptions options)
method Resolve (line 34) | public IEnumerable<AudioBookInfo> Resolve(IEnumerable<FileSystemMetada...
method FindExtraAndAlternativeFiles (line 67) | private void FindExtraAndAlternativeFiles(ref List<AudioBookFileInfo> ...
method FindMainAudioBookFile (line 139) | private AudioBookFileInfo FindMainAudioBookFile(List<AudioBookFileInfo...
FILE: Emby.Naming/AudioBook/AudioBookNameParser.cs
class AudioBookNameParser (line 10) | public class AudioBookNameParser
method AudioBookNameParser (line 18) | public AudioBookNameParser(NamingOptions options)
method Parse (line 28) | public AudioBookNameParserResult Parse(string name)
FILE: Emby.Naming/AudioBook/AudioBookNameParserResult.cs
type AudioBookNameParserResult (line 6) | public struct AudioBookNameParserResult
FILE: Emby.Naming/AudioBook/AudioBookResolver.cs
class AudioBookResolver (line 11) | public class AudioBookResolver
method AudioBookResolver (line 19) | public AudioBookResolver(NamingOptions options)
method Resolve (line 29) | public AudioBookFileInfo? Resolve(string path)
FILE: Emby.Naming/Book/BookFileNameParser.cs
class BookFileNameParser (line 8) | public static class BookFileNameParser
method Parse (line 31) | public static BookFileNameParserResult Parse(string? name)
FILE: Emby.Naming/Book/BookFileNameParserResult.cs
class BookFileNameParserResult (line 8) | public class BookFileNameParserResult
method BookFileNameParserResult (line 13) | public BookFileNameParserResult()
FILE: Emby.Naming/Common/EpisodeExpression.cs
class EpisodeExpression (line 9) | public class EpisodeExpression
method EpisodeExpression (line 19) | public EpisodeExpression(string expression, bool byDate = false)
FILE: Emby.Naming/Common/MediaType.cs
type MediaType (line 6) | public enum MediaType
FILE: Emby.Naming/Common/NamingOptions.cs
class NamingOptions (line 17) | public class NamingOptions
method NamingOptions (line 22) | public NamingOptions()
method Compile (line 903) | public void Compile()
method Compile (line 909) | private Regex Compile(string exp)
FILE: Emby.Naming/ExternalFiles/ExternalPathParser.cs
class ExternalPathParser (line 14) | public class ExternalPathParser
method ExternalPathParser (line 26) | public ExternalPathParser(NamingOptions namingOptions, ILocalizationMa...
method ParseFile (line 39) | public ExternalPathParserResult? ParseFile(string path, string? extraS...
FILE: Emby.Naming/ExternalFiles/ExternalPathParserResult.cs
class ExternalPathParserResult (line 6) | public class ExternalPathParserResult
method ExternalPathParserResult (line 15) | public ExternalPathParserResult(string path, bool isDefault = false, b...
FILE: Emby.Naming/TV/EpisodeInfo.cs
class EpisodeInfo (line 6) | public class EpisodeInfo
method EpisodeInfo (line 12) | public EpisodeInfo(string path)
FILE: Emby.Naming/TV/EpisodePathParser.cs
class EpisodePathParser (line 12) | public class EpisodePathParser
method EpisodePathParser (line 20) | public EpisodePathParser(NamingOptions options)
method Parse (line 35) | public EpisodePathParserResult Parse(
method Parse (line 95) | private static EpisodePathParserResult Parse(string name, EpisodeExpre...
method FillAdditional (line 201) | private void FillAdditional(string path, EpisodePathParserResult info)
method FillAdditional (line 213) | private void FillAdditional(string path, EpisodePathParserResult info,...
FILE: Emby.Naming/TV/EpisodePathParserResult.cs
class EpisodePathParserResult (line 6) | public class EpisodePathParserResult
FILE: Emby.Naming/TV/EpisodeResolver.cs
class EpisodeResolver (line 12) | public class EpisodeResolver
method EpisodeResolver (line 20) | public EpisodeResolver(NamingOptions options)
method Resolve (line 35) | public EpisodeInfo? Resolve(
FILE: Emby.Naming/TV/SeasonPathParser.cs
class SeasonPathParser (line 11) | public static partial class SeasonPathParser
method ProcessPre (line 15) | [GeneratedRegex(@"^\s*((?<seasonnumber>(?>\d+))(?:st|nd|rd|th|\.)*(?!\...
method ProcessPost (line 18) | [GeneratedRegex(@"^\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel...
method SeasonPrefix (line 21) | [GeneratedRegex(@"[sS](\d{1,4})(?!\d|[eE]\d)(?=\.|_|-|\[|\]|\s|$)", Re...
method Parse (line 32) | public static SeasonPathParserResult Parse(string path, string? parent...
method GetSeasonNumberFromPath (line 58) | private static (int? SeasonNumber, bool IsSeasonFolder) GetSeasonNumbe...
method CheckMatch (line 106) | private static (int? SeasonNumber, bool IsSeasonFolder) CheckMatch(Mat...
method GetSeasonNumberFromPathSubstring (line 125) | private static (int? SeasonNumber, bool IsSeasonFolder) GetSeasonNumbe...
FILE: Emby.Naming/TV/SeasonPathParserResult.cs
class SeasonPathParserResult (line 6) | public class SeasonPathParserResult
FILE: Emby.Naming/TV/SeriesInfo.cs
class SeriesInfo (line 6) | public class SeriesInfo
method SeriesInfo (line 12) | public SeriesInfo(string path)
FILE: Emby.Naming/TV/SeriesPathParser.cs
class SeriesPathParser (line 9) | public static class SeriesPathParser
method Parse (line 17) | public static SeriesPathParserResult Parse(NamingOptions options, stri...
method Parse (line 42) | private static SeriesPathParserResult Parse(string name, EpisodeExpres...
FILE: Emby.Naming/TV/SeriesPathParserResult.cs
class SeriesPathParserResult (line 6) | public class SeriesPathParserResult
FILE: Emby.Naming/TV/SeriesResolver.cs
class SeriesResolver (line 10) | public static partial class SeriesResolver
method SeriesNameRegex (line 17) | [GeneratedRegex(@"((?<a>[^\._]{2,})[\._]*)|([\._](?<b>[^\._]{2,}))")]
method TitleWithYearRegex (line 24) | [GeneratedRegex(@"(?<title>.+?)\s*\(\d{4}\)")]
method Resolve (line 33) | public static SeriesInfo Resolve(NamingOptions options, string path)
FILE: Emby.Naming/TV/TvParserHelpers.cs
class TvParserHelpers (line 10) | public static class TvParserHelpers
method TryParseSeriesStatus (line 21) | public static bool TryParseSeriesStatus(string? status, out SeriesStat...
FILE: Emby.Naming/Video/CleanDateTimeParser.cs
class CleanDateTimeParser (line 10) | public static class CleanDateTimeParser
method Clean (line 18) | public static CleanDateTimeResult Clean(string name, IReadOnlyList<Reg...
method TryClean (line 38) | private static bool TryClean(string name, Regex expression, ref CleanD...
FILE: Emby.Naming/Video/CleanDateTimeResult.cs
type CleanDateTimeResult (line 6) | public readonly struct CleanDateTimeResult
method CleanDateTimeResult (line 13) | public CleanDateTimeResult(string name, int? year = null)
FILE: Emby.Naming/Video/CleanStringParser.cs
class CleanStringParser (line 10) | public static class CleanStringParser
method TryClean (line 19) | public static bool TryClean([NotNullWhen(true)] string? name, IReadOnl...
method TryClean (line 42) | private static bool TryClean(string name, Regex expression, out string...
FILE: Emby.Naming/Video/ExtraResult.cs
class ExtraResult (line 8) | public class ExtraResult
FILE: Emby.Naming/Video/ExtraRule.cs
class ExtraRule (line 9) | public class ExtraRule
method ExtraRule (line 18) | public ExtraRule(ExtraType extraType, ExtraRuleType ruleType, string t...
FILE: Emby.Naming/Video/ExtraRuleResolver.cs
class ExtraRuleResolver (line 12) | public static class ExtraRuleResolver
method GetExtraInfo (line 23) | public static ExtraResult GetExtraInfo(string path, NamingOptions nami...
FILE: Emby.Naming/Video/ExtraRuleType.cs
type ExtraRuleType (line 6) | public enum ExtraRuleType
FILE: Emby.Naming/Video/FileStack.cs
class FileStack (line 10) | public class FileStack
method FileStack (line 18) | public FileStack(string name, bool isDirectory, IReadOnlyList<string> ...
method ContainsFile (line 46) | public bool ContainsFile(string file, bool isDirectory)
FILE: Emby.Naming/Video/FileStackRule.cs
class FileStackRule (line 9) | public class FileStackRule
method FileStackRule (line 18) | public FileStackRule(string token, bool isNumerical)
method Match (line 35) | public bool Match(string input, [NotNullWhen(true)] out (string StackN...
FILE: Emby.Naming/Video/Format3DParser.cs
class Format3DParser (line 9) | public static class Format3DParser
method Parse (line 20) | public static Format3DResult Parse(ReadOnlySpan<char> path, NamingOpti...
method Parse (line 30) | private static Format3DResult Parse(ReadOnlySpan<char> path, ReadOnlyS...
method Parse (line 45) | private static Format3DResult Parse(ReadOnlySpan<char> path, Format3DR...
FILE: Emby.Naming/Video/Format3DResult.cs
class Format3DResult (line 6) | public class Format3DResult
method Format3DResult (line 13) | public Format3DResult(bool is3D, string? format3D)
FILE: Emby.Naming/Video/Format3DRule.cs
class Format3DRule (line 6) | public class Format3DRule
method Format3DRule (line 13) | public Format3DRule(string token, string? precedingToken = null)
FILE: Emby.Naming/Video/StackResolver.cs
class StackResolver (line 14) | public static class StackResolver
method ResolveDirectories (line 22) | public static IEnumerable<FileStack> ResolveDirectories(IEnumerable<st...
method ResolveFiles (line 33) | public static IEnumerable<FileStack> ResolveFiles(IEnumerable<string> ...
method ResolveAudioBooks (line 43) | public static IEnumerable<FileStack> ResolveAudioBooks(IEnumerable<Aud...
method Resolve (line 71) | public static IEnumerable<FileStack> Resolve(IEnumerable<FileSystemMet...
class StackMetadata (line 135) | private sealed class StackMetadata
method StackMetadata (line 137) | public StackMetadata(bool isDirectory, bool isNumerical, string part...
method ContainsPart (line 153) | public bool ContainsPart(string partNumber) => Parts.ContainsKey(par...
FILE: Emby.Naming/Video/StubResolver.cs
class StubResolver (line 11) | public static class StubResolver
method TryResolveFile (line 20) | public static bool TryResolveFile(string path, NamingOptions options, ...
FILE: Emby.Naming/Video/StubTypeRule.cs
class StubTypeRule (line 6) | public class StubTypeRule
method StubTypeRule (line 13) | public StubTypeRule(string token, string stubType)
FILE: Emby.Naming/Video/VideoFileInfo.cs
class VideoFileInfo (line 9) | public class VideoFileInfo
method VideoFileInfo (line 25) | public VideoFileInfo(string name, string path, string? container, int?...
method ToString (line 115) | public override string ToString()
FILE: Emby.Naming/Video/VideoInfo.cs
class VideoInfo (line 10) | public class VideoInfo
method VideoInfo (line 16) | public VideoInfo(string? name)
FILE: Emby.Naming/Video/VideoListResolver.cs
class VideoListResolver (line 16) | public static partial class VideoListResolver
method ResolutionRegex (line 18) | [GeneratedRegex("[0-9]{2}[0-9]+[ip]", RegexOptions.IgnoreCase)]
method CheckMultiVersionRegex (line 21) | [GeneratedRegex(@"^\[([^]]*)\]")]
method Resolve (line 33) | public static IReadOnlyList<VideoInfo> Resolve(IReadOnlyList<VideoFile...
method GetVideosGroupedByVersion (line 103) | private static List<VideoInfo> GetVideosGroupedByVersion(List<VideoInf...
method HaveSameYear (line 179) | private static bool HaveSameYear(IReadOnlyList<VideoInfo> videos)
method IsEligibleForMultiVersion (line 198) | private static bool IsEligibleForMultiVersion(ReadOnlySpan<char> folde...
FILE: Emby.Naming/Video/VideoResolver.cs
class VideoResolver (line 12) | public static class VideoResolver
method ResolveDirectory (line 22) | public static VideoFileInfo? ResolveDirectory(string? path, NamingOpti...
method ResolveFile (line 34) | public static VideoFileInfo? ResolveFile(string? path, NamingOptions n...
method Resolve (line 49) | public static VideoFileInfo? Resolve(string? path, bool isDirectory, N...
method IsVideoFile (line 119) | public static bool IsVideoFile(string path, NamingOptions namingOptions)
method IsStubFile (line 131) | public static bool IsStubFile(string path, NamingOptions namingOptions)
method TryCleanString (line 144) | public static bool TryCleanString([NotNullWhen(true)] string? name, Na...
method CleanDateTime (line 155) | public static CleanDateTimeResult CleanDateTime(string name, NamingOpt...
FILE: Emby.Photos/PhotoProvider.cs
class PhotoProvider (line 24) | public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProv...
method PhotoProvider (line 37) | public PhotoProvider(ILogger<PhotoProvider> logger, IImageProcessor im...
method HasChanged (line 47) | public bool HasChanged(BaseItem item, IDirectoryService directoryService)
method FetchAsync (line 59) | public Task<ItemUpdateType> FetchAsync(Photo item, MetadataRefreshOpti...
FILE: Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs
class BaseApplicationPaths (line 14) | public abstract class BaseApplicationPaths : IApplicationPaths
method BaseApplicationPaths (line 24) | protected BaseApplicationPaths(
method MakeSanityCheckOrThrow (line 85) | public virtual void MakeSanityCheckOrThrow()
method CreateAndCheckMarker (line 96) | public void CreateAndCheckMarker(string path, string markerName, bool ...
method GetMarkers (line 103) | private IEnumerable<string> GetMarkers(string path, bool recursive = f...
method CheckOrCreateMarker (line 108) | private void CheckOrCreateMarker(string path, string markerName, bool ...
FILE: Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs
class BaseConfigurationManager (line 20) | public abstract class BaseConfigurationManager : IConfigurationManager
method BaseConfigurationManager (line 39) | protected BaseConfigurationManager(
method RegisterConfiguration (line 124) | public virtual void RegisterConfiguration<T>()
method AddParts (line 147) | public virtual void AddParts(IEnumerable<IConfigurationFactory> factor...
method SaveConfiguration (line 159) | public void SaveConfiguration()
method OnConfigurationUpdated (line 177) | protected virtual void OnConfigurationUpdated()
method ReplaceConfiguration (line 189) | public virtual void ReplaceConfiguration(BaseApplicationConfiguration ...
method UpdateCachePath (line 202) | private void UpdateCachePath()
method ValidateCachePath (line 238) | private void ValidateCachePath(BaseApplicationConfiguration newConfig)
method EnsureWriteAccess (line 263) | protected void EnsureWriteAccess(string path)
method GetConfigurationFile (line 270) | private string GetConfigurationFile(string key)
method GetConfiguration (line 276) | public object GetConfiguration(string key)
method LoadConfiguration (line 303) | private object LoadConfiguration(string path, Type configurationType)
method SaveConfiguration (line 322) | public void SaveConfiguration(string key, object configuration)
method OnNamedConfigurationUpdated (line 359) | protected virtual void OnNamedConfigurationUpdated(string key, object ...
method GetConfigurationStores (line 365) | public ConfigurationStore[] GetConfigurationStores()
method GetConfigurationType (line 371) | public Type GetConfigurationType(string key)
method GetConfigurationStore (line 377) | private ConfigurationStore GetConfigurationStore(string key)
FILE: Emby.Server.Implementations/AppBase/ConfigurationHelper.cs
class ConfigurationHelper (line 10) | public static class ConfigurationHelper
method GetXmlConfiguration (line 20) | public static object GetXmlConfiguration(Type type, string path, IXmlS...
FILE: Emby.Server.Implementations/ApplicationHost.cs
class ApplicationHost (line 113) | public abstract class ApplicationHost : IServerApplicationHost, IDisposable
method ApplicationHost (line 143) | protected ApplicationHost(
method ExpandVirtualPath (line 276) | public string ExpandVirtualPath(string path)
method ReverseVirtualPath (line 289) | public string ReverseVirtualPath(string path)
method CreateInstanceSafe (line 302) | protected object CreateInstanceSafe(Type type)
method Resolve (line 345) | public T Resolve<T>() => ServiceProvider.GetService<T>();
method GetExportTypes (line 348) | public IEnumerable<Type> GetExportTypes<T>()
method GetExports (line 363) | public IReadOnlyCollection<T> GetExports<T>(bool manageLifetime = true)
method GetExports (line 384) | public IReadOnlyCollection<T> GetExports<T>(CreationDelegateFactory de...
method RunStartupTasksAsync (line 408) | public Task RunStartupTasksAsync()
method Init (line 432) | public void Init(IServiceCollection serviceCollection)
method RegisterServices (line 469) | protected virtual void RegisterServices(IServiceCollection serviceColl...
method InitializeServices (line 590) | public async Task InitializeServices(IConfiguration startupConfig)
method GetCertificate (line 600) | private X509Certificate2 GetCertificate(string path, string password)
method SetStaticProperties (line 636) | private void SetStaticProperties()
method FindParts (line 664) | private void FindParts()
method DiscoverTypes (line 695) | protected void DiscoverTypes()
method GetTypes (line 702) | private IEnumerable<Type> GetTypes(IEnumerable<Assembly> assemblies)
method OnConfigurationUpdated (line 739) | private void OnConfigurationUpdated(object sender, EventArgs e)
method ValidateSslCertificate (line 779) | private bool ValidateSslCertificate(NetworkConfiguration networkConfig)
method NotifyPendingRestart (line 804) | public void NotifyPendingRestart()
method GetComposablePartAssemblies (line 822) | protected IEnumerable<Assembly> GetComposablePartAssemblies()
method GetAssembliesWithPartsInternal (line 868) | protected abstract IEnumerable<Assembly> GetAssembliesWithPartsInterna...
method GetSmartApiUrl (line 871) | public string GetSmartApiUrl(IPAddress remoteAddr)
method GetSmartApiUrl (line 885) | public string GetSmartApiUrl(HttpRequest request)
method GetSmartApiUrl (line 905) | public string GetSmartApiUrl(string hostname)
method GetApiUrlForLocalAccess (line 919) | public string GetApiUrlForLocalAccess(IPAddress ipAddress = null, bool...
method GetLocalApiUrl (line 929) | public string GetLocalApiUrl(string hostname, string scheme = null, in...
method GetApiPluginAssemblies (line 950) | public IEnumerable<Assembly> GetApiPluginAssemblies()
method Dispose (line 965) | public void Dispose()
method Dispose (line 975) | protected virtual void Dispose(bool dispose)
FILE: Emby.Server.Implementations/Branding/BrandingConfigurationFactory.cs
class BrandingConfigurationFactory (line 10) | public class BrandingConfigurationFactory : IConfigurationFactory
method GetConfigurations (line 13) | public IEnumerable<ConfigurationStore> GetConfigurations()
FILE: Emby.Server.Implementations/Chapters/ChapterManager.cs
class ChapterManager (line 27) | public class ChapterManager : IChapterManager
method ChapterManager (line 50) | public ChapterManager(
method IsEligibleForChapterImageExtraction (line 72) | private bool IsEligibleForChapterImageExtraction(Video video, LibraryO...
method GetAverageDurationBetweenChapters (line 98) | private long GetAverageDurationBetweenChapters(IReadOnlyList<ChapterIn...
method RefreshChapterImages (line 115) | public async Task<bool> RefreshChapterImages(Video video, IDirectorySe...
method SaveChapters (line 235) | public void SaveChapters(Video video, IReadOnlyList<ChapterInfo> chapt...
method GetChapter (line 243) | public ChapterInfo? GetChapter(Guid baseItemId, int index)
method GetChapters (line 249) | public IReadOnlyList<ChapterInfo> GetChapters(Guid baseItemId)
method DeleteChapterDataAsync (line 255) | public async Task DeleteChapterDataAsync(Guid itemId, CancellationToke...
method GetSavedChapterImages (line 260) | private IReadOnlyList<string> GetSavedChapterImages(Video video, IDire...
method DeleteDeadImages (line 278) | private void DeleteDeadImages(IEnumerable<string> images, IEnumerable<...
FILE: Emby.Server.Implementations/Collections/CollectionImageProvider.cs
class CollectionImageProvider (line 19) | public class CollectionImageProvider : BaseDynamicImageProvider<BoxSet>
method CollectionImageProvider (line 28) | public CollectionImageProvider(
method Supports (line 38) | protected override bool Supports(BaseItem item)
method GetItemsWithImages (line 50) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
method CreateImage (line 91) | protected override string CreateImage(BaseItem item, IReadOnlyCollecti...
FILE: Emby.Server.Implementations/Collections/CollectionManager.cs
class CollectionManager (line 25) | public class CollectionManager : ICollectionManager
method CollectionManager (line 45) | public CollectionManager(
method FindFolders (line 72) | private IEnumerable<Folder> FindFolders(string path)
method EnsureLibraryFolder (line 81) | internal async Task<Folder?> EnsureLibraryFolder(string path, bool cre...
method GetCollectionsFolderPath (line 112) | internal string GetCollectionsFolderPath()
method GetCollectionsFolder (line 118) | public Task<Folder?> GetCollectionsFolder(bool createIfNeeded)
method GetCollections (line 123) | private IEnumerable<BoxSet> GetCollections(User user)
method CreateCollectionAsync (line 133) | public async Task<BoxSet> CreateCollectionAsync(CollectionCreationOpti...
method AddToCollectionAsync (line 202) | public Task AddToCollectionAsync(Guid collectionId, IEnumerable<Guid> ...
method AddToCollectionAsync (line 205) | private async Task AddToCollectionAsync(Guid collectionId, IEnumerable...
method RemoveFromCollectionAsync (line 261) | public async Task RemoveFromCollectionAsync(Guid collectionId, IEnumer...
method CollapseItemsWithinBoxSets (line 309) | public IEnumerable<BaseItem> CollapseItemsWithinBoxSets(IEnumerable<Ba...
FILE: Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs
class ServerConfigurationManager (line 18) | public class ServerConfigurationManager : BaseConfigurationManager, ISer...
method ServerConfigurationManager (line 26) | public ServerConfigurationManager(
method OnConfigurationUpdated (line 61) | protected override void OnConfigurationUpdated()
method UpdateMetadataPath (line 74) | private void UpdateMetadataPath()
method ReplaceConfiguration (line 87) | public override void ReplaceConfiguration(BaseApplicationConfiguration...
method ValidateMetadataPath (line 103) | private void ValidateMetadataPath(ServerConfiguration newConfig)
FILE: Emby.Server.Implementations/ConfigurationOptions.cs
class ConfigurationOptions (line 9) | public static class ConfigurationOptions
FILE: Emby.Server.Implementations/Cryptography/CryptographyProvider.cs
class CryptographyProvider (line 13) | public class CryptographyProvider : ICryptoProvider
method CreatePasswordHash (line 19) | public PasswordHash CreatePasswordHash(ReadOnlySpan<char> password)
method Verify (line 38) | public bool Verify(PasswordHash hash, ReadOnlySpan<char> password)
method GetIterationsParameter (line 73) | private static int GetIterationsParameter(PasswordHash hash)
method GenerateSalt (line 89) | public byte[] GenerateSalt()
method GenerateSalt (line 93) | public byte[] GenerateSalt(int length)
FILE: Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs
class CleanDatabaseScheduledTask (line 17) | public class CleanDatabaseScheduledTask : ILibraryPostScanTask
method CleanDatabaseScheduledTask (line 24) | public CleanDatabaseScheduledTask(
method Run (line 36) | public async Task Run(IProgress<double> progress, CancellationToken ca...
method CleanDeadItems (line 41) | private async Task CleanDeadItems(CancellationToken cancellationToken,...
FILE: Emby.Server.Implementations/Data/ItemTypeLookup.cs
class ItemTypeLookup (line 17) | public class ItemTypeLookup : IItemTypeLookup
FILE: Emby.Server.Implementations/Data/SqliteExtensions.cs
class SqliteExtensions (line 11) | public static class SqliteExtensions
method Query (line 54) | public static IEnumerable<SqliteDataReader> Query(this SqliteConnectio...
method Execute (line 72) | public static void Execute(this SqliteConnection sqliteConnection, str...
method ToDateTimeParamValue (line 79) | public static string ToDateTimeParamValue(this DateTime dateValue)
method GetDateTimeKindFormat (line 92) | private static string GetDateTimeKindFormat(DateTimeKind kind)
method TryReadDateTime (line 95) | public static bool TryReadDateTime(this SqliteDataReader reader, int i...
method TryGetGuid (line 122) | public static bool TryGetGuid(this SqliteDataReader reader, int index,...
method TryGetString (line 142) | public static bool TryGetString(this SqliteDataReader reader, int inde...
method TryGetBoolean (line 155) | public static bool TryGetBoolean(this SqliteDataReader reader, int ind...
method TryGetInt32 (line 167) | public static bool TryGetInt32(this SqliteDataReader reader, int index...
method TryGetInt64 (line 179) | public static bool TryGetInt64(this SqliteDataReader reader, int index...
method TryGetSingle (line 191) | public static bool TryGetSingle(this SqliteDataReader reader, int inde...
method TryGetDouble (line 203) | public static bool TryGetDouble(this SqliteDataReader reader, int inde...
method TryBind (line 215) | public static void TryBind(this SqliteCommand statement, string name, ...
method TryBind (line 220) | public static void TryBind(this SqliteCommand statement, string name, ...
method TryBindNull (line 241) | public static void TryBindNull(this SqliteCommand statement, string name)
method ExecuteQuery (line 246) | public static IEnumerable<SqliteDataReader> ExecuteQuery(this SqliteCo...
method SelectScalarInt (line 257) | public static int SelectScalarInt(this SqliteCommand command)
method PrepareStatement (line 264) | public static SqliteCommand PrepareStatement(this SqliteConnection sql...
FILE: Emby.Server.Implementations/Data/TypeMapper.cs
class TypeMapper (line 10) | public class TypeMapper
method GetType (line 24) | public Type? GetType(string typeName)
FILE: Emby.Server.Implementations/Devices/DeviceId.cs
class DeviceId (line 13) | public class DeviceId
method DeviceId (line 21) | public DeviceId(IApplicationPaths appPaths, ILogger<DeviceId> logger)
method GetCachedId (line 31) | private string? GetCachedId()
method SaveId (line 61) | private void SaveId(string id)
method GetNewId (line 80) | private static string GetNewId()
method GetDeviceId (line 85) | private string GetDeviceId()
FILE: Emby.Server.Implementations/Dto/DtoService.cs
class DtoService (line 39) | public class DtoService : IDtoService
method DtoService (line 127) | public DtoService(
method GetBaseItemDtos (line 156) | public IReadOnlyList<BaseItemDto> GetBaseItemDtos(IReadOnlyList<BaseIt...
method GetBaseItemDto (line 198) | public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, U...
method GetBaseItemDtoInternal (line 218) | private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions o...
method NormalizeMediaSourceContainers (line 316) | private static void NormalizeMediaSourceContainers(BaseItemDto dto)
method GetItemByNameDto (line 360) | public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options,...
method SetItemByNameInfo (line 374) | private void SetItemByNameInfo(BaseItemDto dto, User? user)
method SetItemByNameInfo (line 425) | private static void SetItemByNameInfo(BaseItem item, BaseItemDto dto, ...
method AttachUserSpecificInfo (line 461) | private void AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, Us...
method GetChildCount (line 516) | private static int GetChildCount(Folder folder, User user)
method SetBookProperties (line 528) | private static void SetBookProperties(BaseItemDto dto, Book item)
method SetPhotoProperties (line 533) | private static void SetPhotoProperties(BaseItemDto dto, Photo item)
method SetMusicVideoProperties (line 558) | private void SetMusicVideoProperties(BaseItemDto dto, MusicVideo item)
method GetImageTags (line 578) | private string[] GetImageTags(BaseItem item, List<ItemImageInfo> images)
method GetImageCacheTag (line 586) | private string? GetImageCacheTag(BaseItem item, ItemImageInfo image)
method AttachPeople (line 605) | private void AttachPeople(BaseItemDto dto, BaseItem item, User? user =...
method AttachStudios (line 713) | private void AttachStudios(BaseItemDto dto, BaseItem item)
method AttachGenreItems (line 725) | private void AttachGenreItems(BaseItemDto dto, BaseItem item)
method GetGenreId (line 737) | private Guid GetGenreId(string name, BaseItem owner)
method GetTagAndFillBlurhash (line 747) | private string? GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ...
method GetTagAndFillBlurhash (line 758) | private string? GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ...
method GetTagsAndFillBlurhashes (line 782) | private string[] GetTagsAndFillBlurhashes(BaseItemDto dto, BaseItem it...
method GetTagsAndFillBlurhashes (line 787) | private string[] GetTagsAndFillBlurhashes(BaseItemDto dto, BaseItem it...
method AttachBasicFields (line 818) | private void AttachBasicFields(BaseItemDto dto, BaseItem item, BaseIte...
method GetImageDisplayParent (line 1343) | private BaseItem? GetImageDisplayParent(BaseItem currentItem, BaseItem...
method AddInheritedImages (line 1364) | private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOpt...
method GetMappedPath (line 1457) | private string GetMappedPath(BaseItem item, BaseItem? ownerItem)
method AttachPrimaryImageAspectRatio (line 1474) | public void AttachPrimaryImageAspectRatio(IItemDto dto, BaseItem item)
method GetPrimaryImageAspectRatio (line 1479) | public double? GetPrimaryImageAspectRatio(BaseItem item)
FILE: Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
class LibraryChangedNotifier (line 28) | public sealed class LibraryChangedNotifier : IHostedService, IDisposable
method LibraryChangedNotifier (line 56) | public LibraryChangedNotifier(
method StartAsync (line 73) | public Task StartAsync(CancellationToken cancellationToken)
method StopAsync (line 87) | public Task StopAsync(CancellationToken cancellationToken)
method OnProviderRefreshProgress (line 100) | private void OnProviderRefreshProgress(object? sender, GenericEventArg...
method OnProviderRefreshStarted (line 153) | private void OnProviderRefreshStarted(object? sender, GenericEventArgs...
method OnProviderRefreshCompleted (line 156) | private void OnProviderRefreshCompleted(object? sender, GenericEventAr...
method EnableRefreshMessage (line 163) | private static bool EnableRefreshMessage(BaseItem item)
method OnLibraryItemAdded (line 167) | private void OnLibraryItemAdded(object? sender, ItemChangeEventArgs e)
method OnLibraryItemUpdated (line 170) | private void OnLibraryItemUpdated(object? sender, ItemChangeEventArgs e)
method OnLibraryItemRemoved (line 173) | private void OnLibraryItemRemoved(object? sender, ItemChangeEventArgs e)
method OnLibraryChange (line 176) | private void OnLibraryChange(BaseItem item, BaseItem parent, List<Base...
method LibraryUpdateTimerCallback (line 205) | private async void LibraryUpdateTimerCallback(object? state)
method SendChangeNotifications (line 247) | private async Task SendChangeNotifications(
method GetLibraryUpdateInfo (line 296) | private LibraryUpdateInfo GetLibraryUpdateInfo(
method FilterItem (line 342) | private static bool FilterItem(BaseItem item)
method GetTopParentIds (line 357) | private static IEnumerable<string> GetTopParentIds(List<BaseItem> item...
method TranslatePhysicalItemToUserLibrary (line 378) | private T[] TranslatePhysicalItemToUserLibrary<T>(T item, User user, b...
method Dispose (line 397) | public void Dispose()
FILE: Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
class UserDataChangeNotifier (line 18) | public sealed class UserDataChangeNotifier : IHostedService, IDisposable
method UserDataChangeNotifier (line 37) | public UserDataChangeNotifier(
method StartAsync (line 48) | public Task StartAsync(CancellationToken cancellationToken)
method StopAsync (line 56) | public Task StopAsync(CancellationToken cancellationToken)
method OnUserDataManagerUserDataSaved (line 63) | private void OnUserDataManagerUserDataSaved(object? sender, UserDataSa...
method UpdateTimerCallback (line 108) | private async void UpdateTimerCallback(object? state)
method GetUserDataChangeInfo (line 134) | private UserDataChangeInfo GetUserDataChangeInfo(Guid userId, List<Bas...
method Dispose (line 161) | public void Dispose()
FILE: Emby.Server.Implementations/HttpServer/Security/AuthService.cs
class AuthService (line 11) | public class AuthService : IAuthService
method AuthService (line 15) | public AuthService(
method Authenticate (line 21) | public async Task<AuthorizationInfo> Authenticate(HttpRequest request)
FILE: Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
class WebSocketConnection (line 22) | public class WebSocketConnection : IWebSocketConnection
method WebSocketConnection (line 48) | public WebSocketConnection(
method SendAsync (line 85) | public async Task SendAsync(OutboundWebSocketMessage message, Cancella...
method SendAsync (line 92) | public async Task SendAsync<T>(OutboundWebSocketMessage<T> message, Ca...
method ReceiveAsync (line 99) | public async Task ReceiveAsync(CancellationToken cancellationToken = d...
method ProcessInternal (line 159) | private async Task ProcessInternal(PipeReader reader)
method DeserializeWebSocketMessage (line 219) | internal InboundWebSocketMessage<object>? DeserializeWebSocketMessage(...
method SendKeepAliveResponse (line 227) | private async Task SendKeepAliveResponse()
method Dispose (line 236) | public void Dispose()
method Dispose (line 246) | protected virtual void Dispose(bool dispose)
method DisposeAsync (line 262) | public async ValueTask DisposeAsync()
method DisposeAsyncCore (line 273) | protected virtual async ValueTask DisposeAsyncCore()
FILE: Emby.Server.Implementations/HttpServer/WebSocketManager.cs
class WebSocketManager (line 17) | public class WebSocketManager : IWebSocketManager
method WebSocketManager (line 24) | public WebSocketManager(
method WebSocketRequestHandler (line 37) | public async Task WebSocketRequestHandler(HttpContext context)
method ProcessWebSocketMessageReceived (line 87) | private async Task ProcessWebSocketMessageReceived(WebSocketMessageInf...
FILE: Emby.Server.Implementations/IO/FileRefresher.cs
class FileRefresher (line 15) | public sealed class FileRefresher : IDisposable
method FileRefresher (line 26) | public FileRefresher(string path, IServerConfigurationManager configur...
method AddAffectedPath (line 41) | private void AddAffectedPath(string path)
method AddPath (line 51) | public void AddPath(string path)
method RestartTimer (line 63) | public void RestartTimer()
method ResetPath (line 88) | public void ResetPath(string path, string? affectedFile)
method OnTimerCallback (line 106) | private void OnTimerCallback(object? state)
method ProcessPathChanges (line 130) | private void ProcessPathChanges(List<string> paths)
method GetAffectedBaseItem (line 163) | private BaseItem? GetAffectedBaseItem(string path)
method DisposeTimer (line 191) | private void DisposeTimer()
method Dispose (line 204) | public void Dispose()
FILE: Emby.Server.Implementations/IO/LibraryMonitor.cs
class LibraryMonitor (line 18) | public sealed class LibraryMonitor : ILibraryMonitor, IDisposable
method LibraryMonitor (line 50) | public LibraryMonitor(
method ReportFileSystemChangeBeginning (line 66) | public void ReportFileSystemChangeBeginning(string path)
method ReportFileSystemChangeComplete (line 74) | public async void ReportFileSystemChangeComplete(string path, bool ref...
method IsLibraryMonitorEnabled (line 98) | private bool IsLibraryMonitorEnabled(BaseItem item)
method Start (line 111) | public void Start()
method StartWatching (line 141) | private void StartWatching(BaseItem item)
method OnLibraryManagerItemRemoved (line 154) | private void OnLibraryManagerItemRemoved(object? sender, ItemChangeEve...
method OnLibraryManagerItemAdded (line 167) | private void OnLibraryManagerItemAdded(object? sender, ItemChangeEvent...
method ContainsParentFolder (line 183) | private static bool ContainsParentFolder(IReadOnlyList<string> lst, Re...
method StartWatchingPath (line 211) | private void StartWatchingPath(string path)
method StopWatchingPath (line 270) | private void StopWatchingPath(string path)
method DisposeWatcher (line 281) | private void DisposeWatcher(FileSystemWatcher watcher, bool removeFrom...
method OnWatcherError (line 312) | private void OnWatcherError(object sender, ErrorEventArgs e)
method OnWatcherChanged (line 333) | private void OnWatcherChanged(object sender, FileSystemEventArgs e)
method ReportFileSystemChanged (line 346) | public void ReportFileSystemChanged(string path)
method CreateRefresher (line 383) | private void CreateRefresher(string path)
method OnNewRefresherCompleted (line 427) | private void OnNewRefresherCompleted(object? sender, EventArgs e)
method Stop (line 441) | public void Stop()
method DisposeRefresher (line 455) | private void DisposeRefresher(FileRefresher refresher)
method DisposeRefreshers (line 465) | private void DisposeRefreshers()
method Dispose (line 480) | public void Dispose()
FILE: Emby.Server.Implementations/IO/ManagedFileSystem.cs
class ManagedFileSystem (line 18) | public class ManagedFileSystem : IFileSystem
method ManagedFileSystem (line 40) | public ManagedFileSystem(
method IsShortcut (line 56) | public virtual bool IsShortcut(string filename)
method ResolveShortcut (line 70) | public virtual string? ResolveShortcut(string filename)
method MakeAbsolutePath (line 81) | public virtual string MakeAbsolutePath(string folderPath, string fileP...
method CreateShortcut (line 135) | public virtual void CreateShortcut(string shortcutPath, string target)
method MoveDirectory (line 154) | public void MoveDirectory(string source, string destination)
method GetFileSystemInfo (line 185) | public virtual FileSystemMetadata GetFileSystemInfo(string path)
method GetFileInfo (line 220) | public virtual FileSystemMetadata GetFileInfo(string path)
method GetDirectoryInfo (line 235) | public virtual FileSystemMetadata GetDirectoryInfo(string path)
method GetFileSystemMetadata (line 242) | private FileSystemMetadata GetFileSystemMetadata(FileSystemInfo info)
method GetValidFilename (line 305) | public string GetValidFilename(string filename)
method GetCreationTimeUtc (line 342) | public DateTime GetCreationTimeUtc(FileSystemInfo info)
method GetCreationTimeUtc (line 357) | public virtual DateTime GetCreationTimeUtc(string path)
method GetCreationTimeUtc (line 363) | public virtual DateTime GetCreationTimeUtc(FileSystemMetadata info)
method GetLastWriteTimeUtc (line 369) | public virtual DateTime GetLastWriteTimeUtc(FileSystemMetadata info)
method GetLastWriteTimeUtc (line 379) | public DateTime GetLastWriteTimeUtc(FileSystemInfo info)
method GetLastWriteTimeUtc (line 394) | public virtual DateTime GetLastWriteTimeUtc(string path)
method SetHidden (line 400) | public virtual void SetHidden(string path, bool isHidden)
method SetAttributes (line 424) | public virtual void SetAttributes(string path, bool isHidden, bool rea...
method SwapFiles (line 468) | public virtual void SwapFiles(string file1, string file2)
method ContainsSubPath (line 487) | public virtual bool ContainsSubPath(string parentPath, string path)
method AreEqual (line 498) | public virtual bool AreEqual(string path1, string path2)
method GetFileNameWithoutExtension (line 515) | public virtual string GetFileNameWithoutExtension(FileSystemMetadata i...
method IsPathFile (line 526) | public virtual bool IsPathFile(string path)
method DeleteFile (line 538) | public virtual void DeleteFile(string path)
method GetDrives (line 545) | public virtual IEnumerable<FileSystemMetadata> GetDrives()
method GetDirectories (line 563) | public virtual IEnumerable<FileSystemMetadata> GetDirectories(string p...
method GetFiles (line 569) | public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, b...
method GetFiles (line 575) | public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, s...
method GetFiles (line 581) | public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, I...
method GetFiles (line 587) | public virtual IEnumerable<FileSystemMetadata> GetFiles(string path, s...
method GetFileSystemEntries (line 620) | public virtual IEnumerable<FileSystemMetadata> GetFileSystemEntries(st...
method ToMetadata (line 631) | private IEnumerable<FileSystemMetadata> ToMetadata(IEnumerable<FileSys...
method GetDirectoryPaths (line 637) | public virtual IEnumerable<string> GetDirectoryPaths(string path, bool...
method GetFilePaths (line 643) | public virtual IEnumerable<string> GetFilePaths(string path, bool recu...
method GetFilePaths (line 649) | public virtual IEnumerable<string> GetFilePaths(string path, string[]?...
method GetFileSystemEntryPaths (line 680) | public virtual IEnumerable<string> GetFileSystemEntryPaths(string path...
method DirectoryExists (line 694) | public virtual bool DirectoryExists(string path)
method FileExists (line 700) | public virtual bool FileExists(string path)
method GetEnumerationOptions (line 705) | private EnumerationOptions GetEnumerationOptions(bool recursive)
FILE: Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
class MbLinkShortcutHandler (line 9) | public class MbLinkShortcutHandler : IShortcutHandler
method Resolve (line 13) | public string? Resolve(string shortcutPath)
method Create (line 27) | public void Create(string shortcutPath, string targetPath)
FILE: Emby.Server.Implementations/IStartupOptions.cs
type IStartupOptions (line 6) | public interface IStartupOptions
FILE: Emby.Server.Implementations/Images/ArtistImageProvider.cs
class ArtistImageProvider (line 17) | public class ArtistImageProvider : BaseDynamicImageProvider<MusicArtist>
method ArtistImageProvider (line 19) | public ArtistImageProvider(IFileSystem fileSystem, IProviderManager pr...
method GetItemsWithImages (line 29) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
FILE: Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs
class BaseDynamicImageProvider (line 26) | public abstract class BaseDynamicImageProvider<T> : IHasItemChangeMonito...
method BaseDynamicImageProvider (line 29) | protected BaseDynamicImageProvider(IFileSystem fileSystem, IProviderMa...
method Supports (line 53) | protected virtual bool Supports(BaseItem item) => true;
method FetchAsync (line 55) | public async Task<ItemUpdateType> FetchAsync(T item, MetadataRefreshOp...
method FetchAsync (line 79) | protected Task<ItemUpdateType> FetchAsync(BaseItem item, ImageType ima...
method FetchToFileInternal (line 101) | protected async Task<ItemUpdateType> FetchToFileInternal(
method GetItemsWithImages (line 128) | protected abstract IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
method CreateThumbCollage (line 130) | protected string CreateThumbCollage(BaseItem primaryItem, IEnumerable<...
method GetStripCollageImagePaths (line 135) | protected virtual IEnumerable<string> GetStripCollageImagePaths(BaseIt...
method CreatePosterCollage (line 168) | protected string CreatePosterCollage(BaseItem primaryItem, IEnumerable...
method CreateSquareCollage (line 173) | protected string CreateSquareCollage(BaseItem primaryItem, IEnumerable...
method CreateThumbCollage (line 178) | protected string CreateThumbCollage(BaseItem primaryItem, IEnumerable<...
method CreateCollage (line 183) | private string CreateCollage(BaseItem primaryItem, IEnumerable<BaseIte...
method CreateImage (line 209) | protected virtual string CreateImage(
method HasChanged (line 246) | public bool HasChanged(BaseItem item, IDirectoryService directoryService)
method HasChanged (line 266) | protected bool HasChanged(BaseItem item, ImageType type)
method HasChangedByDate (line 293) | protected virtual bool HasChangedByDate(BaseItem item, ItemImageInfo i...
method CreateSingleImage (line 305) | protected string CreateSingleImage(IEnumerable<BaseItem> itemsWithImag...
FILE: Emby.Server.Implementations/Images/BaseFolderImageProvider.cs
class BaseFolderImageProvider (line 18) | public abstract class BaseFolderImageProvider<T> : BaseDynamicImageProvi...
method BaseFolderImageProvider (line 23) | protected BaseFolderImageProvider(IFileSystem fileSystem, IProviderMan...
method GetItemsWithImages (line 29) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
method CreateImage (line 46) | protected override string CreateImage(BaseItem item, IReadOnlyCollecti...
method Supports (line 51) | protected override bool Supports(BaseItem item)
method HasChangedByDate (line 56) | protected override bool HasChangedByDate(BaseItem item, ItemImageInfo ...
FILE: Emby.Server.Implementations/Images/CollectionFolderImageProvider.cs
class CollectionFolderImageProvider (line 21) | public class CollectionFolderImageProvider : BaseDynamicImageProvider<Co...
method CollectionFolderImageProvider (line 23) | public CollectionFolderImageProvider(IFileSystem fileSystem, IProvider...
method GetItemsWithImages (line 27) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
method Supports (line 80) | protected override bool Supports(BaseItem item)
method CreateImage (line 85) | protected override string CreateImage(BaseItem item, IReadOnlyCollecti...
method HasChangedByDate (line 102) | protected override bool HasChangedByDate(BaseItem item, ItemImageInfo ...
FILE: Emby.Server.Implementations/Images/DynamicImageProvider.cs
class DynamicImageProvider (line 24) | public class DynamicImageProvider : BaseDynamicImageProvider<UserView>
method DynamicImageProvider (line 28) | public DynamicImageProvider(IFileSystem fileSystem, IProviderManager p...
method GetItemsWithImages (line 34) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
method Supports (line 103) | protected override bool Supports(BaseItem item)
method IsUsingCollectionStrip (line 113) | private static bool IsUsingCollectionStrip(UserView view)
method CreateImage (line 125) | protected override string CreateImage(BaseItem item, IReadOnlyCollecti...
FILE: Emby.Server.Implementations/Images/FolderImageProvider.cs
class FolderImageProvider (line 13) | public class FolderImageProvider : BaseFolderImageProvider<Folder>
method FolderImageProvider (line 15) | public FolderImageProvider(IFileSystem fileSystem, IProviderManager pr...
method Supports (line 20) | protected override bool Supports(BaseItem item)
FILE: Emby.Server.Implementations/Images/GenreImageProvider.cs
class GenreImageProvider (line 21) | public class GenreImageProvider : BaseDynamicImageProvider<Genre>
method GenreImageProvider (line 28) | public GenreImageProvider(IFileSystem fileSystem, IProviderManager pro...
method GetItemsWithImages (line 38) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
FILE: Emby.Server.Implementations/Images/MusicAlbumImageProvider.cs
class MusicAlbumImageProvider (line 15) | public class MusicAlbumImageProvider : BaseFolderImageProvider<MusicAlbum>
method MusicAlbumImageProvider (line 17) | public MusicAlbumImageProvider(IFileSystem fileSystem, IProviderManage...
method GetItemsWithImages (line 22) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
FILE: Emby.Server.Implementations/Images/MusicGenreImageProvider.cs
class MusicGenreImageProvider (line 24) | public class MusicGenreImageProvider : BaseDynamicImageProvider<MusicGenre>
method MusicGenreImageProvider (line 31) | public MusicGenreImageProvider(IFileSystem fileSystem, IProviderManage...
method GetItemsWithImages (line 41) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
FILE: Emby.Server.Implementations/Images/PhotoAlbumImageProvider.cs
class PhotoAlbumImageProvider (line 12) | public class PhotoAlbumImageProvider : BaseFolderImageProvider<PhotoAlbum>
method PhotoAlbumImageProvider (line 14) | public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManage...
FILE: Emby.Server.Implementations/Images/PlaylistImageProvider.cs
class PlaylistImageProvider (line 19) | public class PlaylistImageProvider : BaseDynamicImageProvider<Playlist>
method PlaylistImageProvider (line 21) | public PlaylistImageProvider(IFileSystem fileSystem, IProviderManager ...
method GetItemsWithImages (line 25) | protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem...
FILE: Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
class CoreResolutionIgnoreRule (line 15) | public class CoreResolutionIgnoreRule : IResolverIgnoreRule
method CoreResolutionIgnoreRule (line 25) | public CoreResolutionIgnoreRule(NamingOptions namingOptions, IServerAp...
method ShouldIgnore (line 32) | public bool ShouldIgnore(FileSystemMetadata fileInfo, BaseItem? parent)
FILE: Emby.Server.Implementations/Library/DotIgnoreIgnoreRule.cs
class DotIgnoreIgnoreRule (line 14) | public class DotIgnoreIgnoreRule : IResolverIgnoreRule
method FindIgnoreFile (line 18) | private static FileInfo? FindIgnoreFile(DirectoryInfo directory)
method ShouldIgnore (line 33) | public bool ShouldIgnore(FileSystemMetadata fileInfo, BaseItem? parent...
method IsIgnored (line 41) | public static bool IsIgnored(FileSystemMetadata fileInfo, BaseItem? pa...
method CheckIgnoreRules (line 70) | private static bool CheckIgnoreRules(string path, string ignoreFileCon...
method CheckIgnoreRules (line 84) | internal static bool CheckIgnoreRules(string path, string[] rules, boo...
method CheckIgnoreRules (line 95) | internal static bool CheckIgnoreRules(string path, string[] rules, boo...
method GetFileContent (line 133) | private static string GetFileContent(FileInfo ignoreFile)
FILE: Emby.Server.Implementations/Library/ExternalDataManager.cs
class ExternalDataManager (line 18) | public class ExternalDataManager : IExternalDataManager
method ExternalDataManager (line 36) | public ExternalDataManager(
method DeleteExternalItemDataAsync (line 53) | public async Task DeleteExternalItemDataAsync(BaseItem item, Cancellat...
FILE: Emby.Server.Implementations/Library/IgnorePatterns.cs
class IgnorePatterns (line 9) | public static class IgnorePatterns
method ShouldIgnore (line 122) | public static bool ShouldIgnore(ReadOnlySpan<char> path)
FILE: Emby.Server.Implementations/Library/KeyframeManager.cs
class KeyframeManager (line 14) | public class KeyframeManager : IKeyframeManager
method KeyframeManager (line 22) | public KeyframeManager(IKeyframeRepository repository)
method GetKeyframeData (line 28) | public IReadOnlyList<KeyframeData> GetKeyframeData(Guid itemId)
method SaveKeyframeDataAsync (line 34) | public async Task SaveKeyframeDataAsync(Guid itemId, KeyframeData data...
method DeleteKeyframeDataAsync (line 40) | public async Task DeleteKeyframeDataAsync(Guid itemId, CancellationTok...
FILE: Emby.Server.Implementations/Library/LibraryManager.cs
class LibraryManager (line 64) | public class LibraryManager : ILibraryManager
method LibraryManager (line 123) | public LibraryManager(
method AddParts (line 251) | public void AddParts(
method RecordConfigurationValues (line 270) | private void RecordConfigurationValues(ServerConfiguration configuration)
method ConfigurationUpdated (line 280) | private void ConfigurationUpdated(object? sender, EventArgs e)
method RegisterItem (line 294) | public void RegisterItem(BaseItem item)
method DeleteItem (line 316) | public void DeleteItem(BaseItem item, DeleteOptions options)
method DeleteItem (line 321) | public void DeleteItem(BaseItem item, DeleteOptions options, bool noti...
method DeleteItemsUnsafeFast (line 330) | public void DeleteItemsUnsafeFast(IEnumerable<BaseItem> items)
method DeleteItem (line 369) | public void DeleteItem(BaseItem item, DeleteOptions options, BaseItem ...
method DeleteItemPath (line 469) | private void DeleteItemPath(BaseItem item, bool isRequiredForDelete, F...
method IsInternalItem (line 526) | private bool IsInternalItem(BaseItem item)
method GetMetadataPaths (line 556) | private List<string> GetMetadataPaths(BaseItem item, IEnumerable<BaseI...
method GetInternalMetadataPaths (line 567) | private List<string> GetInternalMetadataPaths(BaseItem item)
method ResolveItem (line 605) | private BaseItem? ResolveItem(ItemResolveArgs args, IItemResolver[]? r...
method Resolve (line 618) | private BaseItem? Resolve(ItemResolveArgs args, IItemResolver resolver)
method GetNewItemId (line 631) | public Guid GetNewItemId(string key, Type type)
method GetNewItemIdInternal (line 636) | private Guid GetNewItemIdInternal(string key, Type type, bool forceCas...
method ResolvePath (line 660) | public BaseItem? ResolvePath(FileSystemMetadata fileInfo, Folder? pare...
method ResolvePath (line 663) | private BaseItem? ResolvePath(
method IgnoreFile (line 743) | public bool IgnoreFile(FileSystemMetadata file, BaseItem? parent)
method NormalizeRootPathList (line 746) | public List<FileSystemMetadata> NormalizeRootPathList(IEnumerable<File...
method ResolvePaths (line 768) | public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetada...
method ResolvePaths (line 773) | public IEnumerable<BaseItem> ResolvePaths(
method ResolveFileList (line 804) | private IEnumerable<BaseItem> ResolveFileList(
method CreateRootFolder (line 838) | public AggregateFolder CreateRootFolder()
method GetUserRootFolder (line 890) | public Folder GetUserRootFolder()
method FindByPath (line 938) | public BaseItem? FindByPath(string path, bool? isFolder)
method GetPerson (line 958) | public Person? GetPerson(string name)
method GetStudio (line 975) | public Studio GetStudio(string name)
method GetStudioId (line 980) | public Guid GetStudioId(string name)
method GetGenreId (line 985) | public Guid GetGenreId(string name)
method GetMusicGenreId (line 990) | public Guid GetMusicGenreId(string name)
method GetGenre (line 1000) | public Genre GetGenre(string name)
method GetMusicGenre (line 1010) | public MusicGenre GetMusicGenre(string name)
method GetYear (line 1020) | public Year GetYear(int value)
method GetArtist (line 1037) | public MusicArtist GetArtist(string name)
method GetArtists (line 1042) | public IReadOnlyDictionary<string, MusicArtist[]> GetArtists(IReadOnly...
method GetArtist (line 1047) | public MusicArtist GetArtist(string name, DtoOptions options)
method CreateItemByName (line 1052) | private T CreateItemByName<T>(Func<string, string> getPathFn, string n...
method GetItemByNameId (line 1095) | private Guid GetItemByNameId<T>(string path)
method ValidatePeopleAsync (line 1103) | public Task ValidatePeopleAsync(IProgress<double> progress, Cancellati...
method ValidateMediaLibrary (line 1117) | public Task ValidateMediaLibrary(IProgress<double> progress, Cancellat...
method ValidateMediaLibraryInternal (line 1131) | public async Task ValidateMediaLibraryInternal(IProgress<double> progr...
method ValidateTopLibraryFolders (line 1147) | public async Task ValidateTopLibraryFolders(CancellationToken cancella...
method PerformLibraryValidation (line 1193) | private async Task PerformLibraryValidation(IProgress<double> progress...
method RunPostScanTasks (line 1219) | private async Task RunPostScanTasks(IProgress<double> progress, Cancel...
method GetVirtualFolders (line 1274) | public List<VirtualFolderInfo> GetVirtualFolders()
method GetVirtualFolders (line 1279) | public List<VirtualFolderInfo> GetVirtualFolders(bool includeRefreshSt...
method GetVirtualFolderInfo (line 1292) | private VirtualFolderInfo GetVirtualFolderInfo(string dir, List<BaseIt...
method GetCollectionType (line 1342) | private CollectionTypeOptions? GetCollectionType(string path)
method GetItemById (line 1357) | public BaseItem? GetItemById(Guid id)
method GetItemById (line 1380) | public T? GetItemById<T>(Guid id)
method GetItemById (line 1393) | public T? GetItemById<T>(Guid id, Guid userId)
method GetItemById (line 1401) | public T? GetItemById<T>(Guid id, User? user)
method GetItemList (line 1408) | public IReadOnlyList<BaseItem> GetItemList(InternalItemsQuery query, b...
method GetItemList (line 1434) | public IReadOnlyList<BaseItem> GetItemList(InternalItemsQuery query)
method GetCount (line 1439) | public int GetCount(InternalItemsQuery query)
method GetItemCounts (line 1458) | public ItemCounts GetItemCounts(InternalItemsQuery query)
method GetItemList (line 1477) | public IReadOnlyList<BaseItem> GetItemList(InternalItemsQuery query, L...
method GetLatestItemList (line 1492) | public IReadOnlyList<BaseItem> GetLatestItemList(InternalItemsQuery qu...
method GetNextUpSeriesKeys (line 1507) | public IReadOnlyList<string> GetNextUpSeriesKeys(InternalItemsQuery qu...
method QueryItems (line 1522) | public QueryResult<BaseItem> QueryItems(InternalItemsQuery query)
method GetItemIds (line 1540) | public IReadOnlyList<Guid> GetItemIds(InternalItemsQuery query)
method GetStudios (line 1550) | public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetStudios(...
method GetGenres (line 1561) | public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetGenres(I...
method GetMusicGenres (line 1572) | public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetMusicGen...
method GetAllArtists (line 1583) | public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetAllArtis...
method GetArtists (line 1594) | public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetArtists(...
method SetTopParentOrAncestorIds (line 1605) | private void SetTopParentOrAncestorIds(InternalItemsQuery query)
method GetAlbumArtists (line 1635) | public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetAlbumArt...
method GetItemsResult (line 1646) | public QueryResult<BaseItem> GetItemsResult(InternalItemsQuery query)
method SetTopParentIdsOrAncestors (line 1673) | private void SetTopParentIdsOrAncestors(InternalItemsQuery query, IRea...
method AddUserToQuery (line 1701) | private void AddUserToQuery(InternalItemsQuery query, User user, bool ...
method GetTopParentIdsForQuery (line 1728) | private IEnumerable<Guid> GetTopParentIdsForQuery(BaseItem item, User?...
method GetIntros (line 1795) | public async Task<IEnumerable<Video>> GetIntros(BaseItem item, User user)
method GetIntros (line 1820) | private async Task<IEnumerable<IntroInfo>> GetIntros(IIntroProvider pr...
method ResolveIntro (line 1839) | private Video? ResolveIntro(IntroInfo info)
method Sort (line 1893) | public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? u...
method Sort (line 1925) | public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? u...
method GetComparer (line 1968) | private IBaseItemComparer? GetComparer(ItemSortBy name, User? user)
method CreateItem (line 1988) | public void CreateItem(BaseItem item, BaseItem? parent)
method CreateItems (line 1994) | public void CreateItems(IReadOnlyList<BaseItem> items, BaseItem? paren...
method ImageNeedsRefresh (line 2037) | private bool ImageNeedsRefresh(ItemImageInfo image)
method UpdateImagesAsync (line 2061) | public async Task UpdateImagesAsync(BaseItem item, bool forceUpdate = ...
method UpdateItemsAsync (line 2153) | public async Task UpdateItemsAsync(IReadOnlyList<BaseItem> items, Base...
method UpdateItemAsync (line 2202) | public Task UpdateItemAsync(BaseItem item, BaseItem parent, ItemUpdate...
method ReattachUserDataAsync (line 2206) | public async Task ReattachUserDataAsync(BaseItem item, CancellationTok...
method RunMetadataSavers (line 2211) | public async Task RunMetadataSavers(BaseItem item, ItemUpdateType upda...
method ReportItemRemoved (line 2226) | public void ReportItemRemoved(BaseItem item, BaseItem parent)
method RetrieveItem (line 2252) | public BaseItem RetrieveItem(Guid id)
method GetCollectionFolders (line 2257) | public List<Folder> GetCollectionFolders(BaseItem item)
method GetCollectionFolders (line 2262) | public List<Folder> GetCollectionFolders(BaseItem item, IEnumerable<Fo...
method GetCollectionFoldersInternal (line 2298) | private static List<Folder> GetCollectionFoldersInternal(BaseItem item...
method GetLibraryOptions (line 2305) | public LibraryOptions GetLibraryOptions(BaseItem item)
method GetContentType (line 2319) | public CollectionType? GetContentType(BaseItem item)
method GetInheritedContentType (line 2336) | public CollectionType? GetInheritedContentType(BaseItem item)
method GetConfiguredContentType (line 2350) | public CollectionType? GetConfiguredContentType(BaseItem item)
method GetConfiguredContentType (line 2355) | public CollectionType? GetConfiguredContentType(string path)
method GetConfiguredContentType (line 2360) | public CollectionType? GetConfiguredContentType(BaseItem item, bool in...
method GetContentTypeOverride (line 2370) | private CollectionType? GetContentTypeOverride(string path, bool inherit)
method GetTopFolderContentType (line 2384) | private CollectionType? GetTopFolderContentType(BaseItem item)
method GetNamedView (line 2409) | public UserView GetNamedView(
method GetNamedView (line 2418) | public UserView GetNamedView(
method GetNamedView (line 2462) | public UserView GetNamedView(
method GetShadowView (line 2527) | public UserView GetShadowView(
method GetNamedView (line 2591) | public UserView GetNamedView(
method GetParentItem (line 2667) | public BaseItem GetParentItem(Guid? parentId, Guid? userId)
method QueueLibraryScan (line 2683) | public void QueueLibraryScan()
method GetSeasonNumberFromPath (line 2689) | public int? GetSeasonNumberFromPath(string path, Guid? parentId)
method FillMissingEpisodeNumbersFromPath (line 2696) | public bool FillMissingEpisodeNumbersFromPath(Episode episode, bool fo...
method ParseName (line 2821) | public ItemLookupInfo ParseName(string name)
method FindExtras (line 2833) | public IEnumerable<BaseItem> FindExtras(BaseItem owner, IReadOnlyList<...
method GetPathAfterNetworkSubstitution (line 2906) | public string GetPathAfterNetworkSubstitution(string path, BaseItem? o...
method GetPeople (line 2919) | public IReadOnlyList<PersonInfo> GetPeople(InternalPeopleQuery query)
method GetPeople (line 2924) | public IReadOnlyList<PersonInfo> GetPeople(BaseItem item)
method GetPeopleItems (line 2942) | public IReadOnlyList<Person> GetPeopleItems(InternalPeopleQuery query)
method GetPeopleNames (line 2962) | public IReadOnlyList<string> GetPeopleNames(InternalPeopleQuery query)
method UpdatePeople (line 2967) | public void UpdatePeople(BaseItem item, List<PersonInfo> people)
method UpdatePeopleAsync (line 2973) | public async Task UpdatePeopleAsync(BaseItem item, IReadOnlyList<Perso...
method ConvertImageToLocal (line 2988) | public async Task<ItemImageInfo> ConvertImageToLocal(BaseItem item, It...
method AddVirtualFolder (line 3025) | public async Task AddVirtualFolder(string name, CollectionTypeOptions?...
method SavePeopleMetadataAsync (line 3096) | private async Task SavePeopleMetadataAsync(IEnumerable<PersonInfo> peo...
method StartScanInBackground (line 3171) | private void StartScanInBackground()
method AddMediaPath (line 3180) | public void AddMediaPath(string virtualFolderName, MediaPathInfo media...
method AddMediaPathInternal (line 3185) | private void AddMediaPathInternal(string virtualFolderName, MediaPathI...
method UpdateMediaPath (line 3218) | public void UpdateMediaPath(string virtualFolderName, MediaPathInfo me...
method SyncLibraryOptionsToLocations (line 3232) | private void SyncLibraryOptionsToLocations(string virtualFolderPath, L...
method RemoveVirtualFolder (line 3253) | public async Task RemoveVirtualFolder(string name, bool refreshLibrary)
method RemoveContentTypeOverrides (line 3294) | private void RemoveContentTypeOverrides(string path)
method RemoveMediaPath (line 3323) | public void RemoveMediaPath(string virtualFolderName, string mediaPath)
method ItemIsVisible (line 3355) | private static bool ItemIsVisible(BaseItem? item, User? user)
method CreateShortcut (line 3370) | public void CreateShortcut(string virtualFolderPath, MediaPathInfo pat...
FILE: Emby.Server.Implementations/Library/LiveStreamHelper.cs
class LiveStreamHelper (line 24) | public class LiveStreamHelper
method LiveStreamHelper (line 31) | public LiveStreamHelper(IMediaEncoder mediaEncoder, ILogger logger, IA...
method AddMediaInfoWithProbe (line 38) | public async Task AddMediaInfoWithProbe(MediaSourceInfo mediaSource, b...
method AddMediaInfoWithProbe (line 186) | public Task AddMediaInfoWithProbe(MediaSourceInfo mediaSource, bool is...
FILE: Emby.Server.Implementations/Library/MediaSourceManager.cs
class MediaSourceManager (line 41) | public class MediaSourceManager : IMediaSourceManager, IDisposable
method MediaSourceManager (line 65) | public MediaSourceManager(
method AddParts (line 95) | public void AddParts(IEnumerable<IMediaSourceProvider> providers)
method GetMediaStreams (line 100) | public IReadOnlyList<MediaStream> GetMediaStreams(MediaStreamQuery query)
method StreamSupportsExternalStream (line 112) | private static bool StreamSupportsExternalStream(MediaStream stream)
method GetMediaStreams (line 132) | public IReadOnlyList<MediaStream> GetMediaStreams(Guid itemId)
method GetMediaStreamsForItem (line 142) | private IReadOnlyList<MediaStream> GetMediaStreamsForItem(IReadOnlyLis...
method GetMediaAttachments (line 156) | public IReadOnlyList<MediaAttachment> GetMediaAttachments(MediaAttachm...
method GetMediaAttachments (line 162) | public IReadOnlyList<MediaAttachment> GetMediaAttachments(Guid itemId)
method GetPlaybackMediaSources (line 170) | public async Task<IReadOnlyList<MediaSourceInfo>> GetPlaybackMediaSour...
method GetPathProtocol (line 227) | public MediaProtocol GetPathProtocol(string path)
method SupportsDirectStream (line 267) | public bool SupportsDirectStream(string path, MediaProtocol protocol)
method GetDynamicMediaSources (line 290) | private async Task<IEnumerable<MediaSourceInfo>> GetDynamicMediaSource...
method GetDynamicMediaSources (line 298) | private async Task<IEnumerable<MediaSourceInfo>> GetDynamicMediaSource...
method SetKeyProperties (line 321) | private static void SetKeyProperties(IMediaSourceProvider provider, Me...
method GetMediaSource (line 336) | public async Task<MediaSourceInfo> GetMediaSource(BaseItem item, strin...
method GetStaticMediaSources (line 348) | public IReadOnlyList<MediaSourceInfo> GetStaticMediaSources(BaseItem i...
method NormalizeLanguage (line 377) | private IReadOnlyList<string> NormalizeLanguage(string language)
method SetDefaultSubtitleStreamIndex (line 393) | private void SetDefaultSubtitleStreamIndex(MediaSourceInfo source, Use...
method SetDefaultAudioStreamIndex (line 426) | private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserIt...
method SetDefaultAudioAndSubtitleStreamIndices (line 454) | public void SetDefaultAudioAndSubtitleStreamIndices(BaseItem item, Med...
method SortMediaSources (line 479) | private static IEnumerable<MediaSourceInfo> SortMediaSources(IEnumerab...
method OpenLiveStreamInternal (line 499) | public async Task<Tuple<LiveStreamResponse, IDirectStreamProvider>> Op...
method AddMediaInfo (line 564) | private static void AddMediaInfo(MediaSourceInfo mediaSource)
method OpenLiveStream (line 615) | public async Task<LiveStreamResponse> OpenLiveStream(LiveStreamRequest...
method GetLiveStreamMediaInfo (line 621) | public async Task<MediaSourceInfo> GetLiveStreamMediaInfo(string id, C...
method AddMediaInfoWithProbe (line 647) | public async Task AddMediaInfoWithProbe(MediaSourceInfo mediaSource, b...
method GetLiveStreamWithDirectStreamProvider (line 798) | public Task<Tuple<MediaSourceInfo, IDirectStreamProvider>> GetLiveStre...
method GetLiveStreamInfo (line 811) | public ILiveStream GetLiveStreamInfo(string id)
method GetLiveStreamInfoByUniqueId (line 824) | public ILiveStream GetLiveStreamInfoByUniqueId(string uniqueId)
method GetLiveStream (line 829) | public async Task<MediaSourceInfo> GetLiveStream(string id, Cancellati...
method GetRecordingStreamMediaSources (line 835) | public async Task<IReadOnlyList<MediaSourceInfo>> GetRecordingStreamMe...
method CloseLiveStream (line 861) | public async Task CloseLiveStream(string id)
method GetProvider (line 886) | private (IMediaSourceProvider MediaSourceProvider, string KeyId) GetPr...
method Dispose (line 901) | public void Dispose()
method Dispose (line 911) | protected virtual void Dispose(bool dispose)
FILE: Emby.Server.Implementations/Library/MediaStreamSelector.cs
class MediaStreamSelector (line 12) | public static class MediaStreamSelector
method GetDefaultAudioStreamIndex (line 14) | public static int? GetDefaultAudioStreamIndex(IReadOnlyList<MediaStrea...
method GetDefaultSubtitleStreamIndex (line 31) | public static int? GetDefaultSubtitleStreamIndex(
method GetSortedStreams (line 89) | private static IEnumerable<MediaStream> GetSortedStreams(IEnumerable<M...
method SetSubtitleStreamScores (line 97) | public static void SetSubtitleStreamScores(
method MatchesPreferredLanguage (line 154) | private static bool MatchesPreferredLanguage(string language, IReadOnl...
method IsLanguageUndefined (line 161) | private static bool IsLanguageUndefined(string language)
method BehaviorOnlyForced (line 172) | private static List<MediaStream> BehaviorOnlyForced(IEnumerable<MediaS...
method GetStreamScore (line 181) | internal static int GetStreamScore(MediaStream stream, IReadOnlyList<s...
FILE: Emby.Server.Implementations/Library/MusicManager.cs
class MusicManager (line 20) | public class MusicManager : IMusicManager
method MusicManager (line 24) | public MusicManager(ILibraryManager libraryManager)
method GetInstantMixFromSong (line 29) | public IReadOnlyList<BaseItem> GetInstantMixFromSong(Audio item, User?...
method GetInstantMixFromArtist (line 37) | public IReadOnlyList<BaseItem> GetInstantMixFromArtist(MusicArtist art...
method GetInstantMixFromAlbum (line 42) | public IReadOnlyList<BaseItem> GetInstantMixFromAlbum(MusicAlbum item,...
method GetInstantMixFromFolder (line 47) | public IReadOnlyList<BaseItem> GetInstantMixFromFolder(Folder item, Us...
method GetInstantMixFromPlaylist (line 66) | public IReadOnlyList<BaseItem> GetInstantMixFromPlaylist(Playlist item...
method GetInstantMixFromGenres (line 71) | public IReadOnlyList<BaseItem> GetInstantMixFromGenres(IEnumerable<str...
method GetInstantMixFromGenreIds (line 88) | public IReadOnlyList<BaseItem> GetInstantMixFromGenreIds(Guid[] genreI...
method GetInstantMixFromItem (line 100) | public IReadOnlyList<BaseItem> GetInstantMixFromItem(BaseItem item, Us...
FILE: Emby.Server.Implementations/Library/PathExtensions.cs
class PathExtensions (line 11) | public static class PathExtensions
method GetAttributeValue (line 20) | public static string? GetAttributeValue(this ReadOnlySpan<char> str, R...
method TryReplaceSubPath (line 85) | public static bool TryReplaceSubPath(
method Canonicalize (line 132) | public static string Canonicalize(this string path)
method NormalizePath (line 142) | [return: NotNullIfNotNull(nameof(path))]
method NormalizePath (line 154) | [return: NotNullIfNotNull(nameof(path))]
method NormalizePath (line 185) | [return: NotNullIfNotNull(nameof(path))]
FILE: Emby.Server.Implementations/Library/PathManager.cs
class PathManager (line 15) | public class PathManager : IPathManager
method PathManager (line 25) | public PathManager(
method GetAttachmentPath (line 38) | public string GetAttachmentPath(string mediaSourceId, string fileName)
method GetAttachmentFolderPath (line 44) | public string GetAttachmentFolderPath(string mediaSourceId)
method GetSubtitleFolderPath (line 52) | public string GetSubtitleFolderPath(string mediaSourceId)
method GetSubtitlePath (line 60) | public string GetSubtitlePath(string mediaSourceId, int streamIndex, s...
method GetTrickplayDirectory (line 66) | public string GetTrickplayDirectory(BaseItem item, bool saveWithMedia ...
method GetChapterImageFolderPath (line 76) | public string GetChapterImageFolderPath(BaseItem item)
method GetChapterImagePath (line 82) | public string GetChapterImagePath(BaseItem item, long chapterPositionT...
method GetExtractedDataPaths (line 90) | public IReadOnlyList<string> GetExtractedDataPaths(BaseItem item)
FILE: Emby.Server.Implementations/Library/ResolverHelper.cs
class ResolverHelper (line 14) | public static class ResolverHelper
method SetInitialItemValues (line 25) | public static bool SetInitialItemValues(BaseItem item, Folder? parent,...
method SetInitialItemValues (line 62) | public static void SetInitialItemValues(BaseItem item, ItemResolveArgs...
method EnsureName (line 91) | private static void EnsureName(BaseItem item, FileSystemMetadata fileI...
method EnsureDates (line 106) | private static void EnsureDates(IFileSystem fileSystem, BaseItem item,...
method SetDateCreated (line 133) | private static void SetDateCreated(BaseItem item, FileSystemMetadata? ...
FILE: Emby.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs
class AudioResolver (line 25) | public class AudioResolver : ItemResolver<MediaBrowser.Controller.Entiti...
method AudioResolver (line 29) | public AudioResolver(NamingOptions namingOptions)
method ResolveMultiple (line 40) | public MultiItemResolverResult ResolveMultiple(
method ResolveMultipleInternal (line 59) | private MultiItemResolverResult ResolveMultipleInternal(
method Resolve (line 77) | protected override MediaBrowser.Controller.Entities.Audio.Audio Resolv...
method FindAudioBook (line 142) | private AudioBook FindAudioBook(ItemResolveArgs args, bool parseName)
method ResolveMultipleAudio (line 158) | private MultiItemResolverResult ResolveMultipleAudio(Folder parent, IE...
method ContainsFile (line 223) | private static bool ContainsFile(IEnumerable<AudioBookInfo> result, Fi...
method ContainsFile (line 228) | private static bool ContainsFile(AudioBookInfo result, FileSystemMetad...
method ContainsFile (line 235) | private static bool ContainsFile(AudioBookFileInfo result, FileSystemM...
FILE: Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
class MusicAlbumResolver (line 24) | public class MusicAlbumResolver : ItemResolver<MusicAlbum>
method MusicAlbumResolver (line 36) | public MusicAlbumResolver(ILogger<MusicAlbumResolver> logger, NamingOp...
method Resolve (line 54) | protected override MusicAlbum Resolve(ItemResolveArgs args)
method IsMusicAlbum (line 90) | public bool IsMusicAlbum(string path, IDirectoryService directoryService)
method IsMusicAlbum (line 100) | private bool IsMusicAlbum(ItemResolveArgs args)
method ContainsMusic (line 128) | private bool ContainsMusic(
FILE: Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
class MusicArtistResolver (line 21) | public class MusicArtistResolver : ItemResolver<MusicArtist>
method MusicArtistResolver (line 33) | public MusicArtistResolver(
method Resolve (line 54) | protected override MusicArtist Resolve(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
class BaseVideoResolver (line 23) | public abstract class BaseVideoResolver<T> : MediaBrowser.Controller.Res...
method BaseVideoResolver (line 28) | protected BaseVideoResolver(ILogger logger, NamingOptions namingOption...
method Resolve (line 44) | protected override T Resolve(ItemResolveArgs args)
method ResolveVideo (line 56) | protected virtual TVideoType ResolveVideo<TVideoType>(ItemResolveArgs ...
method SetVideoType (line 139) | protected void SetVideoType(Video video, VideoFileInfo videoInfo)
method SetIsoType (line 165) | protected void SetIsoType(Video video)
method Set3DFormat (line 201) | protected void Set3DFormat(Video video, bool is3D, string format3D)
method Set3DFormat (line 240) | protected void Set3DFormat(Video video, VideoFileInfo videoInfo)
method Set3DFormat (line 245) | protected void Set3DFormat(Video video)
method IsDvdDirectory (line 259) | protected bool IsDvdDirectory(string fullPath, string directoryName, I...
method IsDvdFile (line 274) | protected bool IsDvdFile(string name)
method IsBluRayDirectory (line 284) | protected bool IsBluRayDirectory(string directoryName)
FILE: Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs
class BookResolver (line 17) | public class BookResolver : ItemResolver<Book>
method Resolve (line 21) | protected override Book Resolve(ItemResolveArgs args)
method GetBook (line 56) | private Book GetBook(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/ExtraResolver.cs
class ExtraResolver (line 19) | internal class ExtraResolver : BaseVideoResolver<Video>
method ExtraResolver (line 31) | public ExtraResolver(ILogger<ExtraResolver> logger, NamingOptions nami...
method Resolve (line 39) | protected override Video Resolve(ItemResolveArgs args)
method GetResolversForExtraType (line 49) | public IItemResolver[]? GetResolversForExtraType(ExtraType extraType) ...
method TryGetExtraTypeForOwner (line 57) | public bool TryGetExtraTypeForOwner(string path, VideoFileInfo ownerVi...
method TrimFilenameDelimiters (line 94) | private static ReadOnlySpan<char> TrimFilenameDelimiters(ReadOnlySpan<...
method StartsWith (line 99) | private static bool StartsWith(ReadOnlySpan<char> fileName, ReadOnlySp...
FILE: Emby.Server.Implementations/Library/Resolvers/FolderResolver.cs
class FolderResolver (line 12) | public class FolderResolver : GenericFolderResolver<Folder>
method Resolve (line 25) | protected override Folder Resolve(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/GenericFolderResolver.cs
class GenericFolderResolver (line 13) | public abstract class GenericFolderResolver<TItemType> : ItemResolver<TI...
method SetInitialItemValues (line 21) | protected override void SetInitialItemValues(TItemType item, ItemResol...
FILE: Emby.Server.Implementations/Library/Resolvers/GenericVideoResolver.cs
class GenericVideoResolver (line 14) | public class GenericVideoResolver<T> : BaseVideoResolver<T>
method GenericVideoResolver (line 23) | public GenericVideoResolver(ILogger logger, NamingOptions namingOption...
FILE: Emby.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs
class BoxSetResolver (line 15) | public class BoxSetResolver : GenericFolderResolver<BoxSet>
method Resolve (line 22) | protected override BoxSet Resolve(ItemResolveArgs args)
method SetInitialItemValues (line 54) | protected override void SetInitialItemValues(BoxSet item, ItemResolveA...
method SetProviderIdFromPath (line 65) | private static void SetProviderIdFromPath(BaseItem item)
FILE: Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
class MovieResolver (line 28) | public partial class MovieResolver : BaseVideoResolver<Video>, IMultiIte...
method MovieResolver (line 48) | public MovieResolver(IImageProcessor imageProcessor, ILogger<MovieReso...
method IsIgnoredRegex (line 60) | [GeneratedRegex(@"\bsample\b", RegexOptions.IgnoreCase)]
method ResolveMultiple (line 64) | public MultiItemResolverResult ResolveMultiple(
method Resolve (line 88) | protected override Video Resolve(ItemResolveArgs args)
method ResolveMultipleInternal (line 188) | private MultiItemResolverResult ResolveMultipleInternal(
method ResolveVideos (line 237) | private MultiItemResolverResult ResolveVideos<T>(
method ContainsFile (line 319) | private static bool ContainsFile(IReadOnlyList<VideoInfo> result, File...
method ContainsFile (line 344) | private static bool ContainsFile(VideoFileInfo result, FileSystemMetad...
method SetInitialItemValues (line 354) | protected override void SetInitialItemValues(Video item, ItemResolveAr...
method SetProviderIdsFromPath (line 365) | private static void SetProviderIdsFromPath(Video item)
method FindMovie (line 395) | private T FindMovie<T>(ItemResolveArgs args, string path, Folder paren...
method GetMultiDiscMovie (line 495) | private T GetMultiDiscMovie<T>(List<FileSystemMetadata> multiDiscFolde...
method IsInvalid (line 568) | private bool IsInvalid(Folder parent, CollectionType? collectionType)
FILE: Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs
class PhotoAlbumResolver (line 17) | public class PhotoAlbumResolver : GenericFolderResolver<PhotoAlbum>
method PhotoAlbumResolver (line 27) | public PhotoAlbumResolver(IImageProcessor imageProcessor, NamingOption...
method Resolve (line 41) | protected override PhotoAlbum Resolve(ItemResolveArgs args)
method HasPhotos (line 65) | private bool HasPhotos(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs
class PhotoResolver (line 20) | public class PhotoResolver : ItemResolver<Photo>
method PhotoResolver (line 45) | public PhotoResolver(IImageProcessor imageProcessor, NamingOptions nam...
method Resolve (line 57) | protected override Photo? Resolve(ItemResolveArgs args)
method IsOwnedByMedia (line 94) | internal static bool IsOwnedByMedia(NamingOptions namingOptions, strin...
method IsOwnedByResolvedMedia (line 99) | internal static bool IsOwnedByResolvedMedia(ReadOnlySpan<char> file, R...
method IsImageFile (line 102) | internal static bool IsImageFile(string path, IImageProcessor imagePro...
FILE: Emby.Server.Implementations/Library/Resolvers/PlaylistResolver.cs
class PlaylistResolver (line 18) | public class PlaylistResolver : GenericFolderResolver<Playlist>
method Resolve (line 27) | protected override Playlist Resolve(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
class SpecialFolderResolver (line 17) | public class SpecialFolderResolver : GenericFolderResolver<Folder>
method SpecialFolderResolver (line 22) | public SpecialFolderResolver(IFileSystem fileSystem, IServerApplicatio...
method Resolve (line 39) | protected override Folder Resolve(ItemResolveArgs args)
method GetCollectionType (line 66) | private CollectionType? GetCollectionType(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
class EpisodeResolver (line 18) | public class EpisodeResolver : BaseVideoResolver<Episode>
method EpisodeResolver (line 26) | public EpisodeResolver(ILogger<EpisodeResolver> logger, NamingOptions ...
method Resolve (line 36) | protected override Episode Resolve(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs
class SeasonResolver (line 16) | public class SeasonResolver : GenericFolderResolver<Season>
method SeasonResolver (line 28) | public SeasonResolver(
method Resolve (line 43) | protected override Season Resolve(ItemResolveArgs args)
FILE: Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
class SeriesResolver (line 24) | public class SeriesResolver : GenericFolderResolver<Series>
method SeriesResolver (line 34) | public SeriesResolver(ILogger<SeriesResolver> logger, NamingOptions n...
method Resolve (line 51) | protected override Series Resolve(ItemResolveArgs args)
method IsSeriesFolder (line 112) | private bool IsSeriesFolder(
method IsSeasonFolder (line 161) | private static bool IsSeasonFolder(string path, string parentPath, boo...
method SetInitialItemValues (line 173) | protected override void SetInitialItemValues(Series item, ItemResolveA...
method SetProviderIdFromPath (line 185) | private static void SetProviderIdFromPath(Series item, string path)
FILE: Emby.Server.Implementations/Library/SearchEngine.cs
class SearchEngine (line 18) | public class SearchEngine : ISearchEngine
method SearchEngine (line 23) | public SearchEngine(ILibraryManager libraryManager, IUserManager userM...
method GetSearchHints (line 29) | public QueryResult<SearchHintInfo> GetSearchHints(SearchQuery query)
method AddIfMissing (line 56) | private static void AddIfMissing(List<BaseItemKind> list, BaseItemKind...
method GetSearchHints (line 71) | private List<SearchHintInfo> GetSearchHints(SearchQuery query, User? u...
FILE: Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs
class SplashscreenPostScanTask (line 21) | public class SplashscreenPostScanTask : ILibraryPostScanTask
method SplashscreenPostScanTask (line 33) | public SplashscreenPostScanTask(
method Run (line 44) | public Task Run(IProgress<double> progress, CancellationToken cancella...
method GetItemsWithImageType (line 72) | private IReadOnlyList<BaseItem> GetItemsWithImageType(ImageType imageT...
FILE: Emby.Server.Implementations/Library/UserDataManager.cs
class UserDataManager (line 26) | public class UserDataManager : IUserDataManager
method UserDataManager (line 37) | public UserDataManager(
method SaveUserData (line 50) | public void SaveUserData(User user, BaseItem item, UserItemData userDa...
method SaveUserData (line 96) | public void SaveUserData(User user, BaseItem item, UpdateUserItemDataD...
method Map (line 142) | private UserData Map(UserItemData dto, Guid userId, Guid itemId)
method Map (line 163) | private static UserItemData Map(UserData dto)
method GetUserData (line 180) | private UserItemData? GetUserData(User user, Guid itemId, List<string>...
method GetUserDataInternal (line 202) | private UserItemData? GetUserDataInternal(Guid userId, Guid itemId, Li...
method GetCacheKey (line 233) | private static string GetCacheKey(long internalUserId, Guid itemId)
method GetUserData (line 239) | public UserItemData? GetUserData(User user, BaseItem item)
method GetUserDataDto (line 248) | public UserItemDataDto? GetUserDataDto(BaseItem item, User user)
method GetUserDataDto (line 252) | public UserItemDataDto? GetUserDataDto(BaseItem item, BaseItemDto? ite...
method GetUserItemDataDto (line 273) | private UserItemDataDto GetUserItemDataDto(UserItemData data, Guid ite...
method UpdatePlayState (line 292) | public bool UpdatePlayState(BaseItem item, UserItemData data, long? re...
FILE: Emby.Server.Implementations/Library/UserViewManager.cs
class UserViewManager (line 27) | public class UserViewManager : IUserViewManager
method UserViewManager (line 36) | public UserViewManager(ILibraryManager libraryManager, ILocalizationMa...
method GetUserViews (line 45) | public Folder[] GetUserViews(UserViewQuery query)
method GetUserSubViewWithName (line 162) | public UserView GetUserSubViewWithName(string name, Guid parentId, Col...
method GetUserSubView (line 169) | public UserView GetUserSubView(Guid parentId, CollectionType? type, st...
method GetUserView (line 176) | private Folder GetUserView(
method GetUserView (line 198) | public UserView GetUserView(Folder parent, CollectionType? viewType, s...
method GetLatestItems (line 203) | public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItem...
method GetItemsForLatestItems (line 241) | private IReadOnlyList<BaseItem> GetItemsForLatestItems(User user, Late...
FILE: Emby.Server.Implementations/Library/Validators/ArtistsPostScanTask.cs
class ArtistsPostScanTask (line 13) | public class ArtistsPostScanTask : ILibraryPostScanTask
method ArtistsPostScanTask (line 28) | public ArtistsPostScanTask(
method Run (line 44) | public Task Run(IProgress<double> progress, CancellationToken cancella...
FILE: Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs
class ArtistsValidator (line 18) | public class ArtistsValidator
method ArtistsValidator (line 37) | public ArtistsValidator(ILibraryManager libraryManager, ILogger<Artist...
method Run (line 50) | public async Task Run(IProgress<double> progress, CancellationToken ca...
FILE: Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs
class CollectionPostScanTask (line 19) | public class CollectionPostScanTask : ILibraryPostScanTask
method CollectionPostScanTask (line 31) | public CollectionPostScanTask(
method Run (line 47) | public async Task Run(IProgress<double> progress, CancellationToken ca...
FILE: Emby.Server.Implementations/Library/Validators/GenresPostScanTask.cs
class GenresPostScanTask (line 13) | public class GenresPostScanTask : ILibraryPostScanTask
method GenresPostScanTask (line 28) | public GenresPostScanTask(
method Run (line 44) | public Task Run(IProgress<double> progress, CancellationToken cancella...
FILE: Emby.Server.Implementations/Library/Validators/GenresValidator.cs
class GenresValidator (line 16) | public class GenresValidator
method GenresValidator (line 35) | public GenresValidator(ILibraryManager libraryManager, ILogger<GenresV...
method Run (line 48) | public async Task Run(IProgress<double> progress, CancellationToken ca...
FILE: Emby.Server.Implementations/Library/Validators/MusicGenresPostScanTask.cs
class MusicGenresPostScanTask (line 13) | public class MusicGenresPostScanTask : ILibraryPostScanTask
method MusicGenresPostScanTask (line 28) | public MusicGenresPostScanTask(
method Run (line 44) | public Task Run(IProgress<double> progress, CancellationToken cancella...
FILE: Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs
class MusicGenresValidator (line 13) | public class MusicGenresValidator
method MusicGenresValidator (line 32) | public MusicGenresValidator(ILibraryManager libraryManager, ILogger<Mu...
method Run (line 45) | public async Task Run(IProgress<double> progress, CancellationToken ca...
FILE: Emby.Server.Implementations/Library/Validators/PeopleValidator.cs
class PeopleValidator (line 17) | public class PeopleValidator
method PeopleValidator (line 37) | public PeopleValidator(ILibraryManager libraryManager, ILogger logger,...
method ValidatePeople (line 50) | public async Task ValidatePeople(CancellationToken cancellationToken, ...
FILE: Emby.Server.Implementations/Library/Validators/StudiosPostScanTask.cs
class StudiosPostScanTask (line 13) | public class StudiosPostScanTask : ILibraryPostScanTask
method StudiosPostScanTask (line 29) | public StudiosPostScanTask(
method Run (line 45) | public Task Run(IProgress<double> progress, CancellationToken cancella...
FILE: Emby.Server.Implementations/Library/Validators/StudiosValidator.cs
class StudiosValidator (line 16) | public class StudiosValidator
method StudiosValidator (line 36) | public StudiosValidator(ILibraryManager libraryManager, ILogger<Studio...
method Run (line 49) | public async Task Run(IProgress<double> progress, CancellationToken ca...
FILE: Emby.Server.Implementations/Localization/LocalizationManager.cs
class LocalizationManager (line 23) | public class LocalizationManager : ILocalizationManager
method LocalizationManager (line 51) | public LocalizationManager(
method LoadAll (line 63) | public async Task LoadAll()
method GetCultures (line 102) | public IEnumerable<CultureDto> GetCultures()
method LoadCultures (line 105) | private async Task LoadCultures()
method FindLanguageInfo (line 172) | public CultureDto? FindLanguageInfo(string language)
method GetCountries (line 202) | public IReadOnlyList<CountryInfo> GetCountries()
method GetParentalRatings (line 210) | public IReadOnlyList<ParentalRating> GetParentalRatings()
method GetParentalRatingsDictionary (line 275) | private Dictionary<string, ParentalRatingScore?>? GetParentalRatingsDi...
method GetRatingScore (line 292) | public ParentalRatingScore? GetRatingScore(string rating, string? coun...
method GetLocalizedString (line 378) | public string GetLocalizedString(string phrase)
method GetLocalizedString (line 384) | public string GetLocalizedString(string phrase, string culture)
method GetLocalizationDictionary (line 406) | private Dictionary<string, string> GetLocalizationDictionary(string cu...
method GetDictionary (line 418) | private async Task<Dictionary<string, string>> GetDictionary(string pr...
method CopyInto (line 432) | private async Task CopyInto(IDictionary<string, string> dictionary, st...
method GetResourceFilename (line 449) | private static string GetResourceFilename(string culture)
method GetLocalizationOptions (line 466) | public IEnumerable<LocalizationOption> GetLocalizationOptions()
method TryGetISO6392TFromB (line 542) | public bool TryGetISO6392TFromB(string isoB, [NotNullWhen(true)] out s...
FILE: Emby.Server.Implementations/Playlists/PlaylistManager.cs
class PlaylistManager (line 34) | public class PlaylistManager : IPlaylistManager
method PlaylistManager (line 44) | public PlaylistManager(
method GetPlaylistForUser (line 62) | public Playlist GetPlaylistForUser(Guid playlistId, Guid userId)
method GetPlaylists (line 67) | public IEnumerable<Playlist> GetPlaylists(Guid userId)
method CreatePlaylist (line 80) | public async Task<PlaylistCreationResult> CreatePlaylist(PlaylistCreat...
method GetUserPlaylists (line 172) | private List<Playlist> GetUserPlaylists(Guid userId)
method GetTargetPath (line 184) | private static string GetTargetPath(string path)
method GetPlaylistItems (line 194) | private IReadOnlyList<BaseItem> GetPlaylistItems(IEnumerable<Guid> ite...
method AddItemToPlaylistAsync (line 201) | public Task AddItemToPlaylistAsync(Guid playlistId, IReadOnlyCollectio...
method AddToPlaylistInternal (line 216) | private async Task AddToPlaylistInternal(Guid playlistId, IReadOnlyCol...
method RemoveItemFromPlaylistAsync (line 289) | public async Task RemoveItemFromPlaylistAsync(string playlistId, IEnum...
method DetermineAdjustedIndex (line 317) | internal static int DetermineAdjustedIndex(int newPriorIndexAllChildre...
method MoveItemAsync (line 327) | public async Task MoveItemAsync(string playlistId, string entryId, int...
method SavePlaylistFile (line 377) | public void SavePlaylistFile(Playlist item)
method NormalizeItemPath (line 537) | private static string NormalizeItemPath(string playlistPath, string it...
method MakeRelativePath (line 542) | private static string MakeRelativePath(string folderPath, string fileA...
method GetPlaylistsFolder (line 573) | public Folder GetPlaylistsFolder()
method GetPlaylistsFolder (line 579) | public Folder GetPlaylistsFolder(Guid userId)
method RemovePlaylistsAsync (line 588) | public async Task RemovePlaylistsAsync(Guid userId)
method UpdatePlaylist (line 617) | public async Task UpdatePlaylist(PlaylistUpdateRequest request)
method AddUserToShares (line 653) | public async Task AddUserToShares(PlaylistUserUpdateRequest request)
method RemoveUserFromShares (line 669) | public async Task RemoveUserFromShares(Guid playlistId, Guid userId, P...
method UpdatePlaylistInternal (line 678) | private async Task UpdatePlaylistInternal(Playlist playlist)
FILE: Emby.Server.Implementations/Playlists/PlaylistsFolder.cs
class PlaylistsFolder (line 15) | [RequiresSourceSerialisation]
method PlaylistsFolder (line 18) | public PlaylistsFolder()
method GetEligibleChildrenForRecursiveChildren (line 32) | protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursi...
method GetItemsInternal (line 37) | protected override QueryResult<BaseItem> GetItemsInternal(InternalItem...
method GetClientTypeName (line 50) | public override string GetClientTypeName()
FILE: Emby.Server.Implementations/Plugins/PluginLoadContext.cs
class PluginLoadContext (line 9) | public class PluginLoadContext : AssemblyLoadContext
method PluginLoadContext (line 17) | public PluginLoadContext(string path) : base(true)
method Load (line 23) | protected override Assembly? Load(AssemblyName assemblyName)
FILE: Emby.Server.Implementations/Plugins/PluginManager.cs
class PluginManager (line 32) | public sealed class PluginManager : IPluginManager, IDisposable
method PluginManager (line 56) | public PluginManager(
method LoadAssemblies (line 106) | public IEnumerable<Assembly> LoadAssemblies()
method CreatePlugins (line 196) | public void CreatePlugins()
method RegisterServices (line 206) | public void RegisterServices(IServiceCollection serviceCollection)
method ImportPluginFrom (line 245) | public void ImportPluginFrom(string folder)
method RemovePlugin (line 266) | public bool RemovePlugin(LocalPlugin plugin)
method GetPlugin (line 293) | public LocalPlugin? GetPlugin(Guid id, Version? version = null)
method EnablePlugin (line 317) | public void EnablePlugin(LocalPlugin plugin)
method DisablePlugin (line 332) | public void DisablePlugin(LocalPlugin plugin)
method FailPlugin (line 348) | public void FailPlugin(Assembly assembly)
method SaveManifest (line 364) | public bool SaveManifest(PluginManifest manifest, string path)
method PopulateManifest (line 380) | public async Task<bool> PopulateManifest(PackageInfo packageInfo, Vers...
method Dispose (line 443) | public void Dispose()
method ReconcileManifest (line 458) | private async Task<bool> ReconcileManifest(PluginManifest manifest, st...
method ChangePluginState (line 513) | private bool ChangePluginState(LocalPlugin plugin, PluginStatus state)
method GetPluginByAssembly (line 530) | private LocalPlugin? GetPluginByAssembly(Assembly assembly)
method CreatePluginInstance (line 541) | private IPlugin? CreatePluginInstance(Type type)
method UpdatePluginSupersededStatus (line 627) | private void UpdatePluginSupersededStatus(LocalPlugin plugin)
method DeletePlugin (line 649) | private bool DeletePlugin(LocalPlugin plugin)
method LoadManifest (line 667) | internal LocalPlugin LoadManifest(string dir)
method DiscoverPlugins (line 740) | private IEnumerable<LocalPlugin> DiscoverPlugins()
method TryGetPluginDlls (line 833) | private bool TryGetPluginDlls(LocalPlugin plugin, out IReadOnlyList<st...
method ProcessAlternative (line 882) | private void ProcessAlternative(LocalPlugin plugin)
FILE: Emby.Server.Implementations/QuickConnect/QuickConnectManager.cs
class QuickConnectManager (line 21) | public class QuickConnectManager : IQuickConnect
method QuickConnectManager (line 47) | public QuickConnectManager(
method AssertActive (line 63) | private void AssertActive()
method TryConnect (line 72) | public QuickConnectResult TryConnect(AuthorizationInfo authorizationInfo)
method CheckRequestStatus (line 98) | public QuickConnectResult CheckRequestStatus(string secret)
method GenerateCode (line 117) | private string GenerateCode()
method AuthorizeRequest (line 136) | public async Task<bool> AuthorizeRequest(Guid userId, string code)
method GetAuthorizedRequest (line 173) | public AuthenticationResult GetAuthorizedRequest(string secret)
method GenerateSecureRandom (line 186) | private string GenerateSecureRandom(int length = 32)
method ExpireRequests (line 198) | private void ExpireRequests(bool expireAll = false)
FILE: Emby.Server.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
class ScheduledTaskWorker (line 24) | public class ScheduledTaskWorker : IScheduledTaskWorker
method ScheduledTaskWorker (line 55) | public ScheduledTaskWorker(IScheduledTask scheduledTask, IApplicationP...
method InitTriggerEvents (line 223) | private void InitTriggerEvents()
method ReloadTriggerEvents (line 230) | public void ReloadTriggerEvents()
method ReloadTriggerEvents (line 239) | private void ReloadTriggerEvents(bool isApplicationStartup)
method OnTriggerTriggered (line 258) | private async void OnTriggerTriggered(object sender, EventArgs e)
method Execute (line 284) | public async Task Execute(TaskOptions options)
method ExecuteInternal (line 301) | private async Task ExecuteInternal(TaskOptions options)
method OnProgressChanged (line 364) | private void OnProgressChanged(object sender, double e)
method Cancel (line 377) | public void Cancel()
method CancelIfRunning (line 390) | public void CancelIfRunning()
method GetScheduledTasksConfigurationDirectory (line 403) | private string GetScheduledTasksConfigurationDirectory()
method GetScheduledTasksDataDirectory (line 412) | private string GetScheduledTasksDataDirectory()
method GetHistoryFilePath (line 421) | private string GetHistoryFilePath()
method GetConfigurationFilePath (line 430) | private string GetConfigurationFilePath()
method LoadTriggers (line 439) | private Tuple<TaskTriggerInfo, ITaskTrigger>[] LoadTriggers()
method LoadTriggerSettings (line 447) | private TaskTriggerInfo[] LoadTriggerSettings()
method GetDefaultTriggers (line 461) | private TaskTriggerInfo[] GetDefaultTriggers()
method SaveTriggers (line 484) | private void SaveTriggers(TaskTriggerInfo[] triggers)
method OnTaskCompleted (line 501) | private void OnTaskCompleted(DateTime startTime, DateTime endTime, Tas...
method Dispose (line 530) | public void Dispose()
method Dispose (line 540) | protected virtual void Dispose(bool dispose)
method GetTrigger (line 612) | private ITaskTrigger GetTrigger(TaskTriggerInfo info)
method DisposeTriggers (line 665) | private void DisposeTriggers()
FILE: Emby.Server.Implementations/ScheduledTasks/TaskManager.cs
class TaskManager (line 16) | public class TaskManager : ITaskManager
method TaskManager (line 32) | public TaskManager(
method CancelIfRunningAndQueue (line 52) | public void CancelIfRunningAndQueue<T>(TaskOptions options)
method CancelIfRunningAndQueue (line 62) | public void CancelIfRunningAndQueue<T>()
method CancelIfRunning (line 69) | public void CancelIfRunning<T>()
method QueueScheduledTask (line 77) | public void QueueScheduledTask<T>(TaskOptions options)
method QueueScheduledTask (line 93) | public void QueueScheduledTask<T>()
method QueueIfNotRunning (line 100) | public void QueueIfNotRunning<T>()
method Execute (line 112) | public void Execute<T>()
method QueueScheduledTask (line 138) | public void QueueScheduledTask(IScheduledTask task, TaskOptions options)
method QueueScheduledTask (line 157) | private void QueueScheduledTask(IScheduledTaskWorker task, TaskOptions...
method AddTasks (line 176) | public void AddTasks(IEnumerable<IScheduledTask> tasks)
method Dispose (line 184) | public void Dispose()
method Dispose (line 194) | protected virtual void Dispose(bool dispose)
method Cancel (line 203) | public void Cancel(IScheduledTaskWorker task)
method Execute (line 209) | public Task Execute(IScheduledTaskWorker task, TaskOptions options)
method OnTaskExecuting (line 218) | internal void OnTaskExecuting(IScheduledTaskWorker task)
method OnTaskCompleted (line 228) | internal void OnTaskCompleted(IScheduledTaskWorker task, TaskResult re...
method ExecuteQueuedTasks (line 238) | private void ExecuteQueuedTasks()
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/AudioNormalizationTask.cs
class AudioNormalizationTask (line 27) | public partial class AudioNormalizationTask : IScheduledTask
method AudioNormalizationTask (line 47) | public AudioNormalizationTask(
method LUFSRegex (line 75) | [GeneratedRegex(@"^\s+I:\s+(.*?)\s+LUFS")]
method ExecuteAsync (line 79) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
method GetDefaultTriggers (line 218) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method CalculateLUFSAsync (line 227) | private async Task<float?> CalculateLUFSAsync(string inputArgs, bool w...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/ChapterImagesTask.cs
class ChapterImagesTask (line 25) | public class ChapterImagesTask : IScheduledTask
method ChapterImagesTask (line 43) | public ChapterImagesTask(
method GetDefaultTriggers (line 72) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 83) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/CleanActivityLogTask.cs
class CleanActivityLogTask (line 15) | public class CleanActivityLogTask : IScheduledTask, IConfigurableSchedul...
method CleanActivityLogTask (line 27) | public CleanActivityLogTask(
method ExecuteAsync (line 59) | public Task ExecuteAsync(IProgress<double> progress, CancellationToken...
method GetDefaultTriggers (line 72) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/CleanupCollectionAndPlaylistPathsTask.cs
class CleanupCollectionAndPlaylistPathsTask (line 23) | public class CleanupCollectionAndPlaylistPathsTask : IScheduledTask
method CleanupCollectionAndPlaylistPathsTask (line 39) | public CleanupCollectionAndPlaylistPathsTask(
method ExecuteAsync (line 66) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
method CleanupLinkedChildrenAsync (line 108) | private async Task CleanupLinkedChildrenAsync<T>(T folder, Cancellatio...
method GetDefaultTriggers (line 132) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/CleanupUserDataTask.cs
class CleanupUserDataTask (line 20) | public class CleanupUserDataTask : IScheduledTask
method CleanupUserDataTask (line 32) | public CleanupUserDataTask(ILocalizationManager localization, IDbConte...
method ExecuteAsync (line 52) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
method GetDefaultTriggers (line 73) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
class DeleteCacheFileTask (line 19) | public class DeleteCacheFileTask : IScheduledTask, IConfigurableSchedule...
method DeleteCacheFileTask (line 37) | public DeleteCacheFileTask(
method GetDefaultTriggers (line 71) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 81) | public Task ExecuteAsync(IProgress<double> progress, CancellationToken...
method DeleteCacheFilesFromDirectory (line 117) | private void DeleteCacheFilesFromDirectory(string directory, DateTime ...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
class DeleteLogFileTask (line 17) | public class DeleteLogFileTask : IScheduledTask, IConfigurableScheduledTask
method DeleteLogFileTask (line 29) | public DeleteLogFileTask(IConfigurationManager configurationManager, I...
method GetDefaultTriggers (line 61) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 71) | public Task ExecuteAsync(IProgress<double> progress, CancellationToken...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodeFileTask.cs
class DeleteTranscodeFileTask (line 18) | public class DeleteTranscodeFileTask : IScheduledTask, IConfigurableSche...
method DeleteTranscodeFileTask (line 32) | public DeleteTranscodeFileTask(
method GetDefaultTriggers (line 66) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 81) | public Task ExecuteAsync(IProgress<double> progress, CancellationToken...
method DeleteTempFilesFromDirectory (line 98) | private void DeleteTempFilesFromDirectory(string directory, DateTime m...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/MediaSegmentExtractionTask.cs
class MediaSegmentExtractionTask (line 19) | public class MediaSegmentExtractionTask : IScheduledTask
method MediaSegmentExtractionTask (line 35) | public MediaSegmentExtractionTask(ILibraryManager libraryManager, ILoc...
method ExecuteAsync (line 55) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
method GetDefaultTriggers (line 111) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs
class OptimizeDatabaseTask (line 15) | public class OptimizeDatabaseTask : IScheduledTask, IConfigurableSchedul...
method OptimizeDatabaseTask (line 27) | public OptimizeDatabaseTask(
method GetDefaultTriggers (line 59) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 69) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs
class PeopleValidationTask (line 18) | public class PeopleValidationTask : IScheduledTask, IConfigurableSchedul...
method PeopleValidationTask (line 30) | public PeopleValidationTask(ILibraryManager libraryManager, ILocalizat...
method GetDefaultTriggers (line 62) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 72) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/PluginUpdateTask.cs
class PluginUpdateTask (line 18) | public class PluginUpdateTask : IScheduledTask, IConfigurableScheduledTask
method PluginUpdateTask (line 31) | public PluginUpdateTask(ILogger<PluginUpdateTask> logger, IInstallatio...
method GetDefaultTriggers (line 60) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 75) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
FILE: Emby.Server.Implementations/ScheduledTasks/Tasks/RefreshMediaLibraryTask.cs
class RefreshMediaLibraryTask (line 15) | public class RefreshMediaLibraryTask : IScheduledTask
method RefreshMediaLibraryTask (line 28) | public RefreshMediaLibraryTask(ILibraryManager libraryManager, ILocali...
method GetDefaultTriggers (line 47) | public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
method ExecuteAsync (line 57) | public async Task ExecuteAsync(IProgress<double> progress, Cancellatio...
FILE: Emby.Server.Implementations/ScheduledTasks/Triggers/DailyTrigger.cs
class DailyTrigger (line 11) | public sealed class DailyTrigger : ITaskTrigger, IDisposable
method DailyTrigger (line 22) | public DailyTrigger(TimeSpan timeOfDay, TaskOptions taskOptions)
method Start (line 35) | public void Start(TaskResult? lastResult, ILogger logger, string taskN...
method Stop (line 52) | public void Stop()
method DisposeTimer (line 60) | private void DisposeTimer()
method OnTriggered (line 69) | private void OnTriggered()
method Dispose (line 75) | public void Dispose()
FILE: Emby.Server.Implementations/ScheduledTasks/Triggers/IntervalTrigger.cs
class IntervalTrigger (line 12) | public sealed class IntervalTrigger : ITaskTrigger, IDisposable
method IntervalTrigger (line 24) | public IntervalTrigger(TimeSpan interval, TaskOptions taskOptions)
method Start (line 37) | public void Start(TaskResult? lastResult, ILogger logger, string taskN...
method Stop (line 66) | public void Stop()
method DisposeTimer (line 74) | private void DisposeTimer()
method OnTriggered (line 83) | private void OnTriggered()
method Dispose (line 95) | public void Dispose()
FILE: Emby.Server.Implementations/ScheduledTasks/Triggers/StartupTrigger.cs
class StartupTrigger (line 11) | public sealed class StartupTrigger : ITaskTrigger
method StartupTrigger (line 19) | public StartupTrigger(TaskOptions taskOptions)
method Start (line 31) | public async void Start(TaskResult? lastResult, ILogger logger, string...
method Stop (line 42) | public void Stop()
method OnTriggered (line 49) | private void OnTriggered()
FILE: Emby.Server.Implementations/ScheduledTasks/Triggers/WeeklyTrigger.cs
class WeeklyTrigger (line 11) | public sealed class WeeklyTrigger : ITaskTrigger, IDisposable
method WeeklyTrigger (line 24) | public WeeklyTrigger(TimeSpan timeOfDay, DayOfWeek dayOfWeek, TaskOpti...
method Start (line 38) | public void Start(TaskResult? lastResult, ILogger logger, string taskN...
method GetNextTriggerDateTime (line 51) | private DateTime GetNextTriggerDateTime()
method Stop (line 75) | public void Stop()
method DisposeTimer (line 83) | private void DisposeTimer()
method OnTriggered (line 92) | private void OnTriggered()
method Dispose (line 98) | public void Dispose()
FILE: Emby.Server.Implementations/Serialization/MyXmlSerializer.cs
class MyXmlSerializer (line 14) | public class MyXmlSerializer : IXmlSerializer
method GetSerializer (line 20) | private XmlSerializer GetSerializer(Type type)
method SerializeToWriter (line 31) | private void SerializeToWriter(object obj, XmlWriter writer)
method DeserializeFromStream (line 43) | public object? DeserializeFromStream(Type type, Stream stream)
method SerializeToStream (line 57) | public void SerializeToStream(object obj, Stream stream)
method SerializeToFile (line 72) | public void SerializeToFile(object obj, string file)
method DeserializeFromFile (line 86) | public object? DeserializeFromFile(Type type, string file)
method DeserializeFromBytes (line 100) | public object? DeserializeFromBytes(Type type, byte[] buffer)
FILE: Emby.Server.Implementations/ServerApplicationPaths.cs
class ServerApplicationPaths (line 10) | public class ServerApplicationPaths : BaseApplicationPaths, IServerAppli...
method ServerApplicationPaths (line 20) | public ServerApplicationPaths(
method MakeSanityCheckOrThrow (line 101) | public override void MakeSanityCheckOrThrow()
FILE: Emby.Server.Implementations/Session/SessionManager.cs
class SessionManager (line 49) | public sealed class SessionManager : ISessionManager, IAsyncDisposable
method SessionManager (line 92) | public SessionManager(
method OnDeviceManagerDeviceOptionsUpdated (line 160) | private void OnDeviceManagerDeviceOptionsUpdated(object sender, Generi...
method CheckDisposed (line 179) | private void CheckDisposed()
method OnSessionStarted (line 184) | private void OnSessionStarted(SessionInfo info)
method OnSessionEnded (line 208) | private async ValueTask OnSessionEnded(SessionInfo info)
method UpdateDeviceName (line 225) | public void UpdateDeviceName(string sessionId, string reportedDeviceName)
method LogSessionActivity (line 244) | public async Task<SessionInfo> LogSessionActivity(
method OnSessionControllerConnected (line 295) | public void OnSessionControllerConnected(SessionInfo session)
method CloseIfNeededAsync (line 308) | public async Task CloseIfNeededAsync(SessionInfo session)
method CloseLiveStreamIfNeededAsync (line 325) | public async Task CloseLiveStreamIfNeededAsync(string liveStreamId, st...
method ReportSessionEnded (line 361) | public async ValueTask ReportSessionEnded(string sessionId)
method GetMediaSource (line 376) | private Task<MediaSourceInfo> GetMediaSource(BaseItem item, string med...
method UpdateNowPlayingItem (line 385) | private async Task UpdateNowPlayingItem(SessionInfo session, PlaybackP...
method RemoveNowPlayingItem (line 474) | private void RemoveNowPlayingItem(SessionInfo session)
method GetSessionKey (line 486) | private static string GetSessionKey(string appName, string deviceId)
method GetSessionInfo (line 499) | private SessionInfo GetSessionInfo(
method CreateSessionInfo (line 540) | private SessionInfo CreateSessionInfo(
method GetUsers (line 587) | private List<User> GetUsers(SessionInfo session)
method StartCheckTimers (line 612) | private void StartCheckTimers()
method StopIdleCheckTimer (line 626) | private void StopIdleCheckTimer()
method StopInactiveCheckTimer (line 635) | private void StopInactiveCheckTimer()
method CheckForIdlePlayback (line 644) | private async void CheckForIdlePlayback(object state)
method CheckForInactiveSteams (line 682) | private async void CheckForInactiveSteams(object state)
method GetNowPlayingItem (line 720) | private BaseItem GetNowPlayingItem(SessionInfo session, Guid itemId)
method OnPlaybackStart (line 746) | public async Task OnPlaybackStart(PlaybackStartInfo info)
method OnPlaybackStart (line 824) | private void OnPlaybackStart(User user, BaseItem item)
method OnPlaybackProgress (line 844) | public Task OnPlaybackProgress(PlaybackProgressInfo info)
method UpdateLiveStreamActiveSessionMappings (line 849) | private void UpdateLiveStreamActiveSessionMappings(string liveStreamId...
method OnPlaybackProgress (line 881) | public async Task OnPlaybackProgress(PlaybackProgressInfo info, bool i...
method OnPlaybackProgress (line 948) | private void OnPlaybackProgress(User user, BaseItem item, PlaybackProg...
method UpdatePlaybackSettings (line 974) | private static bool UpdatePlaybackSettings(User user, PlaybackProgress...
method OnPlaybackStopped (line 1022) | public async Task OnPlaybackStopped(PlaybackStopInfo info)
method OnPlaybackStopped (line 1126) | private bool OnPlaybackStopped(User user, BaseItem item, long? positio...
method GetSession (line 1163) | private SessionInfo GetSession(string sessionId, bool throwOnMissing =...
method GetSessionToRemoteControl (line 1175) | private SessionInfo GetSessionToRemoteControl(string sessionId)
method ToSessionInfoDto (line 1190) | public SessionInfoDto ToSessionInfoDto(SessionInfo sessionInfo)
method SendMessageCommand (line 1227) | public Task SendMessageCommand(string controllingSessionId, string ses...
method SendGeneralCommand (line 1248) | public Task SendGeneralCommand(string controllingSessionId, string ses...
method SendMessageToSession (line 1263) | private static async Task SendMessageToSession<T>(SessionInfo session,...
method SendMessageToSessions (line 1274) | private static Task SendMessageToSessions<T>(IEnumerable<SessionInfo> ...
method SendPlayCommand (line 1293) | public async Task SendPlayCommand(string controllingSessionId, string ...
method SendSyncPlayCommand (line 1379) | public async Task SendSyncPlayCommand(string sessionId, SendCommand co...
method SendSyncPlayGroupUpdate (line 1387) | public async Task SendSyncPlayGroupUpdate<T>(string sessionId, GroupUp...
method TranslateItemForPlayback (line 1394) | private IEnumerable<BaseItem> TranslateItemForPlayback(Guid id, User u...
method TranslateItemForInstantMix (line 1447) | private List<BaseItem> TranslateItemForInstantMix(Guid id, User user)
method SendBrowseCommand (line 1461) | public Task SendBrowseCommand(string controllingSessionId, string sess...
method SendPlaystateCommand (line 1478) | public Task SendPlaystateCommand(string controllingSessionId, string s...
method AssertCanControl (line 1497) | private static void AssertCanControl(SessionInfo session, SessionInfo ...
method SendRestartRequiredNotification (line 1509) | public Task SendRestartRequiredNotification(CancellationToken cancella...
method AddAdditionalUser (line 1523) | public void AddAdditionalUser(string sessionId, Guid userId)
method RemoveAdditionalUser (line 1554) | public void RemoveAdditionalUser(string sessionId, Guid userId)
method AuthenticateNewSession (line 1581) | public Task<AuthenticationResult> AuthenticateNewSession(Authenticatio...
method AuthenticateDirect (line 1591) | public Task<AuthenticationResult> AuthenticateDirect(AuthenticationReq...
method AuthenticateNewSessionInternal (line 1596) | internal async Task<AuthenticationResult> AuthenticateNewSessionIntern...
method GetAuthorizationToken (line 1664) | internal async Task<string> GetAuthorizationToken(User user, string de...
method Logout (line 1696) | public async Task Logout(string accessToken)
method Logout (line 1716) | public async Task Logout(Device device)
method RevokeUserTokens (line 1742) | public async Task RevokeUserTokens(Guid userId, string currentAccessTo...
method ReportCapabilities (line 1765) | public void ReportCapabilities(string sessionId, ClientCapabilities ca...
method ReportCapabilities (line 1774) | private void ReportCapabilities(
method GetItemInfo (line 1797) | private BaseItemDto GetItemInfo(BaseItem item, MediaSourceInfo mediaSo...
method GetImageCacheTag (line 1852) | private string GetImageCacheTag(User user)
method ReportNowViewingItem (line 1866) | public void ReportNowViewingItem(string sessionId, string itemId)
method ReportTranscodingInfo (line 1877) | public void ReportTranscodingInfo(string deviceId, TranscodingInfo info)
method ClearTranscodingInfo (line 1889) | public void ClearTranscodingInfo(string deviceId)
method GetSession (line 1895) | public SessionInfo GetSession(string deviceId, string client, string v...
method GetSessionByAuthenticationToken (line 1903) | public Task<SessionInfo> GetSessionByAuthenticationToken(Device info, ...
method GetSessionByAuthenticationToken (line 1933) | public async Task<SessionInfo> GetSessionByAuthenticationToken(string ...
method GetSessions (line 1950) | public IReadOnlyList<SessionInfoDto> GetSessions(
method SendMessageToAdminSessions (line 2053) | public Task SendMessageToAdminSessions<T>(SessionMessageType name, T d...
method SendMessageToUserSessions (line 2066) | public Task SendMessageToUserSessions<T>(List<Guid> userIds, SessionMe...
method SendMessageToUserSessions (line 2081) | public Task SendMessageToUserSessions<T>(List<Guid> userIds, SessionMe...
method SendMessageToUserDeviceSessions (line 2090) | public Task SendMessageToUserDeviceSessions<T>(string deviceId, Sessio...
method DisposeAsync (line 2100) | public async ValueTask DisposeAsync()
method OnApplicationStopping (line 2130) | private async void OnApplicationStopping()
FILE: Emby.Server.Implementations/Session/SessionWebSocketListener.cs
class SessionWebSocketListener (line 21) | public sealed class SessionWebSocketListener : IWebSocketListener, IDisp...
method SessionWebSocketListener (line 65) | public SessionWebSocketListener(
method Dispose (line 84) | public void Dispose()
method ProcessMessageAsync (line 110) | public Task ProcessMessageAsync(WebSocketMessageInfo message)
method ProcessWebSocketConnectedAsync (line 114) | public async Task ProcessWebSocketConnectedAsync(IWebSocketConnection ...
method EnsureController (line 121) | private void EnsureController(SessionInfo session, IWebSocketConnectio...
method OnWebSocketClosed (line 137) | private void OnWebSocketClosed(object? sender, EventArgs e)
method KeepAliveWebSocket (line 153) | private async Task KeepAliveWebSocket(IWebSocketConnection webSocket)
method RemoveWebSocket (line 184) | private void RemoveWebSocket(IWebSocketConnection webSocket)
method KeepAliveSockets (line 207) | private async void KeepAliveSockets(object? o, EventArgs? e)
method SendForceKeepAlive (line 261) | private async Task SendForceKeepAlive(IWebSocketConnection webSocket)
FILE: Emby.Server.Implementations/Session/WebSocketController.cs
class WebSocketController (line 17) | public sealed class WebSocketController : ISessionController, IAsyncDisp...
method WebSocketController (line 27) | public WebSocketController(
method AddWebSocket (line 62) | public void AddWebSocket(IWebSocketConnection connection)
method OnConnectionClosed (line 78) | private async void OnConnectionClosed(object? sender, EventArgs e)
method SendMessage (line 98) | public Task SendMessage<T>(
method Dispose (line 132) | public void Dispose()
method DisposeAsync (line 159) | public async ValueTask DisposeAsync()
FILE: Emby.Server.Implementations/Sorting/AiredEpisodeOrderComparer.cs
class AiredEpisodeOrderComparer (line 12) | public class AiredEpisodeOrderComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
method Compare (line 53) | private int Compare(Episode x, Episode y)
method CompareEpisodeToSpecial (line 76) | private static int CompareEpisodeToSpecial(Episode x, Episode y)
method CompareSpecials (line 120) | private int CompareSpecials(Episode x, Episode y)
method GetSpecialCompareValue (line 125) | private static long GetSpecialCompareValue(Episode item)
method CompareEpisodes (line 146) | private static int CompareEpisodes(Episode x, Episode y)
FILE: Emby.Server.Implementations/Sorting/AlbumArtistComparer.cs
class AlbumArtistComparer (line 13) | public class AlbumArtistComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
method GetFirstAlbumArtist (line 31) | private static string? GetFirstAlbumArtist(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/AlbumComparer.cs
class AlbumComparer (line 13) | public class AlbumComparer : IBaseItemComparer
method Compare (line 27) | public int Compare(BaseItem? x, BaseItem? y)
method GetValue (line 37) | private static string GetValue(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/ArtistComparer.cs
class ArtistComparer (line 13) | public class ArtistComparer : IBaseItemComparer
method Compare (line 19) | public int Compare(BaseItem? x, BaseItem? y)
method GetValue (line 29) | private static string? GetValue(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/CommunityRatingComparer.cs
class CommunityRatingComparer (line 11) | public class CommunityRatingComparer : IBaseItemComparer
method Compare (line 25) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/CriticRatingComparer.cs
class CriticRatingComparer (line 11) | public class CriticRatingComparer : IBaseItemComparer
method Compare (line 25) | public int Compare(BaseItem? x, BaseItem? y)
method GetValue (line 30) | private static float GetValue(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/DateCreatedComparer.cs
class DateCreatedComparer (line 12) | public class DateCreatedComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/DateLastMediaAddedComparer.cs
class DateLastMediaAddedComparer (line 14) | public class DateLastMediaAddedComparer : IUserBaseItemComparer
method Compare (line 46) | public int Compare(BaseItem x, BaseItem y)
method GetDate (line 56) | private static DateTime GetDate(BaseItem x)
FILE: Emby.Server.Implementations/Sorting/DatePlayedComparer.cs
class DatePlayedComparer (line 16) | public class DatePlayedComparer : IUserBaseItemComparer
method Compare (line 48) | public int Compare(BaseItem x, BaseItem y)
method GetDate (line 58) | private DateTime GetDate(BaseItem x)
FILE: Emby.Server.Implementations/Sorting/IndexNumberComparer.cs
class IndexNumberComparer (line 12) | public class IndexNumberComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/IsFavoriteOrLikeComparer.cs
class IsFavoriteOrLikeComparer (line 12) | public class IsFavoriteOrLikeComparer : IUserBaseItemComparer
method Compare (line 44) | public int Compare(BaseItem x, BaseItem y)
method GetValue (line 54) | private int GetValue(BaseItem x)
FILE: Emby.Server.Implementations/Sorting/IsFolderComparer.cs
class IsFolderComparer (line 10) | public class IsFolderComparer : IBaseItemComparer
method Compare (line 24) | public int Compare(BaseItem? x, BaseItem? y)
method GetValue (line 34) | private static int GetValue(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/IsPlayedComparer.cs
class IsPlayedComparer (line 13) | public class IsPlayedComparer : IUserBaseItemComparer
method Compare (line 45) | public int Compare(BaseItem x, BaseItem y)
method GetValue (line 55) | private int GetValue(BaseItem x)
FILE: Emby.Server.Implementations/Sorting/IsUnplayedComparer.cs
class IsUnplayedComparer (line 13) | public class IsUnplayedComparer : IUserBaseItemComparer
method Compare (line 45) | public int Compare(BaseItem x, BaseItem y)
method GetValue (line 55) | private int GetValue(BaseItem x)
FILE: Emby.Server.Implementations/Sorting/NameComparer.cs
class NameComparer (line 12) | public class NameComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/OfficialRatingComparer.cs
class OfficialRatingComparer (line 13) | public class OfficialRatingComparer : IBaseItemComparer
method OfficialRatingComparer (line 21) | public OfficialRatingComparer(ILocalizationManager localizationManager)
method Compare (line 38) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/ParentIndexNumberComparer.cs
class ParentIndexNumberComparer (line 12) | public class ParentIndexNumberComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/PlayCountComparer.cs
class PlayCountComparer (line 15) | public class PlayCountComparer : IUserBaseItemComparer
method Compare (line 47) | public int Compare(BaseItem x, BaseItem y)
method GetValue (line 57) | private int GetValue(BaseItem x)
FILE: Emby.Server.Implementations/Sorting/PremiereDateComparer.cs
class PremiereDateComparer (line 12) | public class PremiereDateComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
method GetDate (line 36) | private static DateTime GetDate(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/ProductionYearComparer.cs
class ProductionYearComparer (line 11) | public class ProductionYearComparer : IBaseItemComparer
method Compare (line 25) | public int Compare(BaseItem? x, BaseItem? y)
method GetValue (line 35) | private static int GetValue(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/RandomComparer.cs
class RandomComparer (line 12) | public class RandomComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/RuntimeComparer.cs
class RuntimeComparer (line 12) | public class RuntimeComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/SeriesSortNameComparer.cs
class SeriesSortNameComparer (line 11) | public class SeriesSortNameComparer : IBaseItemComparer
method Compare (line 25) | public int Compare(BaseItem? x, BaseItem? y)
method GetValue (line 30) | private static string? GetValue(BaseItem? item)
FILE: Emby.Server.Implementations/Sorting/SortNameComparer.cs
class SortNameComparer (line 12) | public class SortNameComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/Sorting/StartDateComparer.cs
class StartDateComparer (line 11) | public class StartDateComparer : IBaseItemComparer
method Compare (line 25) | public int Compare(BaseItem? x, BaseItem? y)
method GetDate (line 35) | private static DateTime GetDate(BaseItem? x)
FILE: Emby.Server.Implementations/Sorting/StudioComparer.cs
class StudioComparer (line 12) | public class StudioComparer : IBaseItemComparer
method Compare (line 26) | public int Compare(BaseItem? x, BaseItem? y)
FILE: Emby.Server.Implementations/SyncPlay/Group.cs
class Group (line 27) | public class Group : IGroupStateContext
method Group (line 72) | public Group(
method AddSession (line 145) | private void AddSession(SessionInfo session)
method RemoveSession (line 160) | private void RemoveSession(SessionInfo session)
method FilterSessions (line 171) | private IEnumerable<string> FilterSessions(string fromId, SyncPlayBroa...
method HasAccessToQueue (line 198) | private bool HasAccessToQueue(User user, IReadOnlyList<Guid> queue)
method AllUsersHaveAccessToQueue (line 218) | private bool AllUsersHaveAccessToQueue(IReadOnlyList<Guid> queue)
method IsGroupEmpty (line 242) | public bool IsGroupEmpty() => _participants.Count == 0;
method CreateGroup (line 250) | public void CreateGroup(SessionInfo session, NewGroupRequest request, ...
method SessionJoin (line 290) | public void SessionJoin(SessionInfo session, JoinGroupRequest request,...
method SessionLeave (line 311) | public void SessionLeave(SessionInfo session, LeaveGroupRequest reques...
method HandleRequest (line 332) | public void HandleRequest(SessionInfo session, IGroupPlaybackRequest r...
method GetInfo (line 355) | public GroupInfoDto GetInfo()
method HasAccessToPlayQueue (line 366) | public bool HasAccessToPlayQueue(User user)
method SetIgnoreGroupWait (line 373) | public void SetIgnoreGroupWait(SessionInfo session, bool ignoreGroupWait)
method SetState (line 382) | public void SetState(IGroupState state)
method SendGroupUpdate (line 389) | public Task SendGroupUpdate<T>(SessionInfo from, SyncPlayBroadcastType...
method SendCommand (line 403) | public Task SendCommand(SessionInfo from, SyncPlayBroadcastType type, ...
method NewSyncPlayCommand (line 417) | public SendCommand NewSyncPlayCommand(SendCommandType type)
method SanitizePositionTicks (line 429) | public long SanitizePositionTicks(long? positionTicks)
method UpdatePing (line 436) | public void UpdatePing(SessionInfo session, long ping)
method GetHighestPing (line 445) | public long GetHighestPing()
method SetBuffering (line 457) | public void SetBuffering(SessionInfo session, bool isBuffering)
method SetAllBuffering (line 466) | public void SetAllBuffering(bool isBuffering)
method IsBuffering (line 475) | public bool IsBuffering()
method SetPlayQueue (line 489) | public bool SetPlayQueue(IReadOnlyList<Guid> playQueue, int playingIte...
method SetPlayingItem (line 515) | public bool SetPlayingItem(Guid playlistItemId)
method ClearPlayQueue (line 535) | public void ClearPlayQueue(bool clearPlayingItem)
method RemoveFromPlayQueue (line 545) | public bool RemoveFromPlayQueue(IReadOnlyList<Guid> playlistItemIds)
method MoveItemInPlayQueue (line 568) | public bool MoveItemInPlayQueue(Guid playlistItemId, int newIndex)
method AddToPlayQueue (line 574) | public bool AddToPlayQueue(IReadOnlyList<Guid> newItems, GroupQueueMod...
method RestartCurrentItem (line 601) | public void RestartCurrentItem()
method NextItemInQueue (line 608) | public bool NextItemInQueue()
method PreviousItemInQueue (line 623) | public bool PreviousItemInQueue()
method SetRepeatMode (line 638) | public void SetRepeatMode(GroupRepeatMode mode)
method SetShuffleMode (line 644) | public void SetShuffleMode(GroupShuffleMode mode)
method GetPlayQueueUpdate (line 650) | public PlayQueueUpdate GetPlayQueueUpdate(PlayQueueUpdateReason reason)
FILE: Emby.Server.Implementations/SyncPlay/SyncPlayManager.cs
class SyncPlayManager (line 19) | public class SyncPlayManager : ISyncPlayManager, IDisposable
method SyncPlayManager (line 81) | public SyncPlayManager(
method Dispose (line 96) | public void Dispose()
method NewGroup (line 103) | public GroupInfoDto NewGroup(SessionInfo session, NewGroupRequest requ...
method JoinGroup (line 140) | public void JoinGroup(SessionInfo session, JoinGroupRequest request, C...
method LeaveGroup (line 206) | public void LeaveGroup(SessionInfo session, LeaveGroupRequest request,...
method ListGroups (line 259) | public List<GroupInfoDto> ListGroups(SessionInfo session, ListGroupsRe...
method GetGroup (line 293) | public GroupInfoDto GetGroup(SessionInfo session, Guid groupId)
method HandleRequest (line 318) | public void HandleRequest(SessionInfo session, IGroupPlaybackRequest r...
method IsUserActive (line 362) | public bool IsUserActive(Guid userId)
method Dispose (line 376) | protected virtual void Dispose(bool disposing)
method OnSessionEnded (line 387) | private void OnSessionEnded(object sender, SessionEventArgs e)
method UpdateSessionsCounter (line 398) | private void UpdateSessionsCounter(Guid userId, int toAdd)
FILE: Emby.Server.Implementations/SystemManager.cs
class SystemManager (line 17) | public class SystemManager : ISystemManager
method SystemManager (line 37) | public SystemManager(
method GetSystemInfo (line 56) | public SystemInfo GetSystemInfo(HttpRequest request)
method GetSystemStorageInfo (line 86) | public SystemStorageInfo GetSystemStorageInfo()
method GetPublicSystemInfo (line 112) | public PublicSystemInfo GetPublicSystemInfo(HttpRequest request)
method Restart (line 126) | public void Restart() => ShutdownInternal(true);
method Shutdown (line 129) | public void Shutdown() => ShutdownInternal(false);
method ShutdownInternal (line 131) | private void ShutdownInternal(bool restart)
FILE: Emby.Server.Implementations/TV/TVSeriesManager.cs
class TVSeriesManager (line 22) | public class TVSeriesManager : ITVSeriesManager
method TVSeriesManager (line 28) | public TVSeriesManager(IUserDataManager userDataManager, ILibraryManag...
method GetNextUp (line 35) | public QueryResult<BaseItem> GetNextUp(NextUpQuery query, DtoOptions o...
method GetNextUp (line 79) | public QueryResult<BaseItem> GetNextUp(NextUpQuery request, BaseItem[]...
method GetNextUpEpisodes (line 111) | private IEnumerable<Episode> GetNextUpEpisodes(NextUpQuery request, Us...
method GetUniqueSeriesKey (line 127) | private static string GetUniqueSeriesKey(Series series)
method GetNextUp (line 136) | private (DateTime LastWatchedDate, Func<Episode?> GetEpisodeFunction) ...
method GetResult (line 253) | private static QueryResult<BaseItem> GetResult(IEnumerable<BaseItem> i...
FILE: Emby.Server.Implementations/Updates/InstallationManager.cs
class InstallationManager (line 33) | public class InstallationManager : IInstallationManager
method InstallationManager (line 73) | public InstallationManager(
method GetPackages (line 99) | public async Task<PackageInfo[]> GetPackages(string manifestName, stri...
method GetAvailablePackages (line 172) | public async Task<IReadOnlyList<PackageInfo>> GetAvailablePackages(Can...
method FilterPackages (line 225) | public IEnumerable<PackageInfo> FilterPackages(
method GetCompatibleVersions (line 249) | public IEnumerable<InstallationInfo> GetCompatibleVersions(
method GetAvailablePluginUpdates (line 293) | public async Task<IEnumerable<InstallationInfo>> GetAvailablePluginUpd...
method InstallPackage (line 300) | public async Task InstallPackage(InstallationInfo package, Cancellatio...
method UninstallPlugin (line 382) | public void UninstallPlugin(LocalPlugin plugin)
method CancelInstallation (line 406) | public bool CancelInstallation(Guid id)
method Dispose (line 423) | public void Dispose()
method Dispose (line 433) | protected virtual void Dispose(bool dispose)
method MergeSortedList (line 454) | private static void MergeSortedList(IList<VersionInfo> source, IList<V...
method GetAvailablePluginUpdates (line 495) | private IEnumerable<InstallationInfo> GetAvailablePluginUpdates(IReadO...
method PerformPackageInstallation (line 516) | private async Task PerformPackageInstallation(InstallationInfo package...
method InstallPackageInternal (line 573) | private async Task<bool> InstallPackageInternal(InstallationInfo packa...
FILE: Jellyfin.Api/Attributes/AcceptsFileAttribute.cs
class AcceptsFileAttribute (line 10) | [AttributeUsage(AttributeTargets.Method)]
method AcceptsFileAttribute (line 19) | public AcceptsFileAttribute(params string[] contentTypes)
FILE: Jellyfin.Api/Attributes/AcceptsImageFileAttribute.cs
class AcceptsImageFileAttribute (line 6) | public sealed class AcceptsImageFileAttribute : AcceptsFileAttribute
method AcceptsImageFileAttribute (line 13) | public AcceptsImageFileAttribute()
FILE: Jellyfin.Api/Attributes/ParameterObsoleteAttribute.cs
class ParameterObsoleteAttribute (line 8) | [AttributeUsage(AttributeTargets.Parameter)]
FILE: Jellyfin.Api/Attributes/ProducesAudioFileAttribute.cs
class ProducesAudioFileAttribute (line 6) | public sealed class ProducesAudioFileAttribute : ProducesFileAttribute
method ProducesAudioFileAttribute (line 13) | public ProducesAudioFileAttribute()
FILE: Jellyfin.Api/Attributes/ProducesFileAttribute.cs
class ProducesFileAttribute (line 10) | [AttributeUsage(AttributeTargets.Method)]
method ProducesFileAttribute (line 19) | public ProducesFileAttribute(params string[] contentTypes)
FILE: Jellyfin.Api/Attributes/ProducesImageFileAttribute.cs
class ProducesImageFileAttribute (line 6) | public sealed class ProducesImageFileAttribute : ProducesFileAttribute
method ProducesImageFileAttribute (line 13) | public ProducesImageFileAttribute()
FILE: Jellyfin.Api/Attributes/ProducesPlaylistFileAttribute.cs
class ProducesPlaylistFileAttribute (line 6) | public sealed class ProducesPlaylistFileAttribute : ProducesFileAttribute
method ProducesPlaylistFileAttribute (line 13) | public ProducesPlaylistFileAttribute()
FILE: Jellyfin.Api/Attributes/ProducesVideoFileAttribute.cs
class ProducesVideoFileAttribute (line 6) | public sealed class ProducesVideoFileAttribute : ProducesFileAttribute
method ProducesVideoFileAttribute (line 13) | public ProducesVideoFileAttribute()
FILE: Jellyfin.Api/Auth/AnonymousLanAccessPolicy/AnonymousLanAccessHandler.cs
class AnonymousLanAccessHandler (line 12) | public class AnonymousLanAccessHandler : AuthorizationHandler<AnonymousL...
method AnonymousLanAccessHandler (line 22) | public AnonymousLanAccessHandler(
method HandleRequirementAsync (line 31) | protected override Task HandleRequirementAsync(AuthorizationHandlerCon...
FILE: Jellyfin.Api/Auth/AnonymousLanAccessPolicy/AnonymousLanAccessRequirement.cs
class AnonymousLanAccessRequirement (line 8) | public class AnonymousLanAccessRequirement : IAuthorizationRequirement
FILE: Jellyfin.Api/Auth/CustomAuthenticationHandler.cs
class CustomAuthenticationHandler (line 19) | public class CustomAuthenticationHandler : AuthenticationHandler<Authent...
method CustomAuthenticationHandler (line 31) | public CustomAuthenticationHandler(
method HandleAuthenticateAsync (line 43) | protected override async Task<AuthenticateResult> HandleAuthenticateAs...
FILE: Jellyfin.Api/Auth/DefaultAuthorizationPolicy/DefaultAuthorizationHandler.cs
class DefaultAuthorizationHandler (line 18) | public class DefaultAuthorizationHandler : AuthorizationHandler<DefaultA...
method DefaultAuthorizationHandler (line 30) | public DefaultAuthorizationHandler(
method HandleRequirementAsync (line 41) | protected override Task HandleRequirementAsync(AuthorizationHandlerCon...
FILE: Jellyfin.Api/Auth/DefaultAuthorizationPolicy/DefaultAuthorizationRequirement.cs
class DefaultAuthorizationRequirement (line 8) | public class DefaultAuthorizationRequirement : IAuthorizationRequirement
method DefaultAuthorizationRequirement (line 14) | public DefaultAuthorizationRequirement(bool validateParentalSchedule =...
FILE: Jellyfin.Api/Auth/FirstTimeSetupPolicy/FirstTimeSetupHandler.cs
class FirstTimeSetupHandler (line 12) | public class FirstTimeSetupHandler : AuthorizationHandler<FirstTimeSetup...
method FirstTimeSetupHandler (line 20) | public FirstTimeSetupHandler(IConfigurationManager configurationManager)
method HandleRequirementAsync (line 26) | protected override Task HandleRequirementAsync(AuthorizationHandlerCon...
FILE: Jellyfin.Api/Auth/FirstTimeSetupPolicy/FirstTimeSetupRequirement.cs
class FirstTimeSetupRequirement (line 8) | public class FirstTimeSetupRequirement : DefaultAuthorizationRequirement
method FirstTimeSetupRequirement (line 15) | public FirstTimeSetupRequirement(bool validateParentalSchedule = false...
FILE: Jellyfin.Api/Auth/LocalAccessOrRequiresElevationPolicy/LocalAccessOrRequiresElevationHandler.cs
class LocalAccessOrRequiresElevationHandler (line 13) | public class LocalAccessOrRequiresElevationHandler : AuthorizationHandle...
method LocalAccessOrRequiresElevationHandler (line 23) | public LocalAccessOrRequiresElevationHandler(
method HandleRequirementAsync (line 32) | protected override Task HandleRequirementAsync(AuthorizationHandlerCon...
FILE: Jellyfin.Api/Auth/LocalAccessOrRequiresElevationPolicy/LocalAccessOrRequiresElevationRequirement.cs
class LocalAccessOrRequiresElevationRequirement (line 8) | public class LocalAccessOrRequiresElevationRequirement : IAuthorizationR...
FILE: Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs
class SyncPlayAccessHandler (line 15) | public class SyncPlayAccessHandler : AuthorizationHandler<SyncPlayAccess...
method SyncPlayAccessHandler (line 25) | public SyncPlayAccessHandler(
method HandleRequirementAsync (line 34) | protected override Task HandleRequirementAsync(AuthorizationHandlerCon...
FILE: Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessRequirement.cs
class SyncPlayAccessRequirement (line 9) | public class SyncPlayAccessRequirement : DefaultAuthorizationRequirement
method SyncPlayAccessRequirement (line 15) | public SyncPlayAccessRequirement(SyncPlayAccessRequirementType require...
FILE: Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionHandler.cs
class UserPermissionHandler (line 14) | public class UserPermissionHandler : AuthorizationHandler<UserPermission...
method UserPermissionHandler (line 22) | public UserPermissionHandler(IUserManager userManager)
method HandleRequirementAsync (line 28) | protected override Task HandleRequirementAsync(AuthorizationHandlerCon...
FILE: Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionRequirement.cs
class UserPermissionRequirement (line 9) | public class UserPermissionRequirement : DefaultAuthorizationRequirement
method UserPermissionRequirement (line 16) | public UserPermissionRequirement(PermissionKind requiredPermission, bo...
FILE: Jellyfin.Api/BaseJellyfinApiController.cs
class BaseJellyfinApiController (line 12) | [ApiController]
method Ok (line 26) | protected ActionResult<IEnumerable<T>> Ok<T>(IEnumerable<T>? value)
method Ok (line 35) | protected ActionResult<T> Ok<T>(T value)
FILE: Jellyfin.Api/Constants/AuthenticationSchemes.cs
class AuthenticationSchemes (line 6) | public static class AuthenticationSchemes
FILE: Jellyfin.Api/Constants/InternalClaimTypes.cs
class InternalClaimTypes (line 6) | public static class InternalClaimTypes
FILE: Jellyfin.Api/Constants/UserRoles.cs
class UserRoles (line 6) | public static class UserRoles
FILE: Jellyfin.Api/Controllers/ActivityLogController.cs
class ActivityLogController (line 20) | [Route("System/ActivityLog")]
method ActivityLogController (line 30) | public ActivityLogController(IActivityManager activityManager)
method GetLogEntries (line 54) | [HttpGet("Entries")]
method GetOrderBy (line 92) | private static (ActivityLogSortBy SortBy, SortOrder SortOrder)[] GetOr...
FILE: Jellyfin.Api/Controllers/ApiKeyController.cs
class ApiKeyController (line 16) | [Route("Auth")]
method ApiKeyController (line 25) | public ApiKeyController(IAuthenticationManager authenticationManager)
method GetKeys (line 35) | [HttpGet("Keys")]
method CreateKey (line 51) | [HttpPost("Keys")]
method RevokeKey (line 67) | [HttpDelete("Keys/{key}")]
FILE: Jellyfin.Api/Controllers/ArtistsController.cs
class ArtistsController (line 26) | [Route("Artists")]
method ArtistsController (line 40) | public ArtistsController(
method GetArtists (line 87) | [HttpGet]
method GetAlbumArtists (line 258) | [HttpGet("AlbumArtists")]
method GetArtistByName (line 399) | [HttpGet("{name}")]
FILE: Jellyfin.Api/Controllers/AudioController.cs
class AudioController (line 19) | public class AudioController : BaseJellyfinApiController
method AudioController (line 29) | public AudioController(AudioHelper audioHelper)
method GetAudioStream (line 88) | [HttpGet("{itemId}/stream", Name = "GetAudioStream")]
method GetAudioStreamByContainer (line 252) | [HttpGet("{itemId}/stream.{container}", Name = "GetAudioStreamByContai...
FILE: Jellyfin.Api/Controllers/BackupController.cs
class BackupController (line 18) | [Authorize(Policy = Policies.RequiresElevation)]
method BackupController (line 29) | public BackupController(IBackupService backupService, IApplicationPath...
method CreateBackup (line 42) | [HttpPost("Create")]
method StartRestoreBackup (line 57) | [HttpPost("Restore")]
method ListBackups (line 79) | [HttpGet]
method GetBackup (line 96) | [HttpGet("Manifest")]
method SanitizePath (line 119) | [NonAction]
FILE: Jellyfin.Api/Controllers/BrandingController.cs
class BrandingController (line 12) | public class BrandingController : BaseJellyfinApiController
method BrandingController (line 20) | public BrandingController(IServerConfigurationManager serverConfigurat...
method GetBrandingOptions (line 30) | [HttpGet("Configuration")]
method GetBrandingCss (line 55) | [HttpGet("Css")]
FILE: Jellyfin.Api/Controllers/ChannelsController.cs
class ChannelsController (line 27) | [Authorize]
method ChannelsController (line 38) | public ChannelsController(IChannelManager channelManager, IUserManager...
method GetChannels (line 55) | [HttpGet]
method GetAllChannelFeatures (line 82) | [HttpGet("Features")]
method GetChannelFeatures (line 95) | [HttpGet("{channelId}/Features")]
method GetChannelItems (line 118) | [HttpGet("{channelId}/Items")]
method GetLatestChannelItems (line 164) | [HttpGet("Items/Latest")]
FILE: Jellyfin.Api/Controllers/ClientLogController.cs
class ClientLogController (line 17) | [Authorize]
method ClientLogController (line 29) | public ClientLogController(
method LogFile (line 44) | [HttpPost("Document")]
method GetRequestInformation (line 69) | private (string ClientName, string ClientVersion) GetRequestInformation()
FILE: Jellyfin.Api/Controllers/CollectionController.cs
class CollectionController (line 20) | [Route("Collections")]
method CollectionController (line 32) | public CollectionController(
method CreateCollection (line 49) | [HttpPost]
method AddToCollection (line 85) | [HttpPost("{collectionId}/Items")]
method RemoveFromCollection (line 102) | [HttpDelete("{collectionId}/Items")]
FILE: Jellyfin.Api/Controllers/ConfigurationController.cs
class ConfigurationController (line 21) | [Route("System")]
method ConfigurationController (line 35) | public ConfigurationController(
method GetConfiguration (line 48) | [HttpGet("Configuration")]
method UpdateConfiguration (line 61) | [HttpPost("Configuration")]
method GetNamedConfiguration (line 76) | [HttpGet("Configuration/{key}")]
method UpdateNamedConfiguration (line 91) | [HttpPost("Configuration/{key}")]
method GetDefaultMetadataOptions (line 113) | [HttpGet("Configuration/MetadataOptions/Default")]
method UpdateBrandingConfiguration (line 127) | [HttpPost("Configuration/Branding")]
FILE: Jellyfin.Api/Controllers/DashboardController.cs
class DashboardController (line 22) | [Route("")]
method DashboardController (line 33) | public DashboardController(
method GetConfigurationPages (line 48) | [HttpGet("web/ConfigurationPages")]
method GetDashboardConfigurationPage (line 72) | [HttpGet("web/ConfigurationPage")]
method GetConfigPages (line 96) | private IEnumerable<ConfigurationPageInfo> GetConfigPages(LocalPlugin ...
method GetPluginPages (line 101) | private IEnumerable<Tuple<PluginPageInfo, IPlugin>> GetPluginPages(Loc...
method GetPluginPages (line 111) | private IEnumerable<Tuple<PluginPageInfo, IPlugin>> GetPluginPages()
FILE: Jellyfin.Api/Controllers/DevicesController.cs
class DevicesController (line 21) | [Authorize(Policy = Policies.RequiresElevation)]
method DevicesController (line 32) | public DevicesController(
method GetDevices (line 46) | [HttpGet]
method GetDeviceInfo (line 61) | [HttpGet("Info")]
method GetDeviceOptions (line 82) | [HttpGet("Options")]
method UpdateDeviceOptions (line 103) | [HttpPost("Options")]
method DeleteDevice (line 120) | [HttpDelete]
FILE: Jellyfin.Api/Controllers/DisplayPreferencesController.cs
class DisplayPreferencesController (line 22) | [Authorize]
method DisplayPreferencesController (line 33) | public DisplayPreferencesController(IDisplayPreferencesManager display...
method GetDisplayPreferences (line 47) | [HttpGet("{displayPreferencesId}")]
method UpdateDisplayPreferences (line 111) | [HttpPost("{displayPreferencesId}")]
FILE: Jellyfin.Api/Controllers/DynamicHlsController.cs
class DynamicHlsController (line 39) | [Route("")]
method DynamicHlsController (line 78) | public DynamicHlsController(
method GetLiveHlsStream (line 164) | [HttpGet("Videos/{itemId}/live.m3u8")]
method GetMasterHlsVideoPlaylist (line 404) | [HttpGet("Videos/{itemId}/master.m3u8")]
method GetMasterHlsAudioPlaylist (line 577) | [HttpGet("Audio/{itemId}/master.m3u8")]
method GetVariantHlsVideoPlaylist (line 745) | [HttpGet("Videos/{itemId}/main.m3u8")]
method GetVariantHlsAudioPlaylist (line 914) | [HttpGet("Audio/{itemId}/main.m3u8")]
method GetHlsVideoSegment (line 1086) | [HttpGet("Videos/{itemId}/hls1/{playlistId}/{segmentId}.{container}")]
method GetHlsAudioSegment (line 1268) | [HttpGet("Audio/{itemId}/hls1/{playlistId}/{segmentId}.{container}")]
method GetVariantPlaylistInternal (line 1387) | private async Task<ActionResult> GetVariantPlaylistInternal(StreamingR...
method GetDynamicSegment (line 1427) | private async Task<ActionResult> GetDynamicSegment(StreamingRequestDto...
method GetSegmentLengths (line 1549) | private static double[] GetSegmentLengths(StreamState state)
method GetSegmentLengthsInternal (line 1552) | internal static double[] GetSegmentLengthsInternal(long runtimeTicks, ...
method GetCommandLineArguments (line 1573) | private string GetCommandLineArguments(string outputPath, StreamState ...
method GetAudioArguments (line 1658) | private string GetAudioArguments(StreamState state)
method GetVideoArguments (line 1782) | private string GetVideoArguments(StreamState state, int startNumber, b...
method GetSegmentPath (line 1901) | private string GetSegmentPath(StreamState state, string playlist, int ...
method GetSegmentResult (line 1909) | private async Task<ActionResult> GetSegmentResult(
method GetSegmentResult (line 1984) | private ActionResult GetSegmentResult(StreamState state, string segmen...
method GetCurrentTranscodingIndex (line 2003) | private int? GetCurrentTranscodingIndex(string playlist, string segmen...
method GetLastTranscodingFile (line 2026) | private static FileSystemMetadata? GetLastTranscodingFile(string playl...
method DeleteLastFile (line 2044) | private async Task DeleteLastFile(string playlistPath, string segmentE...
method DeleteFile (line 2056) | private async Task DeleteFile(string path, int retryCount)
FILE: Jellyfin.Api/Controllers/EnvironmentController.cs
class EnvironmentController (line 20) | [Authorize(Policy = Policies.FirstTimeSetupOrElevated)]
method EnvironmentController (line 34) | public EnvironmentController(IFileSystem fileSystem, ILogger<Environme...
method GetDirectoryContents (line 48) | [HttpGet("DirectoryContents")]
method ValidatePath (line 76) | [HttpPost("ValidatePath")]
method GetDrives (line 135) | [HttpGet("Drives")]
method GetParentPath (line 147) | [HttpGet("ParentPath")]
method GetDefaultDirectoryBrowser (line 176) | [HttpGet("DefaultDirectoryBrowser")]
FILE: Jellyfin.Api/Controllers/FilterController.cs
class FilterController (line 21) | [Route("")]
method FilterController (line 33) | public FilterController(ILibraryManager libraryManager, IUserManager u...
method GetQueryFiltersLegacy (line 48) | [HttpGet("Items/Filters")]
method GetQueryFilters (line 135) | [HttpGet("Items/Filters2")]
FILE: Jellyfin.Api/Controllers/GenresController.cs
class GenresController (line 27) | [Authorize]
method GenresController (line 40) | public GenresController(
method GetGenres (line 73) | [HttpGet]
method GetGenre (line 156) | [HttpGet("{genreName}")]
method GetItemFromSlugName (line 182) | private T? GetItemFromSlugName<T>(ILibraryManager libraryManager, stri...
FILE: Jellyfin.Api/Controllers/HlsSegmentController.cs
class HlsSegmentController (line 22) | [Route("")]
method HlsSegmentController (line 35) | public HlsSegmentController(
method GetHlsAudioSegmentLegacy (line 54) | [HttpGet("Audio/{itemId}/hls/{segmentId}/stream.mp3", Name = "GetHlsAu...
method GetHlsPlaylistLegacy (line 81) | [HttpGet("Videos/{itemId}/hls/{playlistId}/stream.m3u8")]
method StopEncodingProcess (line 108) | [HttpDelete("Videos/ActiveEncodings")]
method GetHlsVideoSegmentLegacy (line 131) | [HttpGet("Videos/{itemId}/hls/{playlistId}/{segmentId}.{segmentContain...
method GetFileResult (line 175) | private ActionResult GetFileResult(string path, string playlistPath)
FILE: Jellyfin.Api/Controllers/ImageController.cs
class ImageController (line 42) | [Route("")]
method ImageController (line 65) | public ImageController(
method GetFromBase64Stream (line 85) | private static CryptoStream GetFromBase64Stream(Stream inputStream)
method PostUserImage (line 96) | [HttpPost("UserImage")]
method PostUserImageLegacy (line 153) | [HttpPost("Users/{userId}/Images/{imageType}")]
method PostUserImageByIndexLegacy (line 176) | [HttpPost("Users/{userId}/Images/{imageType}/{index}")]
method DeleteUserImage (line 199) | [HttpDelete("UserImage")]
method DeleteUserImageLegacy (line 245) | [HttpDelete("Users/{userId}/Images/{imageType}")]
method DeleteUserImageByIndexLegacy (line 268) | [HttpDelete("Users/{userId}/Images/{imageType}/{index}")]
method DeleteItemImage (line 291) | [HttpDelete("Items/{itemId}/Images/{imageType}")]
method DeleteItemImageByIndex (line 319) | [HttpDelete("Items/{itemId}/Images/{imageType}/{imageIndex}")]
method SetItemImage (line 346) | [HttpPost("Items/{itemId}/Images/{imageType}")]
method SetItemImageByIndex (line 389) | [HttpPost("Items/{itemId}/Images/{imageType}/{imageIndex}")]
method UpdateItemImageIndex (line 434) | [HttpPost("Items/{itemId}/Images/{imageType}/{imageIndex}/Index")]
method GetItemImageInfos (line 461) | [HttpGet("Items/{itemId}/Images")]
method GetItemImage (line 546) | [HttpGet("Items/{itemId}/Images/{imageType}")]
method GetItemImageByIndex (line 624) | [HttpGet("Items/{itemId}/Images/{imageType}/{imageIndex}")]
method GetItemImage2 (line 702) | [HttpGet("Items/{itemId}/Images/{imageType}/{imageIndex}/{tag}/{format...
method GetArtistImage (line 780) | [HttpGet("Artists/{name}/Images/{imageType}/{imageIndex}")]
method GetGenreImage (line 858) | [HttpGet("Genres/{name}/Images/{imageType}")]
method GetGenreImageByIndex (line 936) | [HttpGet("Genres/{name}/Images/{imageType}/{imageIndex}")]
method GetMusicGenreImage (line 1014) | [HttpGet("MusicGenres/{name}/Images/{imageType}")]
method GetMusicGenreImageByIndex (line 1092) | [HttpGet("MusicGenres/{name}/Images/{imageType}/{imageIndex}")]
method GetPersonImage (line 1170) | [HttpGet("Persons/{name}/Images/{imageType}")]
method GetPersonImageByIndex (line 1248) | [HttpGet("Persons/{name}/Images/{imageType}/{imageIndex}")]
method GetStudioImage (line 1326) | [HttpGet("Studios/{name}/Images/{imageType}")]
method GetStudioImageByIndex (line 1404) | [HttpGet("Studios/{name}/Images/{imageType}/{imageIndex}")]
method GetUserImage (line 1469) | [HttpGet("UserImage")]
method GetUserImageLegacy (line 1548) | [HttpGet("Users/{userId}/Images/{imageType}")]
method GetUserImageByIndexLegacy (line 1604) | [HttpGet("Users/{userId}/Images/{imageType}/{imageIndex}")]
method GetSplashscreen (line 1641) | [HttpGet("Branding/Splashscreen")]
method UploadCustomSplashscreen (line 1714) | [HttpPost("Branding/Splashscreen")]
method DeleteCustomSplashscreen (line 1751) | [HttpDelete("Branding/Splashscreen")]
method GetImageInfo (line 1768) | private ImageInfo? GetImageInfo(BaseItem item, ItemImageInfo info, int...
method GetImageInternal (line 1819) | private async Task<ActionResult> GetImageInternal(
method GetOutputFormats (line 1919) | private ImageFormat[] GetOutputFormats(ImageFormat? format)
method GetClientSupportedFormats (line 1929) | private ImageFormat[] GetClientSupportedFormats()
method SupportsFormat (line 1975) | private bool SupportsFormat(IReadOnlyCollection<string> requestAcceptT...
method GetImageResult (line 1992) | private async Task<ActionResult> GetImageResult(
method TryGetImageExtensionFromContentType (line 2051) | internal static bool TryGetImageExtensionFromContentType(string? conte...
FILE: Jellyfin.Api/Controllers/InstantMixController.cs
class InstantMixController (line 27) | [Route("")]
method InstantMixController (line 43) | public InstantMixController(
method GetInstantMixFromSong (line 69) | [HttpGet("Songs/{itemId}/InstantMix")]
method GetInstantMixFromAlbum (line 112) | [HttpGet("Albums/{itemId}/InstantMix")]
method GetInstantMixFromPlaylist (line 155) | [HttpGet("Playlists/{itemId}/InstantMix")]
method GetInstantMixFromMusicGenreByName (line 197) | [HttpGet("MusicGenres/{name}/InstantMix")]
method GetInstantMixFromArtists (line 233) | [HttpGet("Artists/{itemId}/InstantMix")]
method GetInstantMixFromItem (line 276) | [HttpGet("Items/{itemId}/InstantMix")]
method GetInstantMixFromArtists2 (line 319) | [HttpGet("Artists/InstantMix")]
method GetInstantMixFromMusicGenreById (line 358) | [HttpGet("MusicGenres/InstantMix")]
method GetResult (line 387) | private QueryResult<BaseItemDto> GetResult(IReadOnlyList<BaseItem> ite...
FILE: Jellyfin.Api/Controllers/ItemLookupController.cs
class ItemLookupController (line 28) | [Route("")]
method ItemLookupController (line 44) | public ItemLookupController(
method GetExternalIdInfos (line 63) | [HttpGet("Items/{itemId}/ExternalIdInfos")]
method GetMovieRemoteSearchResults (line 87) | [HttpPost("Items/RemoteSearch/Movie")]
method GetTrailerRemoteSearchResults (line 104) | [HttpPost("Items/RemoteSearch/Trailer")]
method GetMusicVideoRemoteSearchResults (line 121) | [HttpPost("Items/RemoteSearch/MusicVideo")]
method GetSeriesRemoteSearchResults (line 138) | [HttpPost("Items/RemoteSearch/Series")]
method GetBoxSetRemoteSearchResults (line 155) | [HttpPost("Items/RemoteSearch/BoxSet")]
method GetMusicArtistRemoteSearchResults (line 172) | [HttpPost("Items/RemoteSearch/MusicArtist")]
method GetMusicAlbumRemoteSearchResults (line 189) | [HttpPost("Items/RemoteSearch/MusicAlbum")]
method GetPersonRemoteSearchResults (line 206) | [HttpPost("Items/RemoteSearch/Person")]
method GetBookRemoteSearchResults (line 224) | [HttpPost("Items/RemoteSearch/Book")]
method ApplySearchCriteria (line 244) | [HttpPost("Items/RemoteSearch/Apply/{itemId}")]
FILE: Jellyfin.Api/Controllers/ItemRefreshController.cs
class ItemRefreshController (line 21) | [Route("Items")]
method ItemRefreshController (line 35) | public ItemRefreshController(
method RefreshItem (line 57) | [HttpPost("{itemId}/Refresh")]
FILE: Jellyfin.Api/Controllers/ItemUpdateController.cs
class ItemUpdateController (line 32) | [Route("")]
method ItemUpdateController (line 50) | public ItemUpdateController(
method UpdateItem (line 72) | [HttpPost("Items/{itemId}")]
method GetMetadataEditorInfo (line 145) | [HttpGet("Items/{itemId}/MetadataEditor")]
method UpdateItemContentType (line 207) | [HttpPost("Items/{itemId}/ContentType")]
method UpdateItem (line 239) | private async Task UpdateItem(BaseItemDto request, BaseItem item)
method GetSeriesStatus (line 459) | private SeriesStatus? GetSeriesStatus(BaseItemDto item)
method NormalizeDateTime (line 469) | private DateTime NormalizeDateTime(DateTime val)
method GetContentTypeOptions (line 474) | private List<NameValuePair> GetContentTypeOptions(bool isForItem)
FILE: Jellyfin.Api/Controllers/ItemsController.cs
class ItemsController (line 30) | [Route("")]
method ItemsController (line 52) | public ItemsController(
method GetItems (line 160) | [HttpGet("Items")]
method GetItemsByUserIdLegacy (line 593) | [HttpGet("Users/{userId}/Items")]
method GetResumeItems (line 791) | [HttpGet("UserItems/Resume")]
method GetResumeItemsLegacy (line 890) | [HttpGet("Users/{userId}/Items/Resume")]
method GetItemUserData (line 935) | [HttpGet("UserItems/{itemId}/UserData")]
method GetItemUserDataLegacy (line 971) | [HttpGet("Users/{userId}/Items/{itemId}/UserData")]
method UpdateItemUserData (line 990) | [HttpPost("UserItems/{itemId}/UserData")]
method UpdateItemUserDataLegacy (line 1030) | [HttpPost("Users/{userId}/Items/{itemId}/UserData")]
FILE: Jellyfin.Api/Controllers/LibraryController.cs
class LibraryController (line 46) | [Route("")]
method LibraryController (line 71) | public LibraryController(
method GetFile (line 100) | [HttpGet("Items/{itemId}/File")]
method GetCriticReviews (line 121) | [HttpGet("Items/{itemId}/CriticReviews")]
method GetThemeSongs (line 141) | [HttpGet("Items/{itemId}/ThemeSongs")]
method GetThemeVideos (line 215) | [HttpGet("Items/{itemId}/ThemeVideos")]
method GetThemeMedia (line 288) | [HttpGet("Items/{itemId}/ThemeMedia")]
method RefreshLibrary (line 331) | [HttpPost("Library/Refresh")]
method DeleteItem (line 356) | [HttpDelete("Items/{itemId}")]
method DeleteItems (line 400) | [HttpDelete("Items")]
method GetItemCounts (line 447) | [HttpGet("Items/Counts")]
method GetAncestors (line 482) | [HttpGet("Items/{itemId}/Ancestors")]
method GetPhysicalPaths (line 527) | [HttpGet("Library/PhysicalPaths")]
method GetMediaFolders (line 542) | [HttpGet("Library/MediaFolders")]
method PostUpdatedSeries (line 571) | [HttpPost("Library/Series/Added", Name = "PostAddedSeries")]
method PostUpdatedMovies (line 601) | [HttpPost("Library/Movies/Added", Name = "PostAddedMovies")]
method PostUpdatedMedia (line 643) | [HttpPost("Library/Media/Updated")]
method GetDownload (line 664) | [HttpGet("Items/{itemId}/Download")]
method GetSimilarItems (line 728) | [HttpGet("Artists/{itemId}/Similar", Name = "GetSimilarArtists")]
method GetLibraryOptionsInfo (line 826) | [HttpGet("Libraries/AvailableOptions")]
method GetCount (line 940) | private int GetCount(BaseItemKind itemKind, User? user, bool? isFavorite)
method TranslateParentItem (line 958) | private BaseItem? TranslateParentItem(BaseItem item, User user)
method LogDownloadAsync (line 966) | private async Task LogDownloadAsync(BaseItem item, User user)
method GetRepresentativeItemTypes (line 985) | private static string[] GetRepresentativeItemTypes(CollectionType? con...
method IsSaverEnabledByDefault (line 1002) | private bool IsSaverEnabledByDefault(string name, string[] itemTypes, ...
method IsMetadataFetcherEnabledByDefault (line 1016) | private bool IsMetadataFetcherEnabledByDefault(string name, string typ...
method IsImageFetcherEnabledByDefault (line 1036) | private bool IsImageFetcherEnabledByDefault(string name, string type, ...
FILE: Jellyfin.Api/Controllers/LibraryStructureController.cs
class LibraryStructureController (line 29) | [Route("Library/VirtualFolders")]
method LibraryStructureController (line 43) | public LibraryStructureController(
method GetVirtualFolders (line 58) | [HttpGet]
method AddVirtualFolder (line 75) | [HttpPost]
method RemoveVirtualFolder (line 104) | [HttpDelete]
method RenameVirtualFolder (line 127) | [HttpPost("Name")]
method AddMediaPath (line 223) | [HttpPost("Paths")]
method UpdateMediaPath (line 266) | [HttpPost("Paths/Update")]
method RemoveMediaPath (line 288) | [HttpDelete("Paths")]
method UpdateLibraryOptions (line 333) | [HttpPost("LibraryOptions")]
FILE: Jellyfin.Api/Controllers/LiveTvController.cs
class LiveTvController (line 44) | public class LiveTvController : BaseJellyfinApiController
method LiveTvController (line 74) | public LiveTvController(
method GetLiveTvInfo (line 109) | [HttpGet("Info")]
method GetLiveTvChannels (line 145) | [HttpGet("Channels")]
method GetChannel (line 225) | [HttpGet("Channels/{channelId}")]
method GetRecordings (line 272) | [HttpGet("Recordings")]
method GetRecordingsSeries (line 343) | [HttpGet("Recordings/Series")]
method GetRecordingGroups (line 386) | [HttpGet("Recordings/Groups")]
method GetRecordingFolders (line 402) | [HttpGet("Recordings/Folders")]
method GetRecording (line 426) | [HttpGet("Recordings/{recordingId}")]
method ResetTuner (line 455) | [HttpPost("Tuners/{tunerId}/Reset")]
method GetTimer (line 472) | [HttpGet("Timers/{timerId}")]
method GetDefaultTimer (line 488) | [HttpGet("Timers/Defaults")]
method GetTimers (line 508) | [HttpGet("Timers")]
method GetLiveTvPrograms (line 562) | [HttpGet("Programs")]
method GetPrograms (line 646) | [HttpPost("Programs")]
method GetRecommendedPrograms (line 714) | [HttpGet("Programs/Recommended")]
method GetProgram (line 768) | [HttpGet("Programs/{programId}")]
method DeleteRecording (line 790) | [HttpDelete("Recordings/{recordingId}")]
method CancelTimer (line 816) | [HttpDelete("Timers/{timerId}")]
method UpdateTimer (line 832) | [HttpPost("Timers/{timerId}")]
method CreateTimer (line 848) | [HttpPost("Timers")]
method GetSeriesTimer (line 864) | [HttpGet("SeriesTimers/{timerId}")]
method GetSeriesTimers (line 886) | [HttpGet("SeriesTimers")]
method CancelSeriesTimer (line 906) | [HttpDelete("SeriesTimers/{timerId}")]
method UpdateSeriesTimer (line 922) | [HttpPost("SeriesTimers/{timerId}")]
method CreateSeriesTimer (line 938) | [HttpPost("SeriesTimers")]
method GetRecordingGroup (line 952) | [HttpGet("Recordings/Groups/{groupId}")]
method GetGuideInfo (line 966) | [HttpGet("GuideInfo")]
method AddTunerHost (line 978) | [HttpPost("TunerHosts")]
method DeleteTunerHost (line 990) | [HttpDelete("TunerHosts")]
method GetDefaultListingProvider (line 1006) | [HttpGet("ListingProviders/Default")]
method AddListingProvider (line 1023) | [HttpPost("ListingProviders")]
method DeleteListingProvider (line 1049) | [HttpDelete("ListingProviders")]
method GetLineups (line 1067) | [HttpGet("ListingProviders/Lineups")]
method GetSchedulesDirectCountries (line 1082) | [HttpGet("ListingProviders/SchedulesDirect/Countries")]
method GetChannelMappingOptions (line 1103) | [HttpGet("ChannelMappingOptions")]
method SetChannelMapping (line 1115) | [HttpPost("ChannelMappings")]
method GetTunerHostTypes (line 1126) | [HttpGet("TunerHosts/Types")]
method DiscoverTuners (line 1138) | [HttpGet("Tuners/Discvover", Name = "DiscvoverTuners")]
method GetLiveRecordingFile (line 1155) | [HttpGet("LiveRecordings/{recordingId}/stream")]
method GetLiveStreamFile (line 1182) | [HttpGet("LiveStreamFiles/{streamId}/stream.{container}")]
FILE: Jellyfin.Api/Controllers/LocalizationController.cs
class LocalizationController (line 16) | [Authorize(Policy = Policies.FirstTimeSetupOrDefault)]
method LocalizationController (line 25) | public LocalizationController(ILocalizationManager localization)
method GetCultures (line 35) | [HttpGet("Cultures")]
method GetCountries (line 54) | [HttpGet("Countries")]
method GetParentalRatings (line 66) | [HttpGet("ParentalRatings")]
method GetLocalizationOptions (line 78) | [HttpGet("Options")]
FILE: Jellyfin.Api/Controllers/LyricsController.cs
class LyricsController (line 29) | [Route("")]
method LyricsController (line 46) | public LyricsController(
method GetLyrics (line 67) | [HttpGet("Audio/{itemId}/Lyrics")]
method UploadLyrics (line 97) | [HttpPost("Audio/{itemId}/Lyrics")]
method DeleteLyrics (line 152) | [HttpDelete("Audio/{itemId}/Lyrics")]
method SearchRemoteLyrics (line 176) | [HttpGet("Audio/{itemId}/RemoteSearch/Lyrics")]
method DownloadRemoteLyrics (line 200) | [HttpPost("Audio/{itemId}/RemoteSearch/Lyrics/{lyricId}")]
method GetRemoteLyrics (line 231) | [HttpGet("Providers/Lyrics/{lyricId}")]
FILE: Jellyfin.Api/Controllers/MediaInfoController.cs
class MediaInfoController (line 28) | [Route("")]
method MediaInfoController (line 48) | public MediaInfoController(
method GetPlaybackInfo (line 72) | [HttpGet("Items/{itemId}/PlaybackInfo")]
method GetPostedPlaybackInfo (line 116) | [HttpPost("Items/{itemId}/PlaybackInfo")]
method OpenLiveStream (line 269) | [HttpPost("LiveStreams/Open")]
method CloseLiveStream (line 314) | [HttpPost("LiveStreams/Close")]
method GetBitrateTestBytes (line 328) | [HttpGet("Playback/BitrateTest")]
FILE: Jellyfin.Api/Controllers/MediaSegmentsController.cs
class MediaSegmentsController (line 22) | [Authorize]
method MediaSegmentsController (line 33) | public MediaSegmentsController(IMediaSegmentManager mediaSegmentManage...
method GetItemSegments (line 45) | [HttpGet("{itemId}")]
FILE: Jellyfin.Api/Controllers/MoviesController.cs
class MoviesController (line 28) | [Authorize]
method MoviesController (line 43) | public MoviesController(
method GetMovieRecommendations (line 65) | [HttpGet("Recommendations")]
method GetWithDirector (line 178) | private IEnumerable<RecommendationDto> GetWithDirector(
method GetWithActor (line 224) | private IEnumerable<RecommendationDto> GetWithActor(User? user, IEnume...
method GetSimilarTo (line 263) | private IEnumerable<RecommendationDto> GetSimilarTo(User? user, IEnume...
method GetActors (line 298) | private IEnumerable<string> GetActors(IEnumerable<BaseItem> items)
method GetDirectors (line 313) | private IEnumerable<string> GetDirectors(IEnumerable<BaseItem> items)
FILE: Jellyfin.Api/Controllers/MusicGenresController.cs
class MusicGenresController (line 27) | [Authorize]
method MusicGenresController (line 40) | public MusicGenresController(
method GetMusicGenres (line 73) | [HttpGet]
method GetMusicGenre (line 145) | [HttpGet("{genreName}")]
method GetItemFromSlugName (line 178) | private T? GetItemFromSlugName<T>(ILibraryManager libraryManager, stri...
FILE: Jellyfin.Api/Controllers/PackageController.cs
class PackageController (line 20) | [Route("")]
method PackageController (line 32) | public PackageController(IInstallationManager installationManager, ISe...
method GetPackageInfo (line 45) | [HttpGet("Packages/{name}")]
method GetPackages (line 71) | [HttpGet("Packages")]
method InstallPackage (line 90) | [HttpPost("Packages/Installed/{name}")]
method CancelPackageInstallation (line 129) | [HttpDelete("Packages/Installing/{packageId}")]
method GetRepositories (line 143) | [HttpGet("Repositories")]
method SetRepositories (line 156) | [HttpPost("Repositories")]
FILE: Jellyfin.Api/Controllers/PersonsController.cs
class PersonsController (line 24) | [Authorize]
method PersonsController (line 37) | public PersonsController(
method GetPersons (line 65) | [HttpGet]
method GetPerson (line 117) | [HttpGet("{name}")]
FILE: Jellyfin.Api/Controllers/PlaylistsController.cs
class PlaylistsController (line 31) | [Authorize]
method PlaylistsController (line 46) | public PlaylistsController(
method CreatePlaylist (line 75) | [HttpPost]
method UpdatePlaylist (line 116) | [HttpPost("{playlistId}")]
method GetPlaylist (line 162) | [HttpGet("{playlistId}")]
method GetPlaylistUsers (line 194) | [HttpGet("{playlistId}/Users")]
method GetPlaylistUser (line 225) | [HttpGet("{playlistId}/Users/{userId}")]
method UpdatePlaylistUser (line 276) | [HttpPost("{playlistId}/Users/{userId}")]
method RemoveUserFromPlaylist (line 322) | [HttpDelete("{playlistId}/Users/{userId}")]
method AddItemToPlaylist (line 368) | [HttpPost("{playlistId}/Items")]
method MoveItem (line 407) | [HttpPost("{playlistId}/Items/{itemId}/Move/{newIndex}")]
method RemoveItemFromPlaylist (line 445) | [HttpDelete("{playlistId}/Items")]
method GetPlaylistItems (line 508) | [HttpGet("{playlistId}/Items")]
FILE: Jellyfin.Api/Controllers/PlaystateController.cs
class PlaystateController (line 26) | [Route("")]
method PlaystateController (line 46) | public PlaystateController(
method MarkPlayedItem (line 72) | [HttpPost("UserPlayedItems/{itemId}")]
method MarkPlayedItemLegacy (line 119) | [HttpPost("Users/{userId}/PlayedItems/{itemId}")]
method MarkUnplayedItem (line 138) | [HttpDelete("UserPlayedItems/{itemId}")]
method MarkUnplayedItemLegacy (line 183) | [HttpDelete("Users/{userId}/PlayedItems/{itemId}")]
method ReportPlaybackStart (line 199) | [HttpPost("Sessions/Playing")]
method ReportPlaybackProgress (line 215) | [HttpPost("Sessions/Playing/Progress")]
method PingPlaybackSession (line 231) | [HttpPost("Sessions/Playing/Ping")]
method ReportPlaybackStopped (line 245) | [HttpPost("Sessions/Playing/Stopped")]
method OnPlaybackStart (line 273) | [HttpPost("PlayingItems/{itemId}")]
method OnPlaybackStartLegacy (line 318) | [HttpPost("Users/{userId}/PlayingItems/{itemId}")]
method OnPlaybackProgress (line 352) | [HttpPost("PlayingItems/{itemId}/Progress")]
method OnPlaybackProgressLegacy (line 409) | [HttpPost("Users/{userId}/PlayingItems/{itemId}/Progress")]
method OnPlaybackStopped (line 441) | [HttpDelete("PlayingItems/{itemId}")]
method OnPlaybackStoppedLegacy (line 485) | [HttpDelete("Users/{userId}/PlayingItems/{itemId}")]
method UpdatePlayedStatus (line 508) | private UserItemDataDto? UpdatePlayedStatus(User user, BaseItem item, ...
method ValidatePlayMethod (line 522) | private PlayMethod ValidatePlayMethod(PlayMethod method, string? playS...
FILE: Jellyfin.Api/Controllers/PluginsController.cs
class PluginsController (line 25) | [Authorize(Policy = Policies.RequiresElevation)]
method PluginsController (line 37) | public PluginsController(
method GetPlugins (line 51) | [HttpGet]
method EnablePlugin (line 68) | [HttpPost("{pluginId}/{version}/Enable")]
method DisablePlugin (line 91) | [HttpPost("{pluginId}/{version}/Disable")]
method UninstallPluginByVersion (line 114) | [HttpDelete("{pluginId}/{version}")]
method UninstallPlugin (line 136) | [HttpDelete("{pluginId}")]
method GetPluginConfiguration (line 164) | [HttpGet("{pluginId}/Configuration")]
method UpdatePluginConfiguration (line 188) | [HttpPost("{pluginId}/Configuration")]
method GetPluginImage (line 217) | [HttpGet("{pluginId}/{version}/Image")]
method GetPluginManifest (line 249) | [HttpPost("{pluginId}/Manifest")]
FILE: Jellyfin.Api/Controllers/QuickConnectController.cs
class QuickConnectController (line 19) | public class QuickConnectController : BaseJellyfinApiController
method QuickConnectController (line 29) | public QuickConnectController(IQuickConnect quickConnect, IAuthorizati...
method GetQuickConnectEnabled (line 40) | [HttpGet("Enabled")]
method InitiateQuickConnect (line 53) | [HttpPost("Initiate")]
method GetQuickConnectState (line 76) | [HttpGet("Connect")]
method AuthorizeQuickConnect (line 103) | [HttpPost("Authorize")]
FILE: Jellyfin.Api/Controllers/RemoteImageController.cs
class RemoteImageController (line 27) | [Route("")]
method RemoteImageController (line 40) | public RemoteImageController(
method GetRemoteImages (line 62) | [HttpGet("Items/{itemId}/RemoteImages")]
method GetRemoteImageProviders (line 127) | [HttpGet("Items/{itemId}/RemoteImages/Providers")]
method DownloadRemoteImage (line 151) | [HttpPost("Items/{itemId}/RemoteImages/Download")]
method GetFullCachePath (line 178) | private string GetFullCachePath(string filename)
FILE: Jellyfin.Api/Controllers/ScheduledTasksController.cs
class ScheduledTasksController (line 17) | [Authorize(Policy = Policies.RequiresElevation)]
method ScheduledTasksController (line 26) | public ScheduledTasksController(ITaskManager taskManager)
method GetTasks (line 38) | [HttpGet]
method GetTask (line 72) | [HttpGet("{taskId}")]
method StartTask (line 95) | [HttpPost("Running/{taskId}")]
method StopTask (line 119) | [HttpDelete("Running/{taskId}")]
method UpdateTask (line 144) | [HttpPost("{taskId}/Triggers")]
FILE: Jellyfin.Api/Controllers/SearchController.cs
class SearchController (line 28) | [Route("Search/Hints")]
method SearchController (line 44) | public SearchController(
method GetSearchHints (line 79) | [HttpGet]
method GetSearchHintResult (line 134) | private SearchHint GetSearchHintResult(SearchHintInfo hintInfo)
method SetThumbImageInfo (line 221) | private void SetThumbImageInfo(SearchHint hint, BaseItem item)
method SetBackdropImageInfo (line 244) | private void SetBackdropImageInfo(SearchHint hint, BaseItem item)
method GetParentWithImage (line 261) | private T? GetParentWithImage<T>(BaseItem item, ImageType type)
FILE: Jellyfin.Api/Controllers/SessionController.cs
class SessionController (line 25) | [Route("")]
method SessionController (line 36) | public SessionController(
method GetSessions (line 52) | [HttpGet("Sessions")]
method DisplayContent (line 80) | [HttpPost("Sessions/{sessionId}/Viewing")]
method Play (line 119) | [HttpPost("Sessions/{sessionId}/Playing")]
method SendPlaystateCommand (line 162) | [HttpPost("Sessions/{sessionId}/Playing/{command}")]
method SendSystemCommand (line 193) | [HttpPost("Sessions/{sessionId}/System/{command}")]
method SendGeneralCommand (line 219) | [HttpPost("Sessions/{sessionId}/Command/{command}")]
method SendFullGeneralCommand (line 247) | [HttpPost("Sessions/{sessionId}/Command")]
method SendMessageCommand (line 277) | [HttpPost("Sessions/{sessionId}/Message")]
method AddUserToSession (line 306) | [HttpPost("Sessions/{sessionId}/User/{userId}")]
method RemoveUserFromSession (line 324) | [HttpDelete("Sessions/{sessionId}/User/{userId}")]
method PostCapabilities (line 345) | [HttpPost("Sessions/Capabilities")]
method PostFullCapabilities (line 377) | [HttpPost("Sessions/Capabilities/Full")]
method ReportViewing (line 401) | [HttpPost("Sessions/Viewing")]
method ReportSessionEnded (line 419) | [HttpPost("Sessions/Logout")]
method GetAuthProviders (line 433) | [HttpGet("Auth/Providers")]
method GetPasswordResetProviders (line 446) | [HttpGet("Auth/PasswordResetProviders")]
FILE: Jellyfin.Api/Controllers/StartupController.cs
class StartupController (line 19) | [Authorize(Policy = Policies.FirstTimeSetupOrElevated)]
method StartupController (line 30) | public StartupController(IServerConfigurationManager config, IUserMana...
method CompleteWizard (line 41) | [HttpPost("Complete")]
method GetStartupConfiguration (line 55) | [HttpGet("Configuration")]
method UpdateInitialConfiguration (line 74) | [HttpPost("Configuration")]
method SetRemoteAccess (line 92) | [HttpPost("RemoteAccess")]
method GetFirstUser (line 107) | [HttpGet("User")]
method UpdateStartupUser (line 130) | [HttpPost("User")]
FILE: Jellyfin.Api/Controllers/StudiosController.cs
class StudiosController (line 24) | [Authorize]
method StudiosController (line 37) | public StudiosController(
method GetStudios (line 69) | [HttpGet]
method GetStudio (line 139) | [HttpGet("{name}")]
FILE: Jellyfin.Api/Controllers/SubtitleController.cs
class SubtitleController (line 40) | [Route("")]
method SubtitleController (line 63) | public SubtitleController(
method DeleteSubtitle (line 91) | [HttpDelete("Videos/{itemId}/Subtitles/{index}")]
method SearchRemoteSubtitles (line 118) | [HttpGet("Items/{itemId}/RemoteSearch/Subtitles/{language}")]
method DownloadRemoteSubtitles (line 144) | [HttpPost("Items/{itemId}/RemoteSearch/Subtitles/{subtitleId}")]
method GetRemoteSubtitles (line 179) | [HttpGet("Providers/Subtitles/Subtitles/{subtitleId}")]
method GetSubtitle (line 208) | [HttpGet("Videos/{routeItemId}/{routeMediaSourceId}/Subtitles/{routeIn...
method GetSubtitleWithTicks (line 295) | [HttpGet("Videos/{routeItemId}/{routeMediaSourceId}/Subtitles/{routeIn...
method GetSubtitlePlaylist (line 338) | [HttpGet("Videos/{itemId}/{mediaSourceId}/Subtitles/{index}/subtitles....
method UploadSubtitle (line 420) | [HttpPost("Videos/{itemId}/Subtitles")]
method EncodeSubtitles (line 470) | private Task<Stream> EncodeSubtitles(
method GetFallbackFontList (line 497) | [HttpGet("FallbackFont/Fonts")]
method GetFallbackFont (line 548) | [HttpGet("FallbackFont/Fonts/{name}")]
FILE: Jellyfin.Api/Controllers/SuggestionsController.cs
class SuggestionsController (line 24) | [Route("")]
method SuggestionsController (line 38) | public SuggestionsController(
method GetSuggestions (line 59) | [HttpGet("Items/Suggestions")]
method GetSuggestionsLegacy (line 113) | [HttpGet("Users/{userId}/Suggestions")]
FILE: Jellyfin.Api/Controllers/SyncPlayController.cs
class SyncPlayController (line 25) | [Authorize(Policy = Policies.SyncPlayHasAccess)]
method SyncPlayController (line 38) | public SyncPlayController(
method SyncPlayCreateGroup (line 54) | [HttpPost("New")]
method SyncPlayJoinGroup (line 71) | [HttpPost("Join")]
method SyncPlayLeaveGroup (line 88) | [HttpPost("Leave")]
method SyncPlayGetGroups (line 104) | [HttpGet("List")]
method SyncPlayGetGroup (line 120) | [HttpGet("{id:guid}")]
method SyncPlaySetNewQueue (line 137) | [HttpPost("SetNewQueue")]
method SyncPlaySetPlaylistItem (line 158) | [HttpPost("SetPlaylistItem")]
method SyncPlayRemoveFromPlaylist (line 176) | [HttpPost("RemoveFromPlaylist")]
method SyncPlayMovePlaylistItem (line 194) | [HttpPost("MovePlaylistItem")]
method SyncPlayQueue (line 212) | [HttpPost("Queue")]
method SyncPlayUnpause (line 229) | [HttpPost("Unpause")]
method SyncPlayPause (line 245) | [HttpPost("Pause")]
method SyncPlayStop (line 261) | [HttpPost("Stop")]
method SyncPlaySeek (line 278) | [HttpPost("Seek")]
method SyncPlayBuffering (line 296) | [HttpPost("Buffering")]
method SyncPlayReady (line 318) | [HttpPost("Ready")]
method SyncPlaySetIgnoreWait (line 340) | [HttpPost("SetIgnoreWait")]
method SyncPlayNextItem (line 358) | [HttpPost("NextItem")]
method SyncPlayPreviousItem (line 376) | [HttpPost("PreviousItem")]
method SyncPlaySetRepeatMode (line 394) | [HttpPost("SetRepeatMode")]
method SyncPlaySetShuffleMode (line 412) | [HttpPost("SetShuffleMode")]
method SyncPlayPing (line 430) | [HttpPost("Ping")]
FILE: Jellyfin.Api/Controllers/SystemController.cs
class SystemController (line 27) | public class SystemController : BaseJellyfinApiController
method SystemController (line 45) | public SystemController(
method GetSystemInfo (line 67) | [HttpGet("Info")]
method GetSystemStorage (line 80) | [HttpGet("Info/Storage")]
method GetPublicSystemInfo (line 92) | [HttpGet("Info/Public")]
method PingSystem (line 102) | [HttpGet("Ping", Name = "GetPingSystem")]
method RestartApplication (line 114) | [HttpPost("Restart")]
method ShutdownApplication (line 130) | [HttpPost("Shutdown")]
method GetServerLogs (line 146) | [HttpGet("Logs")]
method GetEndpointInfo (line 185) | [HttpGet("Endpoint")]
method GetLogFile (line 206) | [HttpGet("Logs/Log")]
FILE: Jellyfin.Api/Controllers/TimeSyncController.cs
class TimeSyncController (line 11) | [Route("")]
method GetUtcTime (line 19) | [HttpGet("GetUtcTime")]
FILE: Jellyfin.Api/Controllers/TrailersController.cs
class TrailersController (line 17) | [Authorize]
method TrailersController (line 26) | public TrailersController(ItemsController itemsController)
method GetTrailers (line 119) | [HttpGet]
FILE: Jellyfin.Api/Controllers/TrickplayController.cs
class TrickplayController (line 22) | [Route("")]
method TrickplayController (line 34) | public TrickplayController(
method GetTrickplayHlsPlaylist (line 50) | [HttpGet("Videos/{itemId}/Trickplay/{width}/tiles.m3u8")]
method GetTrickplayTileImage (line 79) | [HttpGet("Videos/{itemId}/Trickplay/{width}/{index}.jpg")]
FILE: Jellyfin.Api/Controllers/TvShowsController.cs
class TvShowsController (line 28) | [Route("Shows")]
method TvShowsController (line 44) | public TvShowsController(
method GetNextUp (line 74) | [HttpGet("NextUp")]
method GetUpcomingEpisodes (line 137) | [HttpGet("Upcoming")]
method GetEpisodes (line 201) | [HttpGet("{seriesId}/Episodes")]
method GetSeasons (line 324) | [HttpGet("{seriesId}/Seasons")]
method ApplyPaging (line 371) | private IEnumerable<BaseItem> ApplyPaging(IEnumerable<BaseItem> items,...
FILE: Jellyfin.Api/Controllers/UniversalAudioController.cs
class UniversalAudioController (line 31) | [Route("")]
method UniversalAudioController (line 50) | public UniversalAudioController(
method GetUniversalAudioStream (line 91) | [HttpGet("Audio/{itemId}/universal")]
method GetDeviceProfile (line 257) | private DeviceProfile GetDeviceProfile(
FILE: Jellyfin.Api/Controllers/UserController.cs
class UserController (line 37) | [Route("Users")]
method UserController (line 62) | public UserController(
method GetUsers (line 91) | [HttpGet]
method GetPublicUsers (line 107) | [HttpGet("Public")]
method GetUserById (line 127) | [HttpGet("{userId}")]
method DeleteUser (line 151) | [HttpDelete("{userId}")]
method AuthenticateUser (line 178) | [HttpPost("{userId}/Authenticate")]
method AuthenticateUserByName (line 209) | [HttpPost("AuthenticateByName")]
method AuthenticateWithQuickConnect (line 244) | [HttpPost("AuthenticateWithQuickConnect")]
method UpdateUserPassword (line 268) | [HttpPost("Password")]
method UpdateUserPasswordLegacy (line 328) | [HttpPost("{userId}/Password")]
method UpdateUser (line 349) | [HttpPost]
method UpdateUserLegacy (line 389) | [HttpPost("{userId}")]
method UpdateUserPolicy (line 410) | [HttpPost("{userId}/Policy")]
method UpdateUserConfiguration (line 465) | [HttpPost("Configuration")]
method UpdateUserConfigurationLegacy (line 498) | [HttpPost("{userId}/Configuration")]
method CreateUserByName (line 515) | [HttpPost("New")]
method ForgotPassword (line 539) | [HttpPost("ForgotPassword")]
method ForgotPasswordPin (line 563) | [HttpPost("ForgotPassword/Pin")]
method GetCurrentUser (line 577) | [HttpGet("Me")]
method Get (line 598) | private IEnumerable<UserDto> Get(bool? isHidden, bool? isDisabled, boo...
FILE: Jellyfin.Api/Controllers/UserLibraryController.cs
class UserLibraryController (line 32) | [Route("")]
method UserLibraryController (line 52) | public UserLibraryController(
method GetItem (line 75) | [HttpGet("Items/{itemId}")]
method GetItemLegacy (line 110) | [HttpGet("Users/{userId}/Items/{itemId}")]
method GetRootFolder (line 125) | [HttpGet("Items/Root")]
method GetRootFolderLegacy (line 147) | [HttpGet("Users/{userId}/Items/Root")]
method GetIntros (line 162) | [HttpGet("Items/{itemId}/Intros")]
method GetIntrosLegacy (line 197) | [HttpGet("Users/{userId}/Items/{itemId}/Intros")]
method MarkFavoriteItem (line 213) | [HttpPost("UserFavoriteItems/{itemId}")]
method MarkFavoriteItemLegacy (line 244) | [HttpPost("Users/{userId}/FavoriteItems/{itemId}")]
method UnmarkFavoriteItem (line 260) | [HttpDelete("UserFavoriteItems/{itemId}")]
method UnmarkFavoriteItemLegacy (line 291) | [HttpDelete("Users/{userId}/FavoriteItems/{itemId}")]
method DeleteUserItemRating (line 307) | [HttpDelete("UserItems/{itemId}/Rating")]
method DeleteUserItemRatingLegacy (line 338) | [HttpDelete("Users/{userId}/Items/{itemId}/Rating")]
method UpdateUserItemRating (line 355) | [HttpPost("UserItems/{itemId}/Rating")]
method UpdateUserItemRatingLegacy (line 388) | [HttpPost("Users/{userId}/Items/{itemId}/Rating")]
method GetLocalTrailers (line 405) | [HttpGet("Items/{itemId}/LocalTrailers")]
method GetLocalTrailersLegacy (line 445) | [HttpGet("Users/{userId}/Items/{itemId}/LocalTrailers")]
method GetSpecialFeatures (line 461) | [HttpGet("Items/{itemId}/SpecialFeatures")]
method GetSpecialFeaturesLegacy (line 497) | [HttpGet("Users/{userId}/Items/{itemId}/SpecialFeatures")]
method GetLatestMedia (line 522) | [HttpGet("Items/Latest")]
method GetLatestMediaLegacy (line 604) | [HttpGet("Users/{userId}/Items/Latest")]
method RefreshItemOnDemandIfNeeded (line 633) | private async Task RefreshItemOnDemandIfNeeded(BaseItem item)
method MarkFavorite (line 660) | private UserItemDataDto MarkFavorite(User user, BaseItem item, bool is...
method UpdateUserItemRatingInternal (line 682) | private UserItemDataDto? UpdateUserItemRatingInternal(User user, BaseI...
FILE: Jellyfin.Api/Controllers/UserViewsController.cs
class UserViewsController (line 27) | [Route("")]
method UserViewsController (line 43) | public UserViewsController(
method GetUserViews (line 64) | [HttpGet("UserViews")]
method GetUserViewsLegacy (line 106) | [HttpGet("Users/{userId}/Views")]
method GetGroupingOptions (line 127) | [HttpGet("UserViews/GroupingOptions")]
method GetGroupingOptionsLegacy (line 162) | [HttpGet("Users/{userId}/GroupingOptions")]
FILE: Jellyfin.Api/Controllers/VideoAttachmentsController.cs
class VideoAttachmentsController (line 21) | [Route("Videos")]
method VideoAttachmentsController (line 32) | public VideoAttachmentsController(
method GetAttachment (line 49) | [HttpGet("{videoId}/{mediaSourceId}/Attachments/{index}")]
FILE: Jellyfin.Api/Controllers/VideosController.cs
class VideosController (line 38) | public class VideosController : BaseJellyfinApiController
method VideosController (line 64) | public VideosController(
method GetAdditionalPart (line 93) | [HttpGet("{itemId}/AdditionalParts")]
method DeleteAlternateSources (line 138) | [HttpDelete("{itemId}/AlternateSources")]
method MergeVersions (line 182) | [HttpPost("MergeVersions")]
method GetVideoStream (line 310) | [HttpGet("{itemId}/stream")]
method GetVideoStreamByContainer (line 548) | [HttpGet("{itemId}/stream.{container}")]
FILE: Jellyfin.Api/Controllers/YearsController.cs
class YearsController (line 28) | [Authorize]
method YearsController (line 41) | public YearsController(
method GetYears (line 71) | [HttpGet]
method GetYear (line 172) | [HttpGet("{year}")]
method FilterItem (line 195) | private bool FilterItem(BaseItem f, IReadOnlyCollection<BaseItemKind> ...
method GetAllItems (line 219) | private IEnumerable<BaseItem> GetAllItems(IEnumerable<BaseItem> items)
FILE: Jellyfin.Api/Extensions/ClaimsPrincipalExtensions.cs
class ClaimsPrincipalExtensions (line 11) | public static class ClaimsPrincipalExtensions
method GetUserId (line 18) | public static Guid GetUserId(this ClaimsPrincipal user)
method GetDeviceId (line 31) | public static string? GetDeviceId(this ClaimsPrincipal user)
method GetDevice (line 39) | public static string? GetDevice(this ClaimsPrincipal user)
method GetClient (line 47) | public static string? GetClient(this ClaimsPrincipal user)
method GetVersion (line 55) | public static string? GetVersion(this Claims
Copy disabled (too large)
Download .json
Condensed preview — 2329 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (12,788K chars).
[
{
"path": ".config/dotnet-tools.json",
"chars": 155,
"preview": "{\n \"version\": 1,\n \"isRoot\": true,\n \"tools\": {\n \"dotnet-ef\": {\n \"version\": \"10.0.5\",\n \"commands\": [\n "
},
{
"path": ".devcontainer/devcontainer.json",
"chars": 1798,
"preview": "{\n \"name\": \"Development Jellyfin Server\",\n \"image\": \"mcr.microsoft.com/devcontainers/dotnet:10.0-noble\",\n \"serv"
},
{
"path": ".devcontainer/install-ffmpeg.sh",
"chars": 1134,
"preview": "#!/bin/bash\n\n## configure the following for a manual install of a specific version from the repo\n\n# wget https://repo.je"
},
{
"path": ".dockerignore",
"chars": 157,
"preview": ".git\n.dockerignore\nDockerfile\nDockerfile.arm\nDockerfile.arm64\nCONTRIBUTORS.md\nREADME.md\ndeployment/*/dist\ndeployment/*/p"
},
{
"path": ".editorconfig",
"chars": 22107,
"preview": "# With more recent updates Visual Studio 2017 supports EditorConfig files out of the box\n# Visual Studio Code needs an e"
},
{
"path": ".gitattributes",
"chars": 74,
"preview": "* text=auto eol=lf\n*.png binary\n*.jpg binary\n\nCONTRIBUTORS.md merge=union\n"
},
{
"path": ".github/CODEOWNERS",
"chars": 776,
"preview": "# Joshua must review all changes to bump_version and any files it touches\nbump_version "
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 772,
"preview": "---\nname: Feature Request\nabout: Request a new feature\ntitle: ''\nlabels: feature-request\nassignees: ''\n---\n\n**PLEASE DO "
},
{
"path": ".github/ISSUE_TEMPLATE/issue report.yml",
"chars": 10792,
"preview": "name: Issue Report\ndescription: File an issue report\nlabels: [bug, triage]\ntype: Bug\nbody:\n - type: markdown\n id: in"
},
{
"path": ".github/pull_request_template.md",
"chars": 413,
"preview": "<!--\nEnsure your title is short, descriptive, and in the imperative mood (Fix X, Change Y, instead of Fixed X, Changed Y"
},
{
"path": ".github/renovate.json",
"chars": 144,
"preview": "{\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n \"extends\": [\n \"github>jellyfin/.github//renovat"
},
{
"path": ".github/workflows/ci-codeql-analysis.yml",
"chars": 1008,
"preview": "name: \"CodeQL\"\n\non:\n push:\n branches: [ master ]\n pull_request:\n branches: [ master ]\n schedule:\n - cron: '2"
},
{
"path": ".github/workflows/ci-compat.yml",
"chars": 5514,
"preview": "name: ABI Compatibility\non:\n pull_request:\n\npermissions: {}\n\njobs:\n abi-head:\n name: ABI - HEAD\n runs-on: ubunt"
},
{
"path": ".github/workflows/ci-openapi.yml",
"chars": 10566,
"preview": "name: OpenAPI\non:\n push:\n branches:\n - master\n tags:\n - 'v*'\n pull_request:\n\npermissions: {}\n\njobs:\n "
},
{
"path": ".github/workflows/ci-tests.yml",
"chars": 1349,
"preview": "name: Tests\non:\n push:\n branches:\n - master\n # Run tests against the forked branch, but\n # do not allow acces"
},
{
"path": ".github/workflows/commands.yml",
"chars": 1997,
"preview": "name: Commands\non:\n issue_comment:\n types:\n - created\n - edited\n pull_request:\n types:\n - labeled"
},
{
"path": ".github/workflows/issue-stale.yml",
"chars": 1265,
"preview": "name: Stale Issue Labeler\n\non:\n schedule:\n - cron: '30 1 * * *'\n workflow_dispatch:\n\npermissions:\n issues: write\n "
},
{
"path": ".github/workflows/issue-template-check.yml",
"chars": 908,
"preview": "name: Check Issue Template\non:\n issues:\n types:\n - opened\njobs:\n check_issue:\n runs-on: ubuntu-latest\n p"
},
{
"path": ".github/workflows/project-automation.yml",
"chars": 2854,
"preview": "name: Project Automation\n\non:\n push:\n branches:\n - master\n pull_request:\n issue_comment:\n\npermissions: {}\njob"
},
{
"path": ".github/workflows/pull-request-conflict.yml",
"chars": 745,
"preview": "name: Merge Conflict Labeler\n\non:\n push:\n branches:\n - master\n pull_request:\n issue_comment:\n\npermissions: {}"
},
{
"path": ".github/workflows/pull-request-stale.yaml",
"chars": 877,
"preview": "name: Stale PR Check\n\non:\n schedule:\n - cron: '30 */12 * * *'\n workflow_dispatch:\n\npermissions:\n pull-requests: wr"
},
{
"path": ".github/workflows/release-bump-version.yaml",
"chars": 2695,
"preview": "name: '🆙 Auto bump_version'\n\non:\n release:\n types:\n - published\n workflow_dispatch:\n inputs:\n TAG_BRAN"
},
{
"path": ".gitignore",
"chars": 3451,
"preview": ".directory\n\n#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n*.bak\n*.sw"
},
{
"path": ".vscode/extensions.json",
"chars": 302,
"preview": "{\n \"recommendations\": [\n \"ms-dotnettools.csharp\",\n \"editorconfig.editorconfig\",\n \"github.vscode-"
},
{
"path": ".vscode/launch.json",
"chars": 1987,
"preview": "{\n \"version\": \"0.2.0\",\n \"configurations\": [\n {\n \"name\": \".NET Launch (console)\",\n \"ty"
},
{
"path": ".vscode/settings.json",
"chars": 63,
"preview": "{\n \"dotnet.preferVisualStudioCodeFileSystemWatcher\": true\n}\n"
},
{
"path": ".vscode/tasks.json",
"chars": 753,
"preview": "{\n \"version\": \"2.0.0\",\n \"tasks\": [\n {\n \"label\": \"build\",\n \"command\": \"dotnet\",\n "
},
{
"path": "BannedSymbols.txt",
"chars": 179,
"preview": "P:System.Threading.Tasks.Task`1.Result\nM:System.Guid.op_Equality(System.Guid,System.Guid)\nM:System.Guid.op_Inequality(Sy"
},
{
"path": "CONTRIBUTORS.md",
"chars": 13062,
"preview": "# Jellyfin Contributors\n\n - [1337joe](https://github.com/1337joe)\n - [97carmine](https://github.com/97carmine)\n - [Abbe9"
},
{
"path": "Directory.Build.props",
"chars": 922,
"preview": "<Project>\n <!-- Sets defaults for all projects in the repo -->\n\n <PropertyGroup>\n <Nullable>enable</Nullable>\n </P"
},
{
"path": "Directory.Packages.props",
"chars": 6240,
"preview": "<Project>\n <PropertyGroup>\n <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n </PropertyGroup>"
},
{
"path": "Emby.Naming/Audio/AlbumParser.cs",
"chars": 2127,
"preview": "using System;\nusing System.Globalization;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing Emby.Naming.Commo"
},
{
"path": "Emby.Naming/Audio/AudioFileParser.cs",
"chars": 883,
"preview": "using System;\nusing System.IO;\nusing Emby.Naming.Common;\nusing Jellyfin.Extensions;\n\nnamespace Emby.Naming.Audio\n{\n /"
},
{
"path": "Emby.Naming/AudioBook/AudioBookFileInfo.cs",
"chars": 2410,
"preview": "using System;\n\nnamespace Emby.Naming.AudioBook\n{\n /// <summary>\n /// Represents a single video file.\n /// </sum"
},
{
"path": "Emby.Naming/AudioBook/AudioBookFilePathParser.cs",
"chars": 2510,
"preview": "using System.Globalization;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing Emby.Naming.Common;\n\nnamespace "
},
{
"path": "Emby.Naming/AudioBook/AudioBookFilePathParserResult.cs",
"chars": 572,
"preview": "namespace Emby.Naming.AudioBook\n{\n /// <summary>\n /// Data object for passing result of audiobook part/chapter ext"
},
{
"path": "Emby.Naming/AudioBook/AudioBookInfo.cs",
"chars": 1951,
"preview": "using System.Collections.Generic;\n\nnamespace Emby.Naming.AudioBook\n{\n /// <summary>\n /// Represents a complete vid"
},
{
"path": "Emby.Naming/AudioBook/AudioBookListResolver.cs",
"chars": 6356,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Emby.Naming.Common;\nusing Emby"
},
{
"path": "Emby.Naming/AudioBook/AudioBookNameParser.cs",
"chars": 2293,
"preview": "using System.Globalization;\nusing System.Text.RegularExpressions;\nusing Emby.Naming.Common;\n\nnamespace Emby.Naming.Audio"
},
{
"path": "Emby.Naming/AudioBook/AudioBookNameParserResult.cs",
"chars": 461,
"preview": "namespace Emby.Naming.AudioBook\n{\n /// <summary>\n /// Data object used to pass result of name and year parsing.\n "
},
{
"path": "Emby.Naming/AudioBook/AudioBookResolver.cs",
"chars": 1965,
"preview": "using System;\nusing System.IO;\nusing Emby.Naming.Common;\nusing Jellyfin.Extensions;\n\nnamespace Emby.Naming.AudioBook\n{\n "
},
{
"path": "Emby.Naming/Book/BookFileNameParser.cs",
"chars": 2874,
"preview": "using System.Text.RegularExpressions;\n\nnamespace Emby.Naming.Book\n{\n /// <summary>\n /// Helper class to retrieve b"
},
{
"path": "Emby.Naming/Book/BookFileNameParserResult.cs",
"chars": 1044,
"preview": "using System;\n\nnamespace Emby.Naming.Book\n{\n /// <summary>\n /// Data object used to pass metadata parsed from a bo"
},
{
"path": "Emby.Naming/Common/EpisodeExpression.cs",
"chars": 2394,
"preview": "using System;\nusing System.Text.RegularExpressions;\n\nnamespace Emby.Naming.Common\n{\n /// <summary>\n /// Regular ex"
},
{
"path": "Emby.Naming/Common/MediaType.cs",
"chars": 405,
"preview": "namespace Emby.Naming.Common\n{\n /// <summary>\n /// Type of audiovisual media.\n /// </summary>\n public enum M"
},
{
"path": "Emby.Naming/Common/NamingOptions.cs",
"chars": 31723,
"preview": "#pragma warning disable CA1819\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.Reg"
},
{
"path": "Emby.Naming/Emby.Naming.csproj",
"chars": 2530,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <!-- ProjectGuid is only included as a requirement for SonarQube analysis -->\n <Pr"
},
{
"path": "Emby.Naming/ExternalFiles/ExternalPathParser.cs",
"chars": 6302,
"preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing Emby.Naming.Common;\nusing Jellyfin.Extensions;\nusing MediaBrowse"
},
{
"path": "Emby.Naming/ExternalFiles/ExternalPathParserResult.cs",
"chars": 2177,
"preview": "namespace Emby.Naming.ExternalFiles\n{\n /// <summary>\n /// Class holding information about external files.\n /// "
},
{
"path": "Emby.Naming/Properties/AssemblyInfo.cs",
"chars": 959,
"preview": "using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an "
},
{
"path": "Emby.Naming/TV/EpisodeInfo.cs",
"chars": 2834,
"preview": "namespace Emby.Naming.TV\n{\n /// <summary>\n /// Holder object for Episode information.\n /// </summary>\n publi"
},
{
"path": "Emby.Naming/TV/EpisodePathParser.cs",
"chars": 9540,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing Emby.Naming.Common;"
},
{
"path": "Emby.Naming/TV/EpisodePathParserResult.cs",
"chars": 1592,
"preview": "namespace Emby.Naming.TV\n{\n /// <summary>\n /// Holder object for <see cref=\"EpisodePathParser\"/> result.\n /// <"
},
{
"path": "Emby.Naming/TV/EpisodeResolver.cs",
"chars": 3571,
"preview": "using System;\nusing System.IO;\nusing Emby.Naming.Common;\nusing Emby.Naming.Video;\nusing Jellyfin.Extensions;\n\nnamespace "
},
{
"path": "Emby.Naming/TV/SeasonPathParser.cs",
"chars": 7045,
"preview": "using System;\nusing System.Globalization;\nusing System.IO;\nusing System.Text.RegularExpressions;\n\nnamespace Emby.Naming."
},
{
"path": "Emby.Naming/TV/SeasonPathParserResult.cs",
"chars": 853,
"preview": "namespace Emby.Naming.TV\n{\n /// <summary>\n /// Data object to pass result of <see cref=\"SeasonPathParser\"/>.\n /"
},
{
"path": "Emby.Naming/TV/SeriesInfo.cs",
"chars": 763,
"preview": "namespace Emby.Naming.TV\n{\n /// <summary>\n /// Holder object for Series information.\n /// </summary>\n public"
},
{
"path": "Emby.Naming/TV/SeriesPathParser.cs",
"chars": 2124,
"preview": "using Emby.Naming.Common;\n\nnamespace Emby.Naming.TV\n{\n /// <summary>\n /// Used to parse information about series f"
},
{
"path": "Emby.Naming/TV/SeriesPathParserResult.cs",
"chars": 540,
"preview": "namespace Emby.Naming.TV\n{\n /// <summary>\n /// Holder object for <see cref=\"SeriesPathParser\"/> result.\n /// </"
},
{
"path": "Emby.Naming/TV/SeriesResolver.cs",
"chars": 2623,
"preview": "using System.IO;\nusing System.Text.RegularExpressions;\nusing Emby.Naming.Common;\n\nnamespace Emby.Naming.TV\n{\n /// <su"
},
{
"path": "Emby.Naming/TV/TvParserHelpers.cs",
"chars": 1330,
"preview": "using System;\nusing System.Linq;\nusing MediaBrowser.Model.Entities;\n\nnamespace Emby.Naming.TV;\n\n/// <summary>\n/// Helper"
},
{
"path": "Emby.Naming/Video/CleanDateTimeParser.cs",
"chars": 1838,
"preview": "using System.Collections.Generic;\nusing System.Globalization;\nusing System.Text.RegularExpressions;\n\nnamespace Emby.Nami"
},
{
"path": "Emby.Naming/Video/CleanDateTimeResult.cs",
"chars": 841,
"preview": "namespace Emby.Naming.Video\n{\n /// <summary>\n /// Holder structure for name and year.\n /// </summary>\n publi"
},
{
"path": "Emby.Naming/Video/CleanStringParser.cs",
"chars": 1823,
"preview": "using System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Text.RegularExpressions;\n\nnamespac"
},
{
"path": "Emby.Naming/Video/ExtraResult.cs",
"chars": 564,
"preview": "using MediaBrowser.Model.Entities;\n\nnamespace Emby.Naming.Video\n{\n /// <summary>\n /// Holder object for passing re"
},
{
"path": "Emby.Naming/Video/ExtraRule.cs",
"chars": 1533,
"preview": "using MediaBrowser.Model.Entities;\nusing MediaType = Emby.Naming.Common.MediaType;\n\nnamespace Emby.Naming.Video\n{\n //"
},
{
"path": "Emby.Naming/Video/ExtraRuleResolver.cs",
"chars": 3058,
"preview": "using System;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing Emby.Naming.Audio;\nusing Emby.Naming.Common;\n"
},
{
"path": "Emby.Naming/Video/ExtraRuleType.cs",
"chars": 869,
"preview": "namespace Emby.Naming.Video\n{\n /// <summary>\n /// Extra rules type to determine against what <see cref=\"ExtraRule."
},
{
"path": "Emby.Naming/Video/FileStack.cs",
"chars": 1810,
"preview": "using System;\nusing System.Collections.Generic;\nusing Jellyfin.Extensions;\n\nnamespace Emby.Naming.Video\n{\n /// <summa"
},
{
"path": "Emby.Naming/Video/FileStackRule.cs",
"chars": 1683,
"preview": "using System.Diagnostics.CodeAnalysis;\nusing System.Text.RegularExpressions;\n\nnamespace Emby.Naming.Video;\n\n/// <summary"
},
{
"path": "Emby.Naming/Video/Format3DParser.cs",
"chars": 2710,
"preview": "using System;\nusing Emby.Naming.Common;\n\nnamespace Emby.Naming.Video\n{\n /// <summary>\n /// Parse 3D format related"
},
{
"path": "Emby.Naming/Video/Format3DResult.cs",
"chars": 1028,
"preview": "namespace Emby.Naming.Video\n{\n /// <summary>\n /// Helper object to return data from <see cref=\"Format3DParser\"/>.\n"
},
{
"path": "Emby.Naming/Video/Format3DRule.cs",
"chars": 933,
"preview": "namespace Emby.Naming.Video\n{\n /// <summary>\n /// Data holder class for 3D format rule.\n /// </summary>\n pub"
},
{
"path": "Emby.Naming/Video/StackResolver.cs",
"chars": 6162,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Emby.Naming.AudioBook;\nusing E"
},
{
"path": "Emby.Naming/Video/StubResolver.cs",
"chars": 1496,
"preview": "using System;\nusing System.IO;\nusing Emby.Naming.Common;\nusing Jellyfin.Extensions;\n\nnamespace Emby.Naming.Video\n{\n /"
},
{
"path": "Emby.Naming/Video/StubTypeRule.cs",
"chars": 886,
"preview": "namespace Emby.Naming.Video\n{\n /// <summary>\n /// Data class holding information about Stub type rule.\n /// </s"
},
{
"path": "Emby.Naming/Video/VideoFileInfo.cs",
"chars": 4205,
"preview": "using System;\nusing MediaBrowser.Model.Entities;\n\nnamespace Emby.Naming.Video\n{\n /// <summary>\n /// Represents a s"
},
{
"path": "Emby.Naming/Video/VideoInfo.cs",
"chars": 1493,
"preview": "using System;\nusing System.Collections.Generic;\nusing MediaBrowser.Model.Entities;\n\nnamespace Emby.Naming.Video\n{\n //"
},
{
"path": "Emby.Naming/Video/VideoListResolver.cs",
"chars": 8115,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing Sy"
},
{
"path": "Emby.Naming/Video/VideoResolver.cs",
"chars": 6573,
"preview": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing Emby.Naming.Common;\nusing Jellyfin.Extension"
},
{
"path": "Emby.Photos/Emby.Photos.csproj",
"chars": 1564,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <!-- ProjectGuid is only included as a requirement for SonarQube analysis -->\n <Pr"
},
{
"path": "Emby.Photos/PhotoProvider.cs",
"chars": 6622,
"preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Jellyfin.E"
},
{
"path": "Emby.Photos/Properties/AssemblyInfo.cs",
"chars": 959,
"preview": "using System.Reflection;\nusing System.Resources;\nusing System.Runtime.InteropServices;\n\n// General Information about an "
},
{
"path": "Emby.Server.Implementations/AppBase/BaseApplicationPaths.cs",
"chars": 4919,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Jellyfin.Extensions;\nusing Med"
},
{
"path": "Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs",
"chars": 14122,
"preview": "using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing S"
},
{
"path": "Emby.Server.Implementations/AppBase/ConfigurationHelper.cs",
"chars": 2348,
"preview": "using System;\nusing System.IO;\nusing MediaBrowser.Model.Serialization;\n\nnamespace Emby.Server.Implementations.AppBase\n{\n"
},
{
"path": "Emby.Server.Implementations/ApplicationHost.cs",
"chars": 39407,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Concurrent;\nusing System.Colle"
},
{
"path": "Emby.Server.Implementations/Branding/BrandingConfigurationFactory.cs",
"chars": 695,
"preview": "using System.Collections.Generic;\nusing MediaBrowser.Common.Configuration;\nusing MediaBrowser.Model.Branding;\n\nnamespace"
},
{
"path": "Emby.Server.Implementations/Chapters/ChapterManager.cs",
"chars": 11000,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System"
},
{
"path": "Emby.Server.Implementations/Collections/CollectionImageProvider.cs",
"chars": 3473,
"preview": "using System.Collections.Generic;\nusing System.Linq;\nusing Emby.Server.Implementations.Images;\nusing MediaBrowser.Common"
},
{
"path": "Emby.Server.Implementations/Collections/CollectionManager.cs",
"chars": 13719,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System"
},
{
"path": "Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs",
"chars": 4902,
"preview": "using System;\nusing System.Globalization;\nusing System.IO;\nusing Emby.Server.Implementations.AppBase;\nusing Jellyfin.Dat"
},
{
"path": "Emby.Server.Implementations/ConfigurationOptions.cs",
"chars": 1011,
"preview": "using System.Collections.Generic;\nusing static MediaBrowser.Controller.Extensions.ConfigurationExtensions;\n\nnamespace Em"
},
{
"path": "Emby.Server.Implementations/Cryptography/CryptographyProvider.cs",
"chars": 3685,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Security.Cryptography;\nusing Me"
},
{
"path": "Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs",
"chars": 4369,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.T"
},
{
"path": "Emby.Server.Implementations/Data/ItemTypeLookup.cs",
"chars": 3138,
"preview": "using System.Collections.Frozen;\nusing System.Collections.Generic;\nusing System.Threading.Channels;\nusing Emby.Server.Im"
},
{
"path": "Emby.Server.Implementations/Data/SqliteExtensions.cs",
"chars": 8425,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Globaliz"
},
{
"path": "Emby.Server.Implementations/Data/TypeMapper.cs",
"chars": 1102,
"preview": "using System;\nusing System.Collections.Concurrent;\nusing System.Linq;\n\nnamespace Emby.Server.Implementations.Data\n{\n "
},
{
"path": "Emby.Server.Implementations/Devices/DeviceId.cs",
"chars": 2487,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Globalization;\nusing System.IO;\nusing System.Text;\nusing Syst"
},
{
"path": "Emby.Server.Implementations/Dto/DtoService.cs",
"chars": 54764,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Frozen;\nusing System.Collections.Generic;\nusing S"
},
{
"path": "Emby.Server.Implementations/Emby.Server.Implementations.csproj",
"chars": 3657,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <!-- ProjectGuid is only included as a requirement for SonarQube analysis -->\n <Pr"
},
{
"path": "Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs",
"chars": 14373,
"preview": "using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing S"
},
{
"path": "Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs",
"chars": 5473,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;"
},
{
"path": "Emby.Server.Implementations/HttpServer/Security/AuthService.cs",
"chars": 1188,
"preview": "#pragma warning disable CS1591\n\nusing System.Threading.Tasks;\nusing Jellyfin.Data;\nusing Jellyfin.Database.Implementatio"
},
{
"path": "Emby.Server.Implementations/HttpServer/WebSocketConnection.cs",
"chars": 9831,
"preview": "using System;\nusing System.Buffers;\nusing System.IO.Pipelines;\nusing System.Net;\nusing System.Net.WebSockets;\nusing Syst"
},
{
"path": "Emby.Server.Implementations/HttpServer/WebSocketManager.cs",
"chars": 3637,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nus"
},
{
"path": "Emby.Server.Implementations/IO/FileRefresher.cs",
"chars": 5970,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusin"
},
{
"path": "Emby.Server.Implementations/IO/LibraryMonitor.cs",
"chars": 17288,
"preview": "using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;"
},
{
"path": "Emby.Server.Implementations/IO/ManagedFileSystem.cs",
"chars": 26770,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing Sy"
},
{
"path": "Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs",
"chars": 954,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.IO;\nusing MediaBrowser.Model.IO;\n\nnamespace Emby.Server.Imple"
},
{
"path": "Emby.Server.Implementations/IStartupOptions.cs",
"chars": 831,
"preview": "namespace Emby.Server.Implementations\n{\n /// <summary>\n /// Specifies the contract for server startup options.\n "
},
{
"path": "Emby.Server.Implementations/Images/ArtistImageProvider.cs",
"chars": 1759,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing MediaBrowser.Common.Configuration;"
},
{
"path": "Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs",
"chars": 11108,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globaliz"
},
{
"path": "Emby.Server.Implementations/Images/BaseFolderImageProvider.cs",
"chars": 2323,
"preview": "#pragma warning disable CS1591\n\nusing System.Collections.Generic;\nusing Jellyfin.Data.Enums;\nusing Jellyfin.Database.Imp"
},
{
"path": "Emby.Server.Implementations/Images/CollectionFolderImageProvider.cs",
"chars": 4129,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusin"
},
{
"path": "Emby.Server.Implementations/Images/DynamicImageProvider.cs",
"chars": 4551,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusin"
},
{
"path": "Emby.Server.Implementations/Images/FolderImageProvider.cs",
"chars": 1081,
"preview": "#pragma warning disable CS1591\n\nusing MediaBrowser.Common.Configuration;\nusing MediaBrowser.Controller.Drawing;\nusing Me"
},
{
"path": "Emby.Server.Implementations/Images/GenreImageProvider.cs",
"chars": 1974,
"preview": "#pragma warning disable CS1591\n\nusing System.Collections.Generic;\nusing Jellyfin.Data.Enums;\nusing Jellyfin.Database.Imp"
},
{
"path": "Emby.Server.Implementations/Images/MusicAlbumImageProvider.cs",
"chars": 1116,
"preview": "#pragma warning disable CS1591\n\nusing System.Collections.Generic;\nusing System.Linq;\nusing MediaBrowser.Common.Configura"
},
{
"path": "Emby.Server.Implementations/Images/MusicGenreImageProvider.cs",
"chars": 2192,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System.Collections.Generic;\nusing Jellyfin.Data.Enums;\nusing Je"
},
{
"path": "Emby.Server.Implementations/Images/PhotoAlbumImageProvider.cs",
"chars": 717,
"preview": "#pragma warning disable CS1591\n\nusing MediaBrowser.Common.Configuration;\nusing MediaBrowser.Controller.Drawing;\nusing Me"
},
{
"path": "Emby.Server.Implementations/Images/PlaylistImageProvider.cs",
"chars": 2127,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System.Collections.Generic;\nusing System.Linq;\nusing MediaBrows"
},
{
"path": "Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs",
"chars": 2415,
"preview": "using System;\nusing System.IO;\nusing Emby.Naming.Audio;\nusing Emby.Naming.Common;\nusing MediaBrowser.Controller;\nusing M"
},
{
"path": "Emby.Server.Implementations/Library/DotIgnoreIgnoreRule.cs",
"chars": 5143,
"preview": "using System;\nusing System.IO;\nusing System.Text.RegularExpressions;\nusing MediaBrowser.Controller.Entities;\nusing Media"
},
{
"path": "Emby.Server.Implementations/Library/ExternalDataManager.cs",
"chars": 3019,
"preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MediaBrows"
},
{
"path": "Emby.Server.Implementations/Library/IgnorePatterns.cs",
"chars": 3751,
"preview": "using System;\nusing DotNet.Globbing;\n\nnamespace Emby.Server.Implementations.Library\n{\n /// <summary>\n /// Glob pat"
},
{
"path": "Emby.Server.Implementations/Library/KeyframeManager.cs",
"chars": 1363,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Jellyfin.Med"
},
{
"path": "Emby.Server.Implementations/Library/LibraryManager.cs",
"chars": 122030,
"preview": "#pragma warning disable CS1591\n#pragma warning disable CA5394\n\nusing System;\nusing System.Collections.Generic;\nusing Sys"
},
{
"path": "Emby.Server.Implementations/Library/LiveStreamHelper.cs",
"chars": 7360,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System"
},
{
"path": "Emby.Server.Implementations/Library/MediaSourceManager.cs",
"chars": 35696,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Concurrent;\nusing System.Colle"
},
{
"path": "Emby.Server.Implementations/Library/MediaStreamSelector.cs",
"chars": 9230,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Jellyfin.Databa"
},
{
"path": "Emby.Server.Implementations/Library/MusicManager.cs",
"chars": 4537,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusin"
},
{
"path": "Emby.Server.Implementations/Library/PathExtensions.cs",
"chars": 8752,
"preview": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing MediaBrowser.Common.Providers;\n\nnamespace Em"
},
{
"path": "Emby.Server.Implementations/Library/PathManager.cs",
"chars": 3473,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing MediaBrowser.Common.C"
},
{
"path": "Emby.Server.Implementations/Library/ResolverHelper.cs",
"chars": 5960,
"preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing MediaBrowser.Controller.Entities;\nusing MediaBrowser.Controller."
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs",
"chars": 8252,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusin"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs",
"chars": 6511,
"preview": "#nullable disable\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Thre"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs",
"chars": 4268,
"preview": "#nullable disable\n\nusing System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Emby.Naming.Audio;\nusing Emby.Na"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs",
"chars": 11005,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing DiscUtils.Udf"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/Books/BookResolver.cs",
"chars": 2830,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing Emby.Naming.B"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/ExtraResolver.cs",
"chars": 4815,
"preview": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing Emby.Naming.Common;\nusing Emby.Naming.Video;"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/FolderResolver.cs",
"chars": 920,
"preview": "#nullable disable\n\nusing MediaBrowser.Controller.Entities;\nusing MediaBrowser.Controller.Library;\nusing MediaBrowser.Con"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/GenericFolderResolver.cs",
"chars": 876,
"preview": "#nullable disable\n\nusing MediaBrowser.Controller.Entities;\nusing MediaBrowser.Controller.Library;\nusing MediaBrowser.Con"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/GenericVideoResolver.cs",
"chars": 1039,
"preview": "#nullable disable\n\nusing Emby.Naming.Common;\nusing MediaBrowser.Controller.Entities;\nusing MediaBrowser.Controller.Provi"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/Movies/BoxSetResolver.cs",
"chars": 2419,
"preview": "#nullable disable\n\nusing System;\nusing System.IO;\nusing MediaBrowser.Controller.Entities;\nusing MediaBrowser.Controller."
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs",
"chars": 20547,
"preview": "#nullable disable\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/PhotoAlbumResolver.cs",
"chars": 3077,
"preview": "#nullable disable\n\nusing System;\nusing Emby.Naming.Common;\nusing Jellyfin.Data.Enums;\nusing MediaBrowser.Controller.Draw"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/PhotoResolver.cs",
"chars": 4405,
"preview": "using System;\nusing System.IO;\nusing System.Linq;\nusing Emby.Naming.Common;\nusing Emby.Naming.Video;\nusing Jellyfin.Data"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/PlaylistResolver.cs",
"chars": 3029,
"preview": "#nullable disable\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing Jellyfin.Data.Enums;\nusing Jellyfin.Extension"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs",
"chars": 2777,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.IO;\nusing System.Linq;\nusing Jellyfin.Data"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs",
"chars": 3145,
"preview": "#nullable disable\n\nusing System;\nusing System.Linq;\nusing Emby.Naming.Common;\nusing Jellyfin.Data.Enums;\nusing MediaBrow"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/TV/SeasonResolver.cs",
"chars": 3682,
"preview": "#nullable disable\n\nusing System.Globalization;\nusing Emby.Naming.Common;\nusing Emby.Naming.TV;\nusing MediaBrowser.Contro"
},
{
"path": "Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs",
"chars": 7768,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusin"
},
{
"path": "Emby.Server.Implementations/Library/SearchEngine.cs",
"chars": 7004,
"preview": "#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Jellyfin.Data.E"
},
{
"path": "Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs",
"chars": 3571,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;"
},
{
"path": "Emby.Server.Implementations/Library/UserDataManager.cs",
"chars": 13482,
"preview": "#pragma warning disable RS0030 // Do not use banned APIs\n\nusing System;\nusing System.Collections.Generic;\nusing System.G"
},
{
"path": "Emby.Server.Implementations/Library/UserViewManager.cs",
"chars": 15136,
"preview": "#nullable disable\n\n#pragma warning disable CS1591\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nus"
},
{
"path": "Emby.Server.Implementations/Library/Validators/ArtistsPostScanTask.cs",
"chars": 1583,
"preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MediaBrowser.Controller.Library;\nusing MediaBr"
},
{
"path": "Emby.Server.Implementations/Library/Validators/ArtistsValidator.cs",
"chars": 3259,
"preview": "using System;\nusing System.Globalization;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing"
},
{
"path": "Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs",
"chars": 5208,
"preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;"
},
{
"path": "Emby.Server.Implementations/Library/Validators/GenresPostScanTask.cs",
"chars": 1576,
"preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MediaBrowser.Controller.Library;\nusing MediaBr"
},
{
"path": "Emby.Server.Implementations/Library/Validators/GenresValidator.cs",
"chars": 3075,
"preview": "using System;\nusing System.Globalization;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Jellyfin.Data.Enum"
},
{
"path": "Emby.Server.Implementations/Library/Validators/MusicGenresPostScanTask.cs",
"chars": 1610,
"preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MediaBrowser.Controller.Library;\nusing MediaBr"
},
{
"path": "Emby.Server.Implementations/Library/Validators/MusicGenresValidator.cs",
"chars": 2343,
"preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MediaBrowser.Controller.Library;\nusing MediaBr"
},
{
"path": "Emby.Server.Implementations/Library/Validators/PeopleValidator.cs",
"chars": 3709,
"preview": "using System;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Jellyfin.Data.Enums;\nusing "
},
{
"path": "Emby.Server.Implementations/Library/Validators/StudiosPostScanTask.cs",
"chars": 1588,
"preview": "using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing MediaBrowser.Controller.Library;\nusing MediaBr"
},
{
"path": "Emby.Server.Implementations/Library/Validators/StudiosValidator.cs",
"chars": 3063,
"preview": "using System;\nusing System.Globalization;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Jellyfin.Data.Enum"
},
{
"path": "Emby.Server.Implementations/Localization/Core/ab.json",
"chars": 31,
"preview": "{\n \"Albums\": \"аальбомқәа\"\n}\n"
},
{
"path": "Emby.Server.Implementations/Localization/Core/af.json",
"chars": 8606,
"preview": "{\n \"Artists\": \"Kunstenare\",\n \"Channels\": \"Kanale\",\n \"Folders\": \"Lêergidse\",\n \"Favorites\": \"Gunstelinge\",\n "
},
{
"path": "Emby.Server.Implementations/Localization/Core/ar.json",
"chars": 7892,
"preview": "{\n \"Albums\": \"ألبومات\",\n \"AppDeviceValues\": \"تطبيق: {0}, جهاز: {1}\",\n \"Application\": \"تطبيق\",\n \"Artists\": \"ف"
},
{
"path": "Emby.Server.Implementations/Localization/Core/as.json",
"chars": 1929,
"preview": "{\n \"Albums\": \"এলবাম\",\n \"Application\": \"আবেদন\",\n \"AppDeviceValues\": \"এপ্: {0}, ডিভাইচ: {1}\",\n \"Artists\": \"শি"
},
{
"path": "Emby.Server.Implementations/Localization/Core/be.json",
"chars": 8459,
"preview": "{\n \"Sync\": \"Сінхранізаваць\",\n \"Playlists\": \"Плэй-лісты\",\n \"Latest\": \"Апошняе\",\n \"LabelIpAddressValue\": \"IP-а"
},
{
"path": "Emby.Server.Implementations/Localization/Core/bg-BG.json",
"chars": 8659,
"preview": "{\n \"Albums\": \"Албуми\",\n \"AppDeviceValues\": \"Програма: {0}, Устройство: {1}\",\n \"Application\": \"Програма\",\n \"A"
},
{
"path": "Emby.Server.Implementations/Localization/Core/bn.json",
"chars": 8540,
"preview": "{\n \"DeviceOnlineWithName\": \"{0}-এর সাথে সংযুক্ত হয়েছে\",\n \"DeviceOfflineWithName\": \"{0}-এর সাথে সংযোগ বিচ্ছিন্ন হয"
},
{
"path": "Emby.Server.Implementations/Localization/Core/ca.json",
"chars": 9195,
"preview": "{\n \"Albums\": \"Àlbums\",\n \"AppDeviceValues\": \"Aplicació: {0}, Dispositiu: {1}\",\n \"Application\": \"Aplicació\",\n "
},
{
"path": "Emby.Server.Implementations/Localization/Core/chr.json",
"chars": 2666,
"preview": "{\n \"ChapterNameValue\": \"Didanedi {0}\",\n \"HeaderAlbumArtists\": \"Didanidanolisgisgi\",\n \"HeaderFavoriteAlbums\": \"D"
},
{
"path": "Emby.Server.Implementations/Localization/Core/cs.json",
"chars": 8493,
"preview": "{\n \"Albums\": \"Alba\",\n \"AppDeviceValues\": \"Aplikace: {0}, Zařízení: {1}\",\n \"Application\": \"Aplikace\",\n \"Artis"
},
{
"path": "Emby.Server.Implementations/Localization/Core/cy.json",
"chars": 8057,
"preview": "{\n \"DeviceOnlineWithName\": \"Mae {0} wedi'i gysylltu\",\n \"DeviceOfflineWithName\": \"Mae {0} wedi datgysylltu\",\n \"D"
},
{
"path": "Emby.Server.Implementations/Localization/Core/da.json",
"chars": 8545,
"preview": "{\n \"Albums\": \"Albummer\",\n \"AppDeviceValues\": \"App: {0}, Enhed: {1}\",\n \"Application\": \"Applikation\",\n \"Artist"
},
{
"path": "Emby.Server.Implementations/Localization/Core/de.json",
"chars": 8825,
"preview": "{\n \"Albums\": \"Alben\",\n \"AppDeviceValues\": \"App: {0}, Gerät: {1}\",\n \"Application\": \"Anwendung\",\n \"Artists\": \""
},
{
"path": "Emby.Server.Implementations/Localization/Core/el.json",
"chars": 9118,
"preview": "{\n \"Albums\": \"Άλμπουμ\",\n \"AppDeviceValues\": \"Εφαρμογή: {0}, Συσκευή: {1}\",\n \"Application\": \"Εφαρμογή\",\n \"Art"
},
{
"path": "Emby.Server.Implementations/Localization/Core/en-GB.json",
"chars": 8259,
"preview": "{\n \"Albums\": \"Albums\",\n \"AppDeviceValues\": \"App: {0}, Device: {1}\",\n \"Application\": \"Application\",\n \"Artists"
},
{
"path": "Emby.Server.Implementations/Localization/Core/en-US.json",
"chars": 8250,
"preview": "{\n \"Albums\": \"Albums\",\n \"AppDeviceValues\": \"App: {0}, Device: {1}\",\n \"Application\": \"Application\",\n \"Artists"
},
{
"path": "Emby.Server.Implementations/Localization/Core/enm.json",
"chars": 3,
"preview": "{}\n"
},
{
"path": "Emby.Server.Implementations/Localization/Core/eo.json",
"chars": 7443,
"preview": "{\n \"NotificationOptionInstallationFailed\": \"Instalada malsukceso\",\n \"NotificationOptionAudioPlaybackStopped\": \"Lud"
},
{
"path": "Emby.Server.Implementations/Localization/Core/es-AR.json",
"chars": 9147,
"preview": "{\n \"Albums\": \"Álbumes\",\n \"AppDeviceValues\": \"Aplicación: {0}, Dispositivo: {1}\",\n \"Application\": \"Aplicación\",\n"
},
{
"path": "Emby.Server.Implementations/Localization/Core/es-MX.json",
"chars": 9174,
"preview": "{\n \"Albums\": \"Álbumes\",\n \"AppDeviceValues\": \"App: {0}, Dispositivo: {1}\",\n \"Application\": \"Aplicación\",\n \"Ar"
},
{
"path": "Emby.Server.Implementations/Localization/Core/es.json",
"chars": 9147,
"preview": "{\n \"Albums\": \"Álbumes\",\n \"AppDeviceValues\": \"Aplicación: {0}, Dispositivo: {1}\",\n \"Application\": \"Aplicación\",\n"
},
{
"path": "Emby.Server.Implementations/Localization/Core/es_419.json",
"chars": 9143,
"preview": "{\n \"LabelRunningTimeValue\": \"Tiempo en ejecución: {0}\",\n \"ValueSpecialEpisodeName\": \"Especial - {0}\",\n \"Sync\": "
},
{
"path": "Emby.Server.Implementations/Localization/Core/es_DO.json",
"chars": 8358,
"preview": "{\n \"Channels\": \"Canales\",\n \"Books\": \"Libros\",\n \"Albums\": \"Álbumes\",\n \"Collections\": \"Colecciones\",\n \"Arti"
},
{
"path": "Emby.Server.Implementations/Localization/Core/et.json",
"chars": 8166,
"preview": "{\n \"TaskCleanActivityLogDescription\": \"Kustutab määratud ajast vanemad tegevuslogi kirjed.\",\n \"UserDownloadingItem"
},
{
"path": "Emby.Server.Implementations/Localization/Core/eu.json",
"chars": 8810,
"preview": "{\n \"ValueSpecialEpisodeName\": \"Berezia - {0}\",\n \"Sync\": \"Sinkronizatu\",\n \"Songs\": \"Abestiak\",\n \"Shows\": \"Ser"
},
{
"path": "Emby.Server.Implementations/Localization/Core/fa.json",
"chars": 8013,
"preview": "{\n \"Albums\": \"آلبومها\",\n \"AppDeviceValues\": \"برنامه: {0} ، دستگاه: {1}\",\n \"Application\": \"برنامه\",\n \"Artist"
},
{
"path": "Emby.Server.Implementations/Localization/Core/fi.json",
"chars": 8576,
"preview": "{\n \"HeaderLiveTV\": \"Televisio\",\n \"NewVersionIsAvailable\": \"Uusi versio Jellyfin-palvelimesta on ladattavissa.\",\n "
},
{
"path": "Emby.Server.Implementations/Localization/Core/fil.json",
"chars": 7865,
"preview": "{\n \"VersionNumber\": \"Bersyon {0}\",\n \"ValueSpecialEpisodeName\": \"Espesyal - {0}\",\n \"ValueHasBeenAddedToLibrary\":"
},
{
"path": "Emby.Server.Implementations/Localization/Core/fo.json",
"chars": 508,
"preview": "{\n \"Artists\": \"Listafólk\",\n \"Collections\": \"Søvn\",\n \"Default\": \"Sjálvgildi\",\n \"DeviceOfflineWithName\": \"{0} "
},
{
"path": "Emby.Server.Implementations/Localization/Core/fr-CA.json",
"chars": 9115,
"preview": "{\n \"Albums\": \"Albums\",\n \"AppDeviceValues\": \"App : {0}, Appareil : {1}\",\n \"Application\": \"Application\",\n \"Art"
},
{
"path": "Emby.Server.Implementations/Localization/Core/fr.json",
"chars": 9197,
"preview": "{\n \"Albums\": \"Albums\",\n \"AppDeviceValues\": \"Application : {0}, Appareil : {1}\",\n \"Application\": \"Application\",\n"
},
{
"path": "Emby.Server.Implementations/Localization/Core/ga.json",
"chars": 8911,
"preview": "{\n \"Albums\": \"Albaim\",\n \"Artists\": \"Ealaíontóirí\",\n \"AuthenticationSucceededWithUserName\": \"D'éirigh le fíordhe"
},
{
"path": "Emby.Server.Implementations/Localization/Core/gl.json",
"chars": 8853,
"preview": "{\n \"Albums\": \"Álbums\",\n \"Collections\": \"Coleccións\",\n \"ChapterNameValue\": \"Capítulo {0}\",\n \"Channels\": \"Canl"
}
]
// ... and 2129 more files (download for full content)
About this extraction
This page contains the full source code of the jellyfin/jellyfin GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2329 files (11.5 MB), approximately 3.1M tokens, and a symbol index with 9378 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.