aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.config/dotnet-tools.json2
-rw-r--r--.github/workflows/ci-codeql-analysis.yml6
-rw-r--r--.github/workflows/ci-tests.yml4
-rw-r--r--.github/workflows/commands.yml4
-rw-r--r--.github/workflows/issue-template-check.yml4
-rw-r--r--Directory.Build.targets5
-rw-r--r--Directory.Packages.props36
-rw-r--r--Emby.Server.Implementations/Localization/Core/et.json8
-rw-r--r--Emby.Server.Implementations/Localization/Core/hi.json110
-rw-r--r--Emby.Server.Implementations/Localization/Core/ja.json28
-rw-r--r--Emby.Server.Implementations/Localization/Core/ko.json6
-rw-r--r--Emby.Server.Implementations/Localization/Core/lt-LT.json12
-rw-r--r--Emby.Server.Implementations/Localization/Core/ml.json16
-rw-r--r--Emby.Server.Implementations/Localization/Core/ms.json8
-rw-r--r--Emby.Server.Implementations/Localization/Core/pl.json2
-rw-r--r--Emby.Server.Implementations/Localization/Core/zh-CN.json2
-rw-r--r--Jellyfin.Api/Controllers/SubtitleController.cs6
-rw-r--r--Jellyfin.Server/Resources/Configuration/logging.json3
-rw-r--r--Jellyfin.sln329
-rw-r--r--Jellyfin.slnx59
-rw-r--r--Jellyfin.slnx.DotSettings (renamed from Jellyfin.sln.DotSettings)0
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs41
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs2
-rw-r--r--README.md2
-rw-r--r--tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs22
-rw-r--r--tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs15
-rw-r--r--tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo6
27 files changed, 288 insertions, 450 deletions
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index e7d991d94a..e8f57cf776 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"dotnet-ef": {
- "version": "10.0.11",
+ "version": "10.0.14",
"commands": [
"dotnet-ef"
]
diff --git a/.github/workflows/ci-codeql-analysis.yml b/.github/workflows/ci-codeql-analysis.yml
index dace489adf..8de5078bab 100644
--- a/.github/workflows/ci-codeql-analysis.yml
+++ b/.github/workflows/ci-codeql-analysis.yml
@@ -32,13 +32,13 @@ jobs:
dotnet-version: '10.0.x'
- name: Initialize CodeQL
- uses: github/codeql-action/init@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
+ uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
with:
languages: ${{ matrix.language }}
queries: +security-extended
- name: Autobuild
- uses: github/codeql-action/autobuild@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
+ uses: github/codeql-action/autobuild@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@24c54180a607b1449ed407dd24f251e4e9147c8d # v4.38.3
+ uses: github/codeql-action/analyze@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml
index 7fc22ed001..5d31216d6a 100644
--- a/.github/workflows/ci-tests.yml
+++ b/.github/workflows/ci-tests.yml
@@ -28,14 +28,14 @@ jobs:
- name: Run DotNet CLI Tests
run: >
- dotnet test Jellyfin.sln
+ dotnet test Jellyfin.slnx
--configuration Release
--collect:"XPlat Code Coverage"
--settings tests/coverletArgs.runsettings
--verbosity minimal
- name: Merge code coverage results
- uses: danielpalme/ReportGenerator-GitHub-Action@d3ebf1f760f7d8ab92cc44d9bcfee7ad73722a31 # v5.5.11
+ uses: danielpalme/ReportGenerator-GitHub-Action@861674232075b2c6bd1405a04c4bb9b150653e81 # v5.5.12
with:
reports: "**/coverage.cobertura.xml"
targetdir: "merged/"
diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml
index d14ce6d508..93841530e9 100644
--- a/.github/workflows/commands.yml
+++ b/.github/workflows/commands.yml
@@ -45,9 +45,9 @@ jobs:
repository: jellyfin/jellyfin-triage-script
- name: install python
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
- python-version: '3.14'
+ python-version: '3.15'
cache: 'pip'
- name: install python packages
diff --git a/.github/workflows/issue-template-check.yml b/.github/workflows/issue-template-check.yml
index 3220bcbeac..829356f731 100644
--- a/.github/workflows/issue-template-check.yml
+++ b/.github/workflows/issue-template-check.yml
@@ -15,9 +15,9 @@ jobs:
repository: jellyfin/jellyfin-triage-script
- name: install python
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
- python-version: '3.14'
+ python-version: '3.15'
cache: 'pip'
- name: install python packages
diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 0000000000..3ef8616b87
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,5 @@
+<Project>
+ <!-- A Clean of a referenced project that reaches a shared instance before the solution's Rebuild skips
+ NuGet contentFiles preprocessing, and the Build that follows would compile without those sources. -->
+ <Target Name="_ProduceContentAssetsSkippedByClean" BeforeTargets="CoreCompile" DependsOnTargets="RunProduceContentAssets" />
+</Project>
diff --git a/Directory.Packages.props b/Directory.Packages.props
index a68ab68934..d533ad29e6 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -26,27 +26,27 @@
<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.12" />
- <PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.12" />
+ <PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.14" />
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="5.6.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="5.9.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.9.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="5.9.0" />
- <PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.12" />
- <PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.12" />
- <PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.12" />
- <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.12" />
- <PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.12" />
- <PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.12" />
+ <PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.14" />
+ <PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.14" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.11.0" />
<PackageVersion Include="MimeTypes" Version="2.5.2" />
<PackageVersion Include="Morestachio" Version="5.0.1.670" />
@@ -78,7 +78,7 @@
<PackageVersion Include="Svg.Skia" Version="3.7.0" />
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="10.2.3" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="10.2.3" />
- <PackageVersion Include="System.Text.Json" Version="10.0.13" />
+ <PackageVersion Include="System.Text.Json" Version="10.0.14" />
<PackageVersion Include="TagLibSharp" Version="2.3.0" />
<PackageVersion Include="z440.atl.core" Version="7.18.0" />
<PackageVersion Include="TMDbLib" Version="3.0.0" />
diff --git a/Emby.Server.Implementations/Localization/Core/et.json b/Emby.Server.Implementations/Localization/Core/et.json
index a7afcf5b77..36be172e77 100644
--- a/Emby.Server.Implementations/Localization/Core/et.json
+++ b/Emby.Server.Implementations/Localization/Core/et.json
@@ -95,16 +95,16 @@
"HearingImpaired": "Kuulmispuudega",
"TaskKeyframeExtractorDescription": "Eraldab videofailidest võtmekaadrid, et luua täpsemaid HLS-i esitusloendeid. See võib kesta pikka aega.",
"TaskKeyframeExtractor": "Eralda võtmekaadrid",
- "TaskRefreshTrickplayImages": "Loo trickplay pildid",
- "TaskRefreshTrickplayImagesDescription": "Loob trickplay eelvaated videotele lubatud meediakogudes.",
+ "TaskRefreshTrickplayImages": "Loo kerimispildid (trickplay)",
+ "TaskRefreshTrickplayImagesDescription": "Loob lubatud meediakogudes videotele kerimispildid.",
"TaskAudioNormalization": "Normaliseeri helitugevus",
"TaskAudioNormalizationDescription": "Otsib failidest helitugevuse normaliseerimise teavet.",
"TaskDownloadMissingLyrics": "Hangi puuduvad laulusõnad",
"TaskDownloadMissingLyricsDescription": "Laulusõnade allalaadimine",
- "TaskMoveTrickplayImagesDescription": "Liigutab trickplay pildid meediakogu sätete kohaselt.",
+ "TaskMoveTrickplayImagesDescription": "Teisaldab kerimispildid meediakogu sätete kohaselt.",
"TaskExtractMediaSegments": "Skaneeri meedialõike",
"TaskExtractMediaSegmentsDescription": "Eraldab või võtab meedialõigud MediaSegment'i toega pluginatest.",
- "TaskMoveTrickplayImages": "Muuda trickplay piltide asukoht",
+ "TaskMoveTrickplayImages": "Muuda kerimispiltide asukoht",
"CleanupUserDataTask": "Puhasta kasutajaandmed",
"CleanupUserDataTaskDescription": "Puhastab kõik kasutajaandmed (vaatamise olek, lemmikute olek jne) meediast, mida pole enam vähemalt 90 päeva saadaval olnud.",
"LyricDownloadFailureFromForItem": "Laulusõnade hankimine teenusest {0} loole {1} nurjus",
diff --git a/Emby.Server.Implementations/Localization/Core/hi.json b/Emby.Server.Implementations/Localization/Core/hi.json
index 491345b380..766a09ffc9 100644
--- a/Emby.Server.Implementations/Localization/Core/hi.json
+++ b/Emby.Server.Implementations/Localization/Core/hi.json
@@ -2,103 +2,103 @@
"HeaderNextUp": "इसके आगे",
"HeaderLiveTV": "लाइव टीवी",
"HeaderFavoriteShows": "पसंदीदा शो",
- "HeaderFavoriteEpisodes": "पसंदीदा प्रकरण",
- "HeaderContinueWatching": "देखना जारी रखें",
+ "HeaderFavoriteEpisodes": "पसंदीदा भाग",
+ "HeaderContinueWatching": "देखते रहें",
"Genres": "शैलियां",
- "Forced": "बलपूर्वक",
+ "Forced": "ज़रूरी",
"Folders": "फ़ोल्डर",
"Favorites": "पसंदीदा",
"FailedLoginAttemptWithUserName": "{0} से संप्रवेश असफल हुआ",
- "Default": "प्राथमिक",
+ "Default": "मूल",
"Collections": "संग्रह",
"ChapterNameValue": "अध्याय {0}",
"Books": "किताबें",
- "AuthenticationSucceededWithUserName": "{0} सफलतापूर्वक प्रमाणित किया गया",
+ "AuthenticationSucceededWithUserName": "{0} प्रमाणीकरण सफल हुआ",
"Artists": "कलाकार",
"AppDeviceValues": "एप: {0}, उपकरण: {1}",
"NotificationOptionPluginUninstalled": "प्लगइन अनइंस्टाल हो गया",
"NotificationOptionPluginInstalled": "प्लगइन इनस्टॉल हो गया",
- "NotificationOptionPluginError": "प्लगइन फ़ैल हो गया",
- "NotificationOptionInstallationFailed": "इंस्टालेशन फ़ैल हो गया",
+ "NotificationOptionPluginError": "प्लगिन असफल",
+ "NotificationOptionInstallationFailed": "इंस्टालेशन असफल",
"NotificationOptionAudioPlaybackStopped": "संगीत बंद कर दिया गया",
- "NotificationOptionAudioPlayback": "संगीत शुरू कर दिया गया",
- "NotificationOptionCameraImageUploaded": "कैमरा फोटो अपलोड किया गया",
- "NotificationOptionApplicationUpdateInstalled": "एप्लीकेशन अपडेट इनस्टॉल कर दिया है",
+ "NotificationOptionAudioPlayback": "आवाज़ चलनी शुरू हो गई",
+ "NotificationOptionCameraImageUploaded": "कैमरा फोटो अपलोड हो गई",
+ "NotificationOptionApplicationUpdateInstalled": "एप्लीकेशन अपडेट इनस्टॉल हो गया",
"NotificationOptionApplicationUpdateAvailable": "एप्लीकेशन अपडेट उपलब्ध है",
"NewVersionIsAvailable": "जेलीफिन सर्वर का एक नया वर्जन डाउनलोड के लिए उपलब्ध है।",
- "NameSeasonUnknown": "अनजान भाग",
- "NameSeasonNumber": "भाग {0}",
- "NameInstallFailed": "{0} इनस्टॉल करते समय फेल हो गया है",
+ "NameSeasonUnknown": "अनजान कड़ी",
+ "NameSeasonNumber": "कड़ी {0}",
+ "NameInstallFailed": "{0} इंस्टॉलेशन असफल रहा",
"MusicVideos": "संगीत वीडियो",
"Music": "संगीत",
- "Movies": "फ़िल्म",
+ "Movies": "फ़िल्में",
"MixedContent": "मिला-जुला कंटेंट",
"Latest": "सबसे नया",
"LabelIpAddressValue": "आई पी एड्रेस: {0}",
- "HomeVideos": "होम चलचित्र",
- "NotificationOptionVideoPlayback": "वीडियो प्लेबैक शुरू हुआ",
- "NotificationOptionUserLockedOut": "उपयोगकर्ता लॉक हो गया",
- "NotificationOptionTaskFailed": "निर्धारित कार्य विफलता",
- "NotificationOptionServerRestartRequired": "सर्वर पुनरारंभ आवश्यक है",
+ "HomeVideos": "घर के वीडियो",
+ "NotificationOptionVideoPlayback": "वीडियो चल गया",
+ "NotificationOptionUserLockedOut": "यूज़र लॉक हो गया",
+ "NotificationOptionTaskFailed": "निर्धारित कार्य विफल रहा",
+ "NotificationOptionServerRestartRequired": "सर्वर रिस्टार्ट की ज़रूरत है",
"NotificationOptionPluginUpdateInstalled": "प्लगिन अपडेट इंस्टॉल हो गया है",
- "NotificationOptionNewLibraryContent": "नई सामग्री जोड़ी गई",
- "LabelRunningTimeValue": "चलने का समय: {0}",
- "Inherit": "इनहेरिट",
- "NotificationOptionVideoPlaybackStopped": "चलचित्र रुका हुआ",
- "PluginUninstalledWithName": "{0} अनइंस्टॉल हुए",
- "PluginInstalledWithName": "{0} इंस्टॉल हुए",
+ "NotificationOptionNewLibraryContent": "नई चीजें जोड़ी गई",
+ "LabelRunningTimeValue": "अवधि : {0}",
+ "Inherit": "ऊपर से लागू",
+ "NotificationOptionVideoPlaybackStopped": "वीडियो बंद हो गया",
+ "PluginUninstalledWithName": "{0} अनइंस्टॉल हो गए",
+ "PluginInstalledWithName": "{0} इंस्टॉल हो गए",
"Photos": "तस्वीरें",
"External": "बाहरी",
"PluginUpdatedWithName": "{0} अपडेट हुए",
"UserStartedPlayingItemWithValues": "{0} {2} पर {1} चला रहे हैं",
- "UserStoppedPlayingItemWithValues": "{0} ने {2} पर {1} खेलना खत्म किया",
+ "UserStoppedPlayingItemWithValues": "{0} ने {2} पर {1} ख़त्म कर दिया",
"StartupEmbyServerIsLoading": "जेलीफ़िन सर्वर लोड हो रहा है। कृपया थोड़ी देर में दोबारा कोशिश करें।",
- "UserCreatedWithName": "उपयोगकर्ता {0} बनाया गया",
+ "UserCreatedWithName": "यूज़र {0} बनाया गया",
"UserDownloadingItemWithValues": "{0} डाउनलोड हो रहा है",
"UserOfflineFromDevice": "{0} {1} से डिस्कनेक्ट हो गया है",
"Undefined": "अनिर्धारित",
"UserOnlineFromDevice": "{0} {1} से ऑनलाइन है",
"Shows": "शो",
- "UserPasswordChangedWithName": "उपयोगकर्ता {0} के लिए पासवर्ड बदल दिया गया है",
- "UserDeletedWithName": "उपयोगकर्ता {0} हटा दिया गया",
- "SubtitleDownloadFailureFromForItem": "{1} के लिए {0} से उपशीर्षक डाउनलोड करने में विफल",
+ "UserPasswordChangedWithName": "{0} यूज़र का पासवर्ड बदल दिया गया है",
+ "UserDeletedWithName": "यूज़र {0} हटा दिया गया",
+ "SubtitleDownloadFailureFromForItem": "{1} के लिए {0} से सबटाइटल डाउनलोड करने में विफल",
"ScheduledTaskFailedWithName": "{0}असफल",
- "UserLockedOutWithName": "उपयोगकर्ता {0} को लॉक आउट कर दिया गया है",
+ "UserLockedOutWithName": "यूज़र {0} को बाहर लॉक कर दिया गया है",
"TvShows": "टीवी शो",
"HearingImpaired": "मूक बधिर",
"TasksMaintenanceCategory": "रखरखाव",
"VersionNumber": "{0} पाठान्तर",
"TasksLibraryCategory": "लाइब्रेरी",
"TaskOptimizeDatabase": "डेटाबेस ट्यून करें",
- "TaskDownloadMissingSubtitles": "लापता अनुलेख डाउनलोड करें",
- "TaskRefreshLibrary": "माध्यम संग्राहत को छाने",
- "TaskCleanActivityLog": "क्रियाकलाप लॉग साफ करें",
- "TasksChannelsCategory": "इंटरनेट प्रणाली",
- "TasksApplicationCategory": "अनुप्रयोग",
- "TaskRefreshPeople": "लोगोकी जानकारी ताज़ी करें",
+ "TaskDownloadMissingSubtitles": "बाक़ी सबटाइटल डाउनलोड करें",
+ "TaskRefreshLibrary": "मीडिया लाइब्रेरी को छानें",
+ "TaskCleanActivityLog": "एक्टिविटी लॉग हटायें",
+ "TasksChannelsCategory": "इंटरनेट चैनल",
+ "TasksApplicationCategory": "ऐप्लिकेशन",
+ "TaskRefreshPeople": "लोगों की जानकारी ताज़ा करें",
"TaskKeyframeExtractor": "कीफ़्रेम एक्सट्रैक्टर",
"TaskCleanActivityLogDescription": "कॉन्फ़िगर की गई आयु से पुरानी गतिविधि लॉग प्रविष्टियां हटाता है।",
- "TaskRefreshChapterImagesDescription": "अध्याय वाले वीडियो के लिए थंबनेल बनाता है।",
+ "TaskRefreshChapterImagesDescription": "अध्याय वाले वीडियो के लिए झलकें बनाता है।",
"TaskRefreshLibraryDescription": "नई फ़ाइलों के लिए आपकी मीडिया लाइब्रेरी को स्कैन करता है और मेटाडेटा को ताज़ा करता है।",
- "TaskCleanLogs": "स्वच्छ लॉग निर्देशिका",
- "TaskUpdatePluginsDescription": "प्लगइन्स के लिए अपडेट डाउनलोड और इंस्टॉल करें जो स्वचालित रूप से अपडेट करने के लिए कॉन्फ़िगर किए गए हैं।",
- "TaskCleanTranscode": "ट्रांसकोड डाइरेक्टरी साफ़ करें",
+ "TaskCleanLogs": "लॉग डाइरेक्टरी ख़ाली करें",
+ "TaskUpdatePluginsDescription": "अपने आप अपडेट होने वाले निर्धारित प्लगिंस के लिए अपडेट डाउनलोड और इंस्टॉल करता है।",
+ "TaskCleanTranscode": "ट्रांसकोड डाइरेक्टरी ख़ाली करें",
"TaskCleanTranscodeDescription": "एक दिन से ज़्यादा पुरानी ट्रांसकोड फ़ाइलें हटाता है।",
"TaskRefreshChannelsDescription": "इंटरनेट चैनल की जानकारी को ताज़ा करता है।",
"TaskOptimizeDatabaseDescription": "डेटाबेस को छोटा करके जगह ख़ाली करता है। लाइब्रेरी का निरीक्षण या डेटाबेस में बदलाव के बाद इस कार्य को चलाने से कार्यकुशलता बढ़ सकती है।",
"TaskRefreshChannels": "चैनल ताज़ा करें",
- "TaskRefreshChapterImages": "अध्याय छवियाँ निकालें",
+ "TaskRefreshChapterImages": "अध्याय की तस्वीरें निकालें",
"TaskCleanLogsDescription": "{0} दिन से अधिक पुरानी लॉग फ़ाइलें हटाता है।",
- "TaskCleanCacheDescription": "उन कैश फ़ाइलों को हटाता है जिनकी अब सिस्टम को आवश्यकता नहीं है।",
- "TaskUpdatePlugins": "अद्यतन प्लगइन्स",
+ "TaskCleanCacheDescription": "अनावश्यक अस्थायी डेटा फ़ाइलों को हटाता है।",
+ "TaskUpdatePlugins": "प्लगिन अपडेट करें",
"TaskRefreshPeopleDescription": "आपकी मीडिया लाइब्रेरी में अभिनेताओं और निर्देशकों के लिए मेटाडेटा अपडेट करता है।",
- "TaskCleanCache": "स्वच्छ कैश निर्देशिका",
- "TaskDownloadMissingSubtitlesDescription": "मेटाडेटा कॉन्फ़िगरेशन के आधार पर लापता उपशीर्षक के लिए इंटरनेट खोजता है।",
+ "TaskCleanCache": "अस्थायी डेटा डाइरेक्टरी ख़ाली करें",
+ "TaskDownloadMissingSubtitlesDescription": "मेटाडेटा कॉन्फ़िगरेशन के आधार पर लापता सबटाइटल की इंटरनेट पर खोज करता है।",
"TaskKeyframeExtractorDescription": "अधिक सटीक एचएलएस प्लेलिस्ट बनाने के लिए वीडियो फ़ाइलों से मुख्य-फ़्रेम निकालता है। यह कार्य लंबे समय तक चल सकता है।",
- "TaskRefreshTrickplayImages": "ट्रिकप्लै चित्रों को सृजन करे",
- "TaskRefreshTrickplayImagesDescription": "नियत संग्रहों में चलचित्रों का ट्रीकप्लै दर्शनों को सृजन करे.",
- "TaskAudioNormalization": "श्रव्य सामान्यीकरण",
- "TaskAudioNormalizationDescription": "श्रव्य सामान्यीकरण के लिए फाइलें अन्वेषण करें।",
+ "TaskRefreshTrickplayImages": "ट्रिकप्ले तस्वीरें बनायें",
+ "TaskRefreshTrickplayImagesDescription": "चुनिंदा लाइब्रेरी के वीडियो के लिए ट्रिकप्ले तस्वीरें (सीन झलकियां) बनाता है।",
+ "TaskAudioNormalization": "ध्वनि सामान्यीकरण",
+ "TaskAudioNormalizationDescription": "ध्वनि सामान्यीकरण के लिए फाइलें छानें।",
"TaskDownloadMissingLyrics": "बाकी बोल डाउनलोड करें",
"TaskDownloadMissingLyricsDescription": "गीत के बोल डाउनलोड करें",
"TaskExtractMediaSegments": "मीडिया सेगमेंट स्कैन",
@@ -108,18 +108,18 @@
"CleanupUserDataTask": "यूज़र डेटा सफाई कार्य",
"Original": "असली",
"LyricDownloadFailureFromForItem": "{0} के लिए {1} से बोल (Lyrics) डाउनलोड करने में विफल रहा",
- "NameExtraBehindTheScenes": "परदे के पीछे",
+ "NameExtraBehindTheScenes": "पर्दे के पीछे",
"NameExtraClip": "क्लिप",
"NameExtraDeletedScene": "काटे गए सीन",
"NameExtraFeaturette": "फीचरेट",
"NameExtraInterview": "साक्षात्कार",
"NameExtraNumbered": "{0} {1}",
"NameExtraSample": "नमूना",
- "NameExtraScene": "दृश्य",
+ "NameExtraScene": "सीन",
"NameExtraShort": "शॉर्ट",
- "NameExtraThemeSong": "थीम सॉन्ग",
- "NameExtraThemeVideo": "थीम वीडियो",
+ "NameExtraThemeSong": "विशेष गीत",
+ "NameExtraThemeVideo": "विशेष वीडियो",
"NameExtraTrailer": "ट्रेलर",
- "NameExtraUnknown": "अतिरिक्त",
+ "NameExtraUnknown": "और भी",
"CleanupUserDataTaskDescription": "९० दिन या उससे ज़्यादा से ग़ायब मीडिया से सभी यूज़र डेटा (देखें गए, पसंदीदा आदि) को हटाता है।"
}
diff --git a/Emby.Server.Implementations/Localization/Core/ja.json b/Emby.Server.Implementations/Localization/Core/ja.json
index 24008575d4..185d4b5e1f 100644
--- a/Emby.Server.Implementations/Localization/Core/ja.json
+++ b/Emby.Server.Implementations/Localization/Core/ja.json
@@ -12,7 +12,7 @@
"HeaderContinueWatching": "視聴をつづける",
"HeaderFavoriteEpisodes": "お気に入りのエピソード",
"HeaderFavoriteShows": "お気に入りの番組",
- "HeaderLiveTV": "ライブTV",
+ "HeaderLiveTV": "テレビ放送",
"HeaderNextUp": "次に再生",
"HomeVideos": "ホームビデオ",
"Inherit": "継承",
@@ -31,16 +31,16 @@
"NotificationOptionApplicationUpdateInstalled": "アプリケーションは最新です",
"NotificationOptionAudioPlayback": "オーディオの再生を開始",
"NotificationOptionAudioPlaybackStopped": "オーディオの再生を停止",
- "NotificationOptionCameraImageUploaded": "カメライメージがアップロードされました",
+ "NotificationOptionCameraImageUploaded": "カメライメージをアップロードしました",
"NotificationOptionInstallationFailed": "インストール失敗",
"NotificationOptionNewLibraryContent": "新しいコンテンツを追加しました",
- "NotificationOptionPluginError": "プラグインに障害が発生しました",
+ "NotificationOptionPluginError": "プラグインで失敗",
"NotificationOptionPluginInstalled": "プラグインをインストールしました",
"NotificationOptionPluginUninstalled": "プラグインをアンインストールしました",
"NotificationOptionPluginUpdateInstalled": "プラグインのアップデートをインストールしました",
- "NotificationOptionServerRestartRequired": "サーバーを再起動してください",
- "NotificationOptionTaskFailed": "スケジュールされていたタスクの失敗",
- "NotificationOptionUserLockedOut": "ユーザーはロックされています",
+ "NotificationOptionServerRestartRequired": "要サーバー再起動",
+ "NotificationOptionTaskFailed": "スケジュールタスクの失敗",
+ "NotificationOptionUserLockedOut": "ユーザーをロックしました",
"NotificationOptionVideoPlayback": "動画の再生を開始",
"NotificationOptionVideoPlaybackStopped": "ビデオの再生を停止",
"Photos": "フォト",
@@ -49,18 +49,18 @@
"PluginUpdatedWithName": "{0} を更新しました",
"ScheduledTaskFailedWithName": "{0} が失敗しました",
"Shows": "番組",
- "StartupEmbyServerIsLoading": "Jellyfin Server は現在読み込み中です。しばらくしてからもう一度お試しください。",
+ "StartupEmbyServerIsLoading": "Jellyfin Server は現在読み込み中です。しばらくしてから、やり直してください。",
"SubtitleDownloadFailureFromForItem": "{0} から {1}の字幕のダウンロードに失敗しました",
"TvShows": "テレビ番組",
- "UserCreatedWithName": "ユーザー {0} が作成されました",
+ "UserCreatedWithName": "ユーザー {0} を作成しました",
"UserDeletedWithName": "User {0} を削除しました",
- "UserDownloadingItemWithValues": "{0} が {1} をダウンロードしています",
- "UserLockedOutWithName": "ユーザー {0} はロックされています",
+ "UserDownloadingItemWithValues": "{0} が {1} をダウンロード中",
+ "UserLockedOutWithName": "ユーザー {0} はロックしています",
"UserOfflineFromDevice": "{0} は {1} から切断しました",
"UserOnlineFromDevice": "{0} は {1} からオンラインになりました",
"UserPasswordChangedWithName": "ユーザー {0} のパスワードは変更されました",
"UserStartedPlayingItemWithValues": "{0} は {2}で{1} を再生しています",
- "UserStoppedPlayingItemWithValues": "{0} は{2}で{1} の再生が終わりました",
+ "UserStoppedPlayingItemWithValues": "{0} は{2}で{1} の再生を完了",
"VersionNumber": "バージョン {0}",
"TaskCleanLogsDescription": "{0} 日以上前のログを消去します。",
"TaskCleanLogs": "ログの掃除",
@@ -101,8 +101,8 @@
"TaskAudioNormalizationDescription": "音声の正規化データのためにファイルをスキャンします。",
"TaskDownloadMissingLyricsDescription": "歌詞をダウンロード",
"TaskExtractMediaSegments": "メディアセグメントを読み取る",
- "TaskMoveTrickplayImages": "Trickplayの画像を移動",
- "TaskMoveTrickplayImagesDescription": "ライブラリ設定によりTrickplayのファイルを移動。",
+ "TaskMoveTrickplayImages": "Trickplay 画像の場所を移行",
+ "TaskMoveTrickplayImagesDescription": "ライブラリーの設定に従って、既存の Trickplay ファイルを移動します。",
"TaskDownloadMissingLyrics": "欠けている歌詞をダウンロード",
"TaskExtractMediaSegmentsDescription": "MediaSegment 対応プラグインからメディア セグメントを抽出または取得します。",
"CleanupUserDataTask": "ユーザーデータのクリーンアップタスク",
@@ -113,7 +113,7 @@
"NameExtraBehindTheScenes": "舞台裏",
"NameExtraClip": "クリップ",
"NameExtraDeletedScene": "未公開シーン",
- "NameExtraFeaturette": "短編",
+ "NameExtraFeaturette": "メイキング",
"NameExtraInterview": "インタビュー",
"NameExtraNumbered": "{0} {1}",
"NameExtraSample": "サンプル",
diff --git a/Emby.Server.Implementations/Localization/Core/ko.json b/Emby.Server.Implementations/Localization/Core/ko.json
index 280d96effe..72a521743e 100644
--- a/Emby.Server.Implementations/Localization/Core/ko.json
+++ b/Emby.Server.Implementations/Localization/Core/ko.json
@@ -117,5 +117,9 @@
"NameExtraScene": "장면",
"NameExtraTrailer": "예고편",
"NameExtraUnknown": "부가영상",
- "NameExtraThemeSong": "주제가"
+ "NameExtraThemeSong": "주제가",
+ "NameExtraBehindTheScenes": "비하인드 영상",
+ "NameExtraFeaturette": "피처렛",
+ "NameExtraShort": "단편",
+ "NameExtraThemeVideo": "테마 영상"
}
diff --git a/Emby.Server.Implementations/Localization/Core/lt-LT.json b/Emby.Server.Implementations/Localization/Core/lt-LT.json
index db4710ddca..20c4c4a61c 100644
--- a/Emby.Server.Implementations/Localization/Core/lt-LT.json
+++ b/Emby.Server.Implementations/Localization/Core/lt-LT.json
@@ -10,8 +10,8 @@
"Folders": "Aplankai",
"Genres": "Žanrai",
"HeaderContinueWatching": "Žiūrėti toliau",
- "HeaderFavoriteEpisodes": "Mėgstami Epizodai",
- "HeaderFavoriteShows": "Mėgstamos TV Laidos",
+ "HeaderFavoriteEpisodes": "Mėgstamos serijos",
+ "HeaderFavoriteShows": "Mėgstami serialai",
"HeaderLiveTV": "Tiesioginė TV",
"HeaderNextUp": "Toliau",
"HomeVideos": "Namų vaizdo įrašai",
@@ -48,10 +48,10 @@
"PluginUninstalledWithName": "{0} buvo pašalintas",
"PluginUpdatedWithName": "{0} buvo atnaujintas",
"ScheduledTaskFailedWithName": "{0} nepavyko",
- "Shows": "Laidos",
+ "Shows": "Serialai",
"StartupEmbyServerIsLoading": "Jellyfin Server kraunasi. Netrukus pabandykite dar kartą.",
"SubtitleDownloadFailureFromForItem": "{1} subtitrai buvo nesėkmingai parsiųsti iš {0}",
- "TvShows": "TV Laidos",
+ "TvShows": "TV serialai",
"UserCreatedWithName": "Buvo sukurtas {0} naudotojas",
"UserDeletedWithName": "Naudotojas {0} ištrintas",
"UserDownloadingItemWithValues": "{0} siunčiasi {1}",
@@ -109,8 +109,8 @@
"CleanupUserDataTaskDescription": "Iš medijos, kurios nebėra bent 90 dienų, išvalo visus naudotojo duomenis (žiūrėjimo būseną, mėgstamą būseną ir t. t.).",
"LyricDownloadFailureFromForItem": "Nepavyko atsisiųsti dainos teksto iš {0}, skirto {1}",
"NameExtraBehindTheScenes": "Užkulisiuose",
- "NameExtraClip": "Klipas",
- "NameExtraDeletedScene": "Ištrinta scena",
+ "NameExtraClip": "Ištrauka",
+ "NameExtraDeletedScene": "Iškirpta scena",
"NameExtraInterview": "Interviu",
"NameExtraNumbered": "{0} {1}",
"NameExtraSample": "Pavyzdys",
diff --git a/Emby.Server.Implementations/Localization/Core/ml.json b/Emby.Server.Implementations/Localization/Core/ml.json
index dbf2ed4648..a2fb4b12fb 100644
--- a/Emby.Server.Implementations/Localization/Core/ml.json
+++ b/Emby.Server.Implementations/Localization/Core/ml.json
@@ -103,5 +103,19 @@
"TaskDownloadMissingLyrics": "ഇല്ലാത്ത വരികൾ ഡൗൺലോഡ് ചെയ്യുക",
"TaskDownloadMissingLyricsDescription": "പാട്ടുകളുടെ വരികൾ ഡൗൺലോഡ് ചെയ്യുന്നു",
"TaskExtractMediaSegments": "മീഡിയ സെഗ്‌മെന്റ് സ്‌കാൻ",
- "TaskExtractMediaSegmentsDescription": "മീഡിയസെഗ്മെന്റ് പ്രാപ്തമാക്കിയ പ്ലഗിനുകളിൽ നിന്ന് മീഡിയ സെഗ്‌മെന്റുകൾ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുന്നു അല്ലെങ്കിൽ നേടുന്നു."
+ "TaskExtractMediaSegmentsDescription": "മീഡിയസെഗ്മെന്റ് പ്രാപ്തമാക്കിയ പ്ലഗിനുകളിൽ നിന്ന് മീഡിയ സെഗ്‌മെന്റുകൾ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുന്നു അല്ലെങ്കിൽ നേടുന്നു.",
+ "LyricDownloadFailureFromForItem": "{1}-ന് വേണ്ടിയുള്ള വരികൾ {0}-ൽ നിന്ന് ഡൗൺലോഡ് ചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു",
+ "NameExtraBehindTheScenes": "അണിയറയിൽ",
+ "NameExtraClip": "ക്ലിപ്പ്",
+ "NameExtraDeletedScene": "ഒഴിവാക്കിയ രംഗം",
+ "NameExtraFeaturette": "ലഘുചിത്രം",
+ "NameExtraInterview": "അഭിമുഖം",
+ "NameExtraNumbered": "{0} {1}",
+ "NameExtraSample": "മാതൃക",
+ "NameExtraScene": "രംഗം",
+ "NameExtraThemeSong": "പ്രതിപാദ്യ ഗാനം",
+ "NameExtraTrailer": "ട്രെയ്‌ലർ",
+ "CleanupUserDataTask": "ഉപയോക്തൃ ഡാറ്റ ശുദ്ധീകരണ ദൗത്യം",
+ "CleanupUserDataTaskDescription": "കുറഞ്ഞത് 90 ദിവസമായി ലഭ്യമല്ലാത്ത മീഡിയയിൽ നിന്നുള്ള എല്ലാ ഉപയോക്തൃ ഡാറ്റയും (കാണൽ നില, പ്രിയപ്പെട്ടവയായി അടയാളപ്പെടുത്തിയത് തുടങ്ങിയവ) നീക്കം ചെയ്യുന്നു.",
+ "NameExtraUnknown": "എക്സ്ട്ര"
}
diff --git a/Emby.Server.Implementations/Localization/Core/ms.json b/Emby.Server.Implementations/Localization/Core/ms.json
index bb4469ad9c..12f68f09bd 100644
--- a/Emby.Server.Implementations/Localization/Core/ms.json
+++ b/Emby.Server.Implementations/Localization/Core/ms.json
@@ -112,5 +112,11 @@
"NameExtraClip": "Klip",
"NameExtraInterview": "Temu bual",
"NameExtraThemeSong": "Lagu Tema",
- "NameExtraThemeVideo": "Video Tema"
+ "NameExtraThemeVideo": "Video Tema",
+ "NameExtraDeletedScene": "Adegan yang Dibuang",
+ "NameExtraSample": "Contoh",
+ "NameExtraScene": "Adegan",
+ "NameExtraTrailer": "Pratonton",
+ "NameExtraUnknown": "Tambahan",
+ "Original": "Asal"
}
diff --git a/Emby.Server.Implementations/Localization/Core/pl.json b/Emby.Server.Implementations/Localization/Core/pl.json
index 71909fd73a..e2cd75131a 100644
--- a/Emby.Server.Implementations/Localization/Core/pl.json
+++ b/Emby.Server.Implementations/Localization/Core/pl.json
@@ -115,7 +115,7 @@
"NameExtraFeaturette": "Film średniometrażowy",
"NameExtraInterview": "Wywiad",
"NameExtraNumbered": "{0} {1}",
- "NameExtraSample": "Fragment",
+ "NameExtraSample": "Próbka",
"NameExtraScene": "Scena",
"NameExtraShort": "Film krótkometrażowy",
"NameExtraThemeSong": "Czołówka",
diff --git a/Emby.Server.Implementations/Localization/Core/zh-CN.json b/Emby.Server.Implementations/Localization/Core/zh-CN.json
index 7c61ce6f17..fce89050e2 100644
--- a/Emby.Server.Implementations/Localization/Core/zh-CN.json
+++ b/Emby.Server.Implementations/Localization/Core/zh-CN.json
@@ -6,7 +6,7 @@
"ChapterNameValue": "章节 {0}",
"Collections": "合集",
"FailedLoginAttemptWithUserName": "来自 {0} 的登录失败",
- "Favorites": "收藏夹",
+ "Favorites": "收藏",
"Folders": "文件夹",
"Genres": "类型",
"HeaderContinueWatching": "继续观看",
diff --git a/Jellyfin.Api/Controllers/SubtitleController.cs b/Jellyfin.Api/Controllers/SubtitleController.cs
index 3c20bda6a6..66e40bc28b 100644
--- a/Jellyfin.Api/Controllers/SubtitleController.cs
+++ b/Jellyfin.Api/Controllers/SubtitleController.cs
@@ -227,7 +227,7 @@ public class SubtitleController : BaseJellyfinApiController
[FromQuery] long? endPositionTicks,
[FromQuery] bool copyTimestamps = false,
[FromQuery] bool addVttTimeMap = false,
- [FromQuery][Range(typeof(long), "0", "9223372036854775807")] long vttTimestampMapMpegts = DefaultVttTimestampMapMpegts,
+ [FromQuery] long vttTimestampMapMpegts = DefaultVttTimestampMapMpegts,
[FromQuery] long startPositionTicks = 0)
{
// Set parameters to route value if not provided via query.
@@ -317,7 +317,7 @@ public class SubtitleController : BaseJellyfinApiController
[FromQuery] long? endPositionTicks,
[FromQuery] bool copyTimestamps = false,
[FromQuery] bool addVttTimeMap = false,
- [FromQuery][Range(typeof(long), "0", "9223372036854775807")] long vttTimestampMapMpegts = DefaultVttTimestampMapMpegts)
+ [FromQuery] long vttTimestampMapMpegts = DefaultVttTimestampMapMpegts)
{
return GetSubtitle(
routeItemId,
@@ -357,7 +357,7 @@ public class SubtitleController : BaseJellyfinApiController
[FromRoute, Required] int index,
[FromRoute, Required] string mediaSourceId,
[FromQuery, Required] int segmentLength,
- [FromQuery][Range(typeof(long), "0", "9223372036854775807")] long vttTimestampMapMpegts = DefaultVttTimestampMapMpegts)
+ [FromQuery] long vttTimestampMapMpegts = DefaultVttTimestampMapMpegts)
{
var item = _libraryManager.GetItemById<Video>(itemId, User.GetUserId());
if (item is null)
diff --git a/Jellyfin.Server/Resources/Configuration/logging.json b/Jellyfin.Server/Resources/Configuration/logging.json
index ac5d9f60bc..7321ca5207 100644
--- a/Jellyfin.Server/Resources/Configuration/logging.json
+++ b/Jellyfin.Server/Resources/Configuration/logging.json
@@ -4,6 +4,9 @@
"Default": "Information",
"Override": {
"Microsoft": "Warning",
+ "Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager": "Error",
+ "Microsoft.AspNetCore.DataProtection.Repositories.EphemeralXmlRepository": "Error",
+ "Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware": "Error",
"System": "Warning"
}
},
diff --git a/Jellyfin.sln b/Jellyfin.sln
deleted file mode 100644
index b666e4ae16..0000000000
--- a/Jellyfin.sln
+++ /dev/null
@@ -1,329 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 18
-VisualStudioVersion = 18.0.11222.15 d18.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Server", "Jellyfin.Server\Jellyfin.Server.csproj", "{07E39F42-A2C6-4B32-AF8C-725F957A73FF}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.Common", "MediaBrowser.Common\MediaBrowser.Common.csproj", "{9142EEFA-7570-41E1-BFCC-468BB571AF2F}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.Model", "MediaBrowser.Model\MediaBrowser.Model.csproj", "{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.Providers", "MediaBrowser.Providers\MediaBrowser.Providers.csproj", "{442B5058-DCAF-4263-BB6A-F21E31120A1B}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.XbmcMetadata", "MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj", "{23499896-B135-4527-8574-C26E926EA99E}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.LocalMetadata", "MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj", "{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Drawing", "src\Jellyfin.Drawing\Jellyfin.Drawing.csproj", "{08FFF49B-F175-4807-A2B5-73B0EBD9F716}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Emby.Photos", "Emby.Photos\Emby.Photos.csproj", "{89AB4548-770D-41FD-A891-8DAFF44F452C}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Emby.Server.Implementations", "Emby.Server.Implementations\Emby.Server.Implementations.csproj", "{E383961B-9356-4D5D-8233-9A1079D03055}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Emby.Naming", "Emby.Naming\Emby.Naming.csproj", "{E5AF7B26-2239-4CE0-B477-0AA2018EDAA2}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediaBrowser.MediaEncoding", "MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj", "{960295EE-4AF4-4440-A525-B4C295B01A61}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{41093F42-C7CC-4D07-956B-6182CBEDE2EC}"
- ProjectSection(SolutionItems) = preProject
- .editorconfig = .editorconfig
- Directory.Packages.props = Directory.Packages.props
- SharedVersion.cs = SharedVersion.cs
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Drawing.Skia", "src\Jellyfin.Drawing.Skia\Jellyfin.Drawing.Skia.csproj", "{154872D9-6C12-4007-96E3-8F70A58386CE}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Api", "Jellyfin.Api\Jellyfin.Api.csproj", "{DFBEFB4C-DA19-4143-98B7-27320C7F7163}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Common.Tests", "tests\Jellyfin.Common.Tests\Jellyfin.Common.Tests.csproj", "{DF194677-DFD3-42AF-9F75-D44D5A416478}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.MediaEncoding.Tests", "tests\Jellyfin.MediaEncoding.Tests\Jellyfin.MediaEncoding.Tests.csproj", "{28464062-0939-4AA7-9F7B-24DDDA61A7C0}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Naming.Tests", "tests\Jellyfin.Naming.Tests\Jellyfin.Naming.Tests.csproj", "{3998657B-1CCC-49DD-A19F-275DC8495F57}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Api.Tests", "tests\Jellyfin.Api.Tests\Jellyfin.Api.Tests.csproj", "{A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Server.Implementations.Tests", "tests\Jellyfin.Server.Implementations.Tests\Jellyfin.Server.Implementations.Tests.csproj", "{2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Controller.Tests", "tests\Jellyfin.Controller.Tests\Jellyfin.Controller.Tests.csproj", "{462584F7-5023-4019-9EAC-B98CA458C0A0}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Data", "Jellyfin.Data\Jellyfin.Data.csproj", "{F03299F2-469F-40EF-A655-3766F97A5702}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Server.Implementations", "Jellyfin.Server.Implementations\Jellyfin.Server.Implementations.csproj", "{DAE48069-6D86-4BA6-B148-D1D49B6DDA52}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Networking", "src\Jellyfin.Networking\Jellyfin.Networking.csproj", "{0A3FCC4D-C714-4072-B90F-E374A15F9FF9}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.XbmcMetadata.Tests", "tests\Jellyfin.XbmcMetadata.Tests\Jellyfin.XbmcMetadata.Tests.csproj", "{30922383-D513-4F4D-B890-A940B57FA353}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Model.Tests", "tests\Jellyfin.Model.Tests\Jellyfin.Model.Tests.csproj", "{FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Networking.Tests", "tests\Jellyfin.Networking.Tests\Jellyfin.Networking.Tests.csproj", "{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Server.Tests", "tests\Jellyfin.Server.Tests\Jellyfin.Server.Tests.csproj", "{3ADBCD8C-C0F2-4956-8FDC-35D686B74CF9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Server.Integration.Tests", "tests\Jellyfin.Server.Integration.Tests\Jellyfin.Server.Integration.Tests.csproj", "{68B0B823-A5AC-4E8B-82EA-965AAC7BF76E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Providers.Tests", "tests\Jellyfin.Providers.Tests\Jellyfin.Providers.Tests.csproj", "{A964008C-2136-4716-B6CB-B3426C22320A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Extensions", "src\Jellyfin.Extensions\Jellyfin.Extensions.csproj", "{750B8757-BE3D-4F8C-941A-FBAD94904ADA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Extensions.Tests", "tests\Jellyfin.Extensions.Tests\Jellyfin.Extensions.Tests.csproj", "{332A5C7A-F907-47CA-910E-BE6F7371B9E0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.MediaEncoding.Keyframes", "src\Jellyfin.MediaEncoding.Keyframes\Jellyfin.MediaEncoding.Keyframes.csproj", "{06535CA1-4097-4360-85EB-5FB875D53239}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.MediaEncoding.Hls", "src\Jellyfin.MediaEncoding.Hls\Jellyfin.MediaEncoding.Hls.csproj", "{DA9FD356-4894-4830-B208-D6BCE3E65B11}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.MediaEncoding.Hls.Tests", "tests\Jellyfin.MediaEncoding.Hls.Tests\Jellyfin.MediaEncoding.Hls.Tests.csproj", "{FE47334C-EFDE-4519-BD50-F24430FF360B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.MediaEncoding.Keyframes.Tests", "tests\Jellyfin.MediaEncoding.Keyframes.Tests\Jellyfin.MediaEncoding.Keyframes.Tests.csproj", "{24960660-DE6C-47BF-AEEF-CEE8F19FE6C2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.LiveTv.Tests", "tests\Jellyfin.LiveTv.Tests\Jellyfin.LiveTv.Tests.csproj", "{C4F71272-C6BE-4C30-BE0D-4E6ED651D6D3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.LiveTv", "src\Jellyfin.LiveTv\Jellyfin.LiveTv.csproj", "{8C6B2B13-58A4-4506-9DAB-1F882A093FE0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Jellyfin.Database", "Jellyfin.Database", "{4C54CE05-69C8-48FA-8785-39F7F6DB1CAD}"
- ProjectSection(SolutionItems) = preProject
- src\Jellyfin.Database\readme.md = src\Jellyfin.Database\readme.md
- EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Database.Providers.Sqlite", "src\Jellyfin.Database\Jellyfin.Database.Providers.Sqlite\Jellyfin.Database.Providers.Sqlite.csproj", "{A5590358-33CC-4B39-BDE7-DC62FEB03C76}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Database.Implementations", "src\Jellyfin.Database\Jellyfin.Database.Implementations\Jellyfin.Database.Implementations.csproj", "{8C9F9221-8415-496C-B1F5-E7756F03FA59}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.CodeAnalysis", "src\Jellyfin.CodeAnalysis\Jellyfin.CodeAnalysis.csproj", "{11643D0F-6761-4EF7-AB71-6F9F8DE00714}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Jellyfin.Drawing.Skia.Tests", "tests\Jellyfin.Drawing.Skia.Tests\Jellyfin.Drawing.Skia.Tests.csproj", "{E24A279C-9A37-419A-8F9C-853C11FBE753}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {07E39F42-A2C6-4B32-AF8C-725F957A73FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {07E39F42-A2C6-4B32-AF8C-725F957A73FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {07E39F42-A2C6-4B32-AF8C-725F957A73FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {07E39F42-A2C6-4B32-AF8C-725F957A73FF}.Release|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.Build.0 = Release|Any CPU
- {E5AF7B26-2239-4CE0-B477-0AA2018EDAA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E5AF7B26-2239-4CE0-B477-0AA2018EDAA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E5AF7B26-2239-4CE0-B477-0AA2018EDAA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E5AF7B26-2239-4CE0-B477-0AA2018EDAA2}.Release|Any CPU.Build.0 = Release|Any CPU
- {960295EE-4AF4-4440-A525-B4C295B01A61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {960295EE-4AF4-4440-A525-B4C295B01A61}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {960295EE-4AF4-4440-A525-B4C295B01A61}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {960295EE-4AF4-4440-A525-B4C295B01A61}.Release|Any CPU.Build.0 = Release|Any CPU
- {154872D9-6C12-4007-96E3-8F70A58386CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {154872D9-6C12-4007-96E3-8F70A58386CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {154872D9-6C12-4007-96E3-8F70A58386CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {154872D9-6C12-4007-96E3-8F70A58386CE}.Release|Any CPU.Build.0 = Release|Any CPU
- {DFBEFB4C-DA19-4143-98B7-27320C7F7163}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DFBEFB4C-DA19-4143-98B7-27320C7F7163}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DFBEFB4C-DA19-4143-98B7-27320C7F7163}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DFBEFB4C-DA19-4143-98B7-27320C7F7163}.Release|Any CPU.Build.0 = Release|Any CPU
- {DF194677-DFD3-42AF-9F75-D44D5A416478}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DF194677-DFD3-42AF-9F75-D44D5A416478}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DF194677-DFD3-42AF-9F75-D44D5A416478}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DF194677-DFD3-42AF-9F75-D44D5A416478}.Release|Any CPU.Build.0 = Release|Any CPU
- {28464062-0939-4AA7-9F7B-24DDDA61A7C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {28464062-0939-4AA7-9F7B-24DDDA61A7C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {28464062-0939-4AA7-9F7B-24DDDA61A7C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {28464062-0939-4AA7-9F7B-24DDDA61A7C0}.Release|Any CPU.Build.0 = Release|Any CPU
- {3998657B-1CCC-49DD-A19F-275DC8495F57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3998657B-1CCC-49DD-A19F-275DC8495F57}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3998657B-1CCC-49DD-A19F-275DC8495F57}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3998657B-1CCC-49DD-A19F-275DC8495F57}.Release|Any CPU.Build.0 = Release|Any CPU
- {A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D}.Release|Any CPU.Build.0 = Release|Any CPU
- {2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE}.Release|Any CPU.Build.0 = Release|Any CPU
- {462584F7-5023-4019-9EAC-B98CA458C0A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {462584F7-5023-4019-9EAC-B98CA458C0A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {462584F7-5023-4019-9EAC-B98CA458C0A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {462584F7-5023-4019-9EAC-B98CA458C0A0}.Release|Any CPU.Build.0 = Release|Any CPU
- {F03299F2-469F-40EF-A655-3766F97A5702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F03299F2-469F-40EF-A655-3766F97A5702}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F03299F2-469F-40EF-A655-3766F97A5702}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F03299F2-469F-40EF-A655-3766F97A5702}.Release|Any CPU.Build.0 = Release|Any CPU
- {DAE48069-6D86-4BA6-B148-D1D49B6DDA52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DAE48069-6D86-4BA6-B148-D1D49B6DDA52}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DAE48069-6D86-4BA6-B148-D1D49B6DDA52}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DAE48069-6D86-4BA6-B148-D1D49B6DDA52}.Release|Any CPU.Build.0 = Release|Any CPU
- {0A3FCC4D-C714-4072-B90F-E374A15F9FF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0A3FCC4D-C714-4072-B90F-E374A15F9FF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0A3FCC4D-C714-4072-B90F-E374A15F9FF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0A3FCC4D-C714-4072-B90F-E374A15F9FF9}.Release|Any CPU.Build.0 = Release|Any CPU
- {30922383-D513-4F4D-B890-A940B57FA353}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {30922383-D513-4F4D-B890-A940B57FA353}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {30922383-D513-4F4D-B890-A940B57FA353}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {30922383-D513-4F4D-B890-A940B57FA353}.Release|Any CPU.Build.0 = Release|Any CPU
- {FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D}.Release|Any CPU.Build.0 = Release|Any CPU
- {42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {42816EA8-4511-4CBF-A9C7-7791D5DDDAE6}.Release|Any CPU.Build.0 = Release|Any CPU
- {3ADBCD8C-C0F2-4956-8FDC-35D686B74CF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {3ADBCD8C-C0F2-4956-8FDC-35D686B74CF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {3ADBCD8C-C0F2-4956-8FDC-35D686B74CF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {3ADBCD8C-C0F2-4956-8FDC-35D686B74CF9}.Release|Any CPU.Build.0 = Release|Any CPU
- {68B0B823-A5AC-4E8B-82EA-965AAC7BF76E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {68B0B823-A5AC-4E8B-82EA-965AAC7BF76E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {68B0B823-A5AC-4E8B-82EA-965AAC7BF76E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {68B0B823-A5AC-4E8B-82EA-965AAC7BF76E}.Release|Any CPU.Build.0 = Release|Any CPU
- {A964008C-2136-4716-B6CB-B3426C22320A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A964008C-2136-4716-B6CB-B3426C22320A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A964008C-2136-4716-B6CB-B3426C22320A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A964008C-2136-4716-B6CB-B3426C22320A}.Release|Any CPU.Build.0 = Release|Any CPU
- {750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Release|Any CPU.Build.0 = Release|Any CPU
- {332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Release|Any CPU.Build.0 = Release|Any CPU
- {06535CA1-4097-4360-85EB-5FB875D53239}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {06535CA1-4097-4360-85EB-5FB875D53239}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {06535CA1-4097-4360-85EB-5FB875D53239}.Release|Any CPU.ActiveCfg = Debug|Any CPU
- {06535CA1-4097-4360-85EB-5FB875D53239}.Release|Any CPU.Build.0 = Debug|Any CPU
- {DA9FD356-4894-4830-B208-D6BCE3E65B11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DA9FD356-4894-4830-B208-D6BCE3E65B11}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DA9FD356-4894-4830-B208-D6BCE3E65B11}.Release|Any CPU.ActiveCfg = Debug|Any CPU
- {DA9FD356-4894-4830-B208-D6BCE3E65B11}.Release|Any CPU.Build.0 = Debug|Any CPU
- {FE47334C-EFDE-4519-BD50-F24430FF360B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FE47334C-EFDE-4519-BD50-F24430FF360B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FE47334C-EFDE-4519-BD50-F24430FF360B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FE47334C-EFDE-4519-BD50-F24430FF360B}.Release|Any CPU.Build.0 = Release|Any CPU
- {24960660-DE6C-47BF-AEEF-CEE8F19FE6C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {24960660-DE6C-47BF-AEEF-CEE8F19FE6C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {24960660-DE6C-47BF-AEEF-CEE8F19FE6C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {24960660-DE6C-47BF-AEEF-CEE8F19FE6C2}.Release|Any CPU.Build.0 = Release|Any CPU
- {C4F71272-C6BE-4C30-BE0D-4E6ED651D6D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C4F71272-C6BE-4C30-BE0D-4E6ED651D6D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C4F71272-C6BE-4C30-BE0D-4E6ED651D6D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C4F71272-C6BE-4C30-BE0D-4E6ED651D6D3}.Release|Any CPU.Build.0 = Release|Any CPU
- {8C6B2B13-58A4-4506-9DAB-1F882A093FE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8C6B2B13-58A4-4506-9DAB-1F882A093FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8C6B2B13-58A4-4506-9DAB-1F882A093FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8C6B2B13-58A4-4506-9DAB-1F882A093FE0}.Release|Any CPU.Build.0 = Release|Any CPU
- {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Release|Any CPU.Build.0 = Release|Any CPU
- {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Release|Any CPU.Build.0 = Release|Any CPU
- {11643D0F-6761-4EF7-AB71-6F9F8DE00714}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {11643D0F-6761-4EF7-AB71-6F9F8DE00714}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {11643D0F-6761-4EF7-AB71-6F9F8DE00714}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {11643D0F-6761-4EF7-AB71-6F9F8DE00714}.Release|Any CPU.Build.0 = Release|Any CPU
- {E24A279C-9A37-419A-8F9C-853C11FBE753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E24A279C-9A37-419A-8F9C-853C11FBE753}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E24A279C-9A37-419A-8F9C-853C11FBE753}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E24A279C-9A37-419A-8F9C-853C11FBE753}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {154872D9-6C12-4007-96E3-8F70A58386CE} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {DF194677-DFD3-42AF-9F75-D44D5A416478} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {28464062-0939-4AA7-9F7B-24DDDA61A7C0} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {3998657B-1CCC-49DD-A19F-275DC8495F57} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {462584F7-5023-4019-9EAC-B98CA458C0A0} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {0A3FCC4D-C714-4072-B90F-E374A15F9FF9} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {30922383-D513-4F4D-B890-A940B57FA353} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {42816EA8-4511-4CBF-A9C7-7791D5DDDAE6} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {3ADBCD8C-C0F2-4956-8FDC-35D686B74CF9} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {68B0B823-A5AC-4E8B-82EA-965AAC7BF76E} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {A964008C-2136-4716-B6CB-B3426C22320A} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {750B8757-BE3D-4F8C-941A-FBAD94904ADA} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {332A5C7A-F907-47CA-910E-BE6F7371B9E0} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {06535CA1-4097-4360-85EB-5FB875D53239} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {DA9FD356-4894-4830-B208-D6BCE3E65B11} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {FE47334C-EFDE-4519-BD50-F24430FF360B} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {24960660-DE6C-47BF-AEEF-CEE8F19FE6C2} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {C4F71272-C6BE-4C30-BE0D-4E6ED651D6D3} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {8C6B2B13-58A4-4506-9DAB-1F882A093FE0} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {4C54CE05-69C8-48FA-8785-39F7F6DB1CAD} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {A5590358-33CC-4B39-BDE7-DC62FEB03C76} = {4C54CE05-69C8-48FA-8785-39F7F6DB1CAD}
- {8C9F9221-8415-496C-B1F5-E7756F03FA59} = {4C54CE05-69C8-48FA-8785-39F7F6DB1CAD}
- {11643D0F-6761-4EF7-AB71-6F9F8DE00714} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {E24A279C-9A37-419A-8F9C-853C11FBE753} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {3448830C-EBDC-426C-85CD-7BBB9651A7FE}
- EndGlobalSection
- GlobalSection(AutomaticVersions) = postSolution
- UpdateAssemblyVersion = True
- UpdateAssemblyFileVersion = True
- UpdateAssemblyInfoVersion = True
- AssemblyVersionSettings = None.None.None.None
- AssemblyFileVersionSettings = None.None.None.None
- AssemblyInfoVersionSettings = None.None.None.None
- UpdatePackageVersion = False
- AssemblyInfoVersionType = SettingsVersion
- InheritWinAppVersionFrom = None
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- Policies = $0
- $0.StandardHeader = $1
- $1.IncludeInNewFiles = False
- $0.DotNetNamingPolicy = $2
- $2.DirectoryNamespaceAssociation = PrefixedHierarchical
- EndGlobalSection
-EndGlobal
diff --git a/Jellyfin.slnx b/Jellyfin.slnx
new file mode 100644
index 0000000000..859656aeec
--- /dev/null
+++ b/Jellyfin.slnx
@@ -0,0 +1,59 @@
+<Solution>
+ <Folder Name="/Solution Items/">
+ <File Path=".editorconfig" />
+ <File Path="Directory.Build.props" />
+ <File Path="Directory.Build.targets" />
+ <File Path="Directory.Packages.props" />
+ <File Path="global.json" />
+ <File Path="nuget.config" />
+ <File Path="SharedVersion.cs" />
+ </Folder>
+ <Folder Name="/src/">
+ <Project Path="src/Jellyfin.CodeAnalysis/Jellyfin.CodeAnalysis.csproj" />
+ <Project Path="src/Jellyfin.Drawing.Skia/Jellyfin.Drawing.Skia.csproj" />
+ <Project Path="src/Jellyfin.Drawing/Jellyfin.Drawing.csproj" />
+ <Project Path="src/Jellyfin.Extensions/Jellyfin.Extensions.csproj" />
+ <Project Path="src/Jellyfin.LiveTv/Jellyfin.LiveTv.csproj" />
+ <Project Path="src/Jellyfin.MediaEncoding.Hls/Jellyfin.MediaEncoding.Hls.csproj" />
+ <Project Path="src/Jellyfin.MediaEncoding.Keyframes/Jellyfin.MediaEncoding.Keyframes.csproj" />
+ <Project Path="src/Jellyfin.Networking/Jellyfin.Networking.csproj" />
+ </Folder>
+ <Folder Name="/src/Jellyfin.Database/">
+ <File Path="src/Jellyfin.Database/readme.md" />
+ <Project Path="src/Jellyfin.Database/Jellyfin.Database.Implementations/Jellyfin.Database.Implementations.csproj" />
+ <Project Path="src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Jellyfin.Database.Providers.Sqlite.csproj" />
+ </Folder>
+ <Folder Name="/tests/">
+ <Project Path="tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Common.Tests/Jellyfin.Common.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Controller.Tests/Jellyfin.Controller.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Drawing.Skia.Tests/Jellyfin.Drawing.Skia.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Extensions.Tests/Jellyfin.Extensions.Tests.csproj" />
+ <Project Path="tests/Jellyfin.LiveTv.Tests/Jellyfin.LiveTv.Tests.csproj" />
+ <Project Path="tests/Jellyfin.MediaEncoding.Hls.Tests/Jellyfin.MediaEncoding.Hls.Tests.csproj" />
+ <Project Path="tests/Jellyfin.MediaEncoding.Keyframes.Tests/Jellyfin.MediaEncoding.Keyframes.Tests.csproj" />
+ <Project Path="tests/Jellyfin.MediaEncoding.Tests/Jellyfin.MediaEncoding.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Model.Tests/Jellyfin.Model.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Naming.Tests/Jellyfin.Naming.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Networking.Tests/Jellyfin.Networking.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Providers.Tests/Jellyfin.Providers.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj" />
+ <Project Path="tests/Jellyfin.Server.Tests/Jellyfin.Server.Tests.csproj" />
+ <Project Path="tests/Jellyfin.XbmcMetadata.Tests/Jellyfin.XbmcMetadata.Tests.csproj" />
+ </Folder>
+ <Project Path="Emby.Naming/Emby.Naming.csproj" />
+ <Project Path="Emby.Photos/Emby.Photos.csproj" />
+ <Project Path="Emby.Server.Implementations/Emby.Server.Implementations.csproj" />
+ <Project Path="Jellyfin.Api/Jellyfin.Api.csproj" />
+ <Project Path="Jellyfin.Data/Jellyfin.Data.csproj" />
+ <Project Path="Jellyfin.Server.Implementations/Jellyfin.Server.Implementations.csproj" />
+ <Project Path="Jellyfin.Server/Jellyfin.Server.csproj" />
+ <Project Path="MediaBrowser.Common/MediaBrowser.Common.csproj" />
+ <Project Path="MediaBrowser.Controller/MediaBrowser.Controller.csproj" />
+ <Project Path="MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj" />
+ <Project Path="MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj" />
+ <Project Path="MediaBrowser.Model/MediaBrowser.Model.csproj" />
+ <Project Path="MediaBrowser.Providers/MediaBrowser.Providers.csproj" />
+ <Project Path="MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj" />
+</Solution>
diff --git a/Jellyfin.sln.DotSettings b/Jellyfin.slnx.DotSettings
index 2ef037485c..2ef037485c 100644
--- a/Jellyfin.sln.DotSettings
+++ b/Jellyfin.slnx.DotSettings
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 022f8f0fbf..a1e955f33f 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -102,6 +102,14 @@ namespace MediaBrowser.Controller.Entities
private string _originalLanguage;
+ private float? _lufs;
+
+ private float? _normalizationGain;
+
+ private float? _criticRating;
+
+ private float? _communityRating;
+
public const char SlugChar = '-';
protected BaseItem()
@@ -154,14 +162,22 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The LUFS Value.</value>
[JsonIgnore]
- public float? LUFS { get; set; }
+ public float? LUFS
+ {
+ get => _lufs;
+ set => _lufs = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the gain required for audio normalization.
/// </summary>
/// <value>The gain required for audio normalization.</value>
[JsonIgnore]
- public float? NormalizationGain { get; set; }
+ public float? NormalizationGain
+ {
+ get => _normalizationGain;
+ set => _normalizationGain = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the channel identifier.
@@ -610,7 +626,11 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The critic rating.</value>
[JsonIgnore]
- public float? CriticRating { get; set; }
+ public float? CriticRating
+ {
+ get => _criticRating;
+ set => _criticRating = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the custom rating.
@@ -662,7 +682,11 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The community rating.</value>
[JsonIgnore]
- public float? CommunityRating { get; set; }
+ public float? CommunityRating
+ {
+ get => _communityRating;
+ set => _communityRating = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the run time ticks.
@@ -1376,6 +1400,15 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
+ /// Treats a rating or gain that is not a finite number as no value, since NaN and infinity
+ /// cannot be stored by every database or written as JSON.
+ /// </summary>
+ /// <param name="value">The value to check.</param>
+ /// <returns><paramref name="value"/> when it is finite or has no value, otherwise <see langword="null"/>.</returns>
+ private static float? FiniteOrNull(float? value)
+ => value.HasValue && !float.IsFinite(value.Value) ? null : value;
+
+ /// <summary>
/// Derives the prefix shared by the supplied media source items' file names, used to strip the
/// common part and surface a short version label per source. Returns null when there are fewer
/// than two file-based sources, since there is nothing to differentiate.
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index fa43d756a4..a751baf8b4 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -711,7 +711,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
// fsbs crop width in half,set the display aspect,crop out any black bars we may have made
Video3DFormat.FullSideBySide => @"crop=iw/2:ih:0:0,setdar=dar=a,crop=min(iw\,ih*dar):min(ih\,iw/dar):(iw-min(iw\,iw*sar))/2:(ih - min (ih\,ih/sar))/2,setsar=sar=1",
// htab crop height in half,scale to correct size, set the display aspect,crop out any black bars we may have made
- Video3DFormat.HalfTopAndBottom => @"crop=iw:ih/2:0:0,scale=(iw*2):ih),setdar=dar=a,crop=min(iw\,ih*dar):min(ih\,iw/dar):(iw-min(iw\,iw*sar))/2:(ih - min (ih\,ih/sar))/2,setsar=sar=1",
+ Video3DFormat.HalfTopAndBottom => @"crop=iw:ih/2:0:0,scale=(iw*2):ih,setdar=dar=a,crop=min(iw\,ih*dar):min(ih\,iw/dar):(iw-min(iw\,iw*sar))/2:(ih - min (ih\,ih/sar))/2,setsar=sar=1",
// ftab crop height in half, set the display aspect,crop out any black bars we may have made
Video3DFormat.FullTopAndBottom => @"crop=iw:ih/2:0:0,setdar=dar=a,crop=min(iw\,ih*dar):min(ih\,iw/dar):(iw-min(iw\,iw*sar))/2:(ih - min (ih\,ih/sar))/2,setsar=sar=1",
_ => "scale=round(iw*sar/2)*2:round(ih/2)*2"
diff --git a/README.md b/README.md
index f3a5a2a4ef..573bc712e9 100644
--- a/README.md
+++ b/README.md
@@ -89,7 +89,7 @@ The following instructions will help you get the project up and running via the
#### Running With Visual Studio
-To run the project with Visual Studio you can open the Solution (`.sln`) file and then press `F5` to run the server.
+To run the project with Visual Studio you can open the solution (`.slnx`) file and then press `F5` to run the server.
#### Running With Visual Studio Code
diff --git a/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs b/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs
index c67717e2fa..cb95c9d204 100644
--- a/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs
+++ b/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs
@@ -91,6 +91,28 @@ public class BaseItemTests
Assert.Equal(video.Id.ToString("N", CultureInfo.InvariantCulture), video.PresentationUniqueKey);
}
+ [Theory]
+ [InlineData(float.NaN, null)]
+ [InlineData(float.PositiveInfinity, null)]
+ [InlineData(float.NegativeInfinity, null)]
+ [InlineData(-3.5f, -3.5f)]
+ [InlineData(null, null)]
+ public void RatingsAndGains_KeepOnlyFiniteValues(float? value, float? expected)
+ {
+ var item = new Video
+ {
+ CommunityRating = value,
+ CriticRating = value,
+ LUFS = value,
+ NormalizationGain = value
+ };
+
+ Assert.Equal(expected, item.CommunityRating);
+ Assert.Equal(expected, item.CriticRating);
+ Assert.Equal(expected, item.LUFS);
+ Assert.Equal(expected, item.NormalizationGain);
+ }
+
[Fact]
public void GetItemByNameFolderName_ShortName_IsKeptAsIs()
{
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
index 4142831c31..d884493cea 100644
--- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
@@ -337,5 +337,20 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
Assert.Equal(7.5f, item.CommunityRating);
}
+
+ [Fact]
+ public void Parse_Ratings_NotFinite_Ignored()
+ {
+ var result = new MetadataResult<Video>()
+ {
+ Item = new Movie()
+ };
+
+ _parser.Fetch(result, "Test Data/Ratings_NotFinite.nfo", CancellationToken.None);
+ var item = (Movie)result.Item;
+
+ Assert.Null(item.CommunityRating);
+ Assert.Null(item.CriticRating);
+ }
}
}
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo
new file mode 100644
index 0000000000..3012efb18d
--- /dev/null
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<movie>
+ <title>Test Movie</title>
+ <rating>NaN</rating>
+ <criticrating>Infinity</criticrating>
+</movie>