diff options
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" @@ -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> |
