mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-05-18 22:56:38 +01:00
Add OriginalLanguage as option to PreferredAudioLanguage (#12579)
* Add OriginalLanguage as option to PreferredAudioLanguage * Support for multiple original languages * Add original audio stream indicator * Fetch OriginalLanguage from TMDB * Adapt to EFCore refactor * Fix PlayDefaultAudioTrack OriginalLanguage behavior * Fix better PlayDefaultAudioTrack OriginalLanguage behavior * Add comment to ItemFields * Improved PlayDefaultAudioTrack behavior * Add migration for original language * Use sting.Equals for string comparisons * Always set dto OriginalLanguage * Remove OriginalLanguage from ItemFields --------- Co-authored-by: Lampan-git <lampan-git@users.noreply.github.com>
This commit is contained in:
@@ -105,10 +105,12 @@ namespace Jellyfin.MediaEncoding.Tests.Probing
|
||||
|
||||
var audio1 = res.MediaStreams[1];
|
||||
Assert.Equal("eac3", audio1.Codec);
|
||||
Assert.True(audio1.IsOriginal);
|
||||
Assert.Equal(AudioSpatialFormat.DolbyAtmos, audio1.AudioSpatialFormat);
|
||||
|
||||
var audio2 = res.MediaStreams[2];
|
||||
Assert.Equal("dts", audio2.Codec);
|
||||
Assert.False(audio2.IsOriginal);
|
||||
Assert.Equal(AudioSpatialFormat.DTSX, audio2.AudioSpatialFormat);
|
||||
|
||||
Assert.Empty(res.Chapters);
|
||||
@@ -156,6 +158,7 @@ namespace Jellyfin.MediaEncoding.Tests.Probing
|
||||
Assert.Equal("aac", res.MediaStreams[1].Codec);
|
||||
Assert.Equal(7, res.MediaStreams[1].Channels);
|
||||
Assert.True(res.MediaStreams[1].IsDefault);
|
||||
Assert.False(res.MediaStreams[1].IsOriginal);
|
||||
Assert.Equal("eng", res.MediaStreams[1].Language);
|
||||
Assert.Equal("Surround 6.1", res.MediaStreams[1].Title);
|
||||
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
using System;
|
||||
using AutoFixture;
|
||||
using AutoFixture.AutoMoq;
|
||||
using Castle.Components.DictionaryAdapter;
|
||||
using Emby.Server.Implementations.IO;
|
||||
using Emby.Server.Implementations.Library;
|
||||
using Jellyfin.Database.Implementations.Entities;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Globalization;
|
||||
using MediaBrowser.Model.IO;
|
||||
using MediaBrowser.Model.MediaInfo;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.Tests.Library
|
||||
@@ -11,12 +20,28 @@ namespace Jellyfin.Server.Implementations.Tests.Library
|
||||
public class MediaSourceManagerTests
|
||||
{
|
||||
private readonly MediaSourceManager _mediaSourceManager;
|
||||
private readonly Mock<IUserDataManager> _mockUserDataManager;
|
||||
private readonly Mock<ILocalizationManager> _mockLocalizationManager;
|
||||
private Video _item;
|
||||
private User _user;
|
||||
|
||||
public MediaSourceManagerTests()
|
||||
{
|
||||
IFixture fixture = new Fixture().Customize(new AutoMoqCustomization { ConfigureMembers = true });
|
||||
fixture.Inject<IFileSystem>(fixture.Create<ManagedFileSystem>());
|
||||
|
||||
_mockUserDataManager = fixture.Freeze<Mock<IUserDataManager>>();
|
||||
_mockUserDataManager.Setup(m => m.GetUserData(It.IsAny<User>(), It.IsAny<BaseItem>())).Returns(new UserItemData() { Key = "key" });
|
||||
|
||||
_mockLocalizationManager = fixture.Create<Mock<ILocalizationManager>>();
|
||||
_mockLocalizationManager.Setup(m => m.FindLanguageInfo(It.IsAny<string>())).Returns((string s) => string.IsNullOrEmpty(s) ? null : new CultureDto(s, s, s, new EditableList<string> { s }));
|
||||
fixture.Inject(_mockLocalizationManager.Object);
|
||||
|
||||
_mediaSourceManager = fixture.Create<MediaSourceManager>();
|
||||
|
||||
_item = new Video { Id = Guid.NewGuid(), OwnerId = Guid.Empty, ParentId = Guid.Empty };
|
||||
|
||||
_user = fixture.Create<User>();
|
||||
}
|
||||
|
||||
[Theory]
|
||||
@@ -28,5 +53,96 @@ namespace Jellyfin.Server.Implementations.Tests.Library
|
||||
[InlineData("rtsp://media.example.com:554/twister/audiotrack", MediaProtocol.Rtsp)]
|
||||
public void GetPathProtocol_ValidArg_Correct(string path, MediaProtocol expected)
|
||||
=> Assert.Equal(expected, _mediaSourceManager.GetPathProtocol(path));
|
||||
|
||||
[Theory]
|
||||
[InlineData(5, "eng", "eng", false, true)]
|
||||
[InlineData(5, "eng", "eng", true, true)]
|
||||
[InlineData(2, "ger", "eng", false, true)]
|
||||
[InlineData(2, "ger", "eng", true, true)]
|
||||
[InlineData(1, "fre", "eng", false, true)]
|
||||
[InlineData(2, "fre", "eng", true, true)]
|
||||
[InlineData(5, "OriginalLanguage", "eng", false, false)]
|
||||
[InlineData(4, "OriginalLanguage", "eng", false, true)]
|
||||
[InlineData(5, "OriginalLanguage", "eng", true, false)]
|
||||
[InlineData(5, "OriginalLanguage", "eng", true, true)]
|
||||
[InlineData(2, "OriginalLanguage", "jpn", true, true)]
|
||||
[InlineData(2, "OriginalLanguage", "jpn", false, true)]
|
||||
[InlineData(2, "OriginalLanguage", "jpn,eng", false, true)]
|
||||
[InlineData(4, "OriginalLanguage", null, false, true)]
|
||||
[InlineData(2, "OriginalLanguage", null, true, true)]
|
||||
[InlineData(4, "OriginalLanguage", "", false, true)]
|
||||
[InlineData(2, "OriginalLanguage", "", false, false)]
|
||||
[InlineData(2, "OriginalLanguage", "ger", false, true)]
|
||||
[InlineData(2, "OriginalLanguage", "ger", false, false)]
|
||||
[InlineData(1, "OriginalLanguage", "fre", false, false)]
|
||||
[InlineData(2, "OriginalLanguage", "fre", true, true)]
|
||||
[InlineData(2, "OriginalLanguage", "fre", true, false)]
|
||||
public void SetDefaultAudioStreamIndex_Index_Correct(
|
||||
int expectedIndex,
|
||||
string prefferedLanguage,
|
||||
string? originalLanguage,
|
||||
bool playDefault,
|
||||
bool originalExist)
|
||||
{
|
||||
var streams = new MediaStream[]
|
||||
{
|
||||
new()
|
||||
{
|
||||
Index = 0,
|
||||
Type = MediaStreamType.Video,
|
||||
IsDefault = true
|
||||
},
|
||||
new()
|
||||
{
|
||||
Index = 1,
|
||||
Type = MediaStreamType.Audio,
|
||||
Language = "fre",
|
||||
IsDefault = false,
|
||||
IsOriginal = false
|
||||
},
|
||||
new()
|
||||
{
|
||||
Index = 2,
|
||||
Type = MediaStreamType.Audio,
|
||||
Language = "jpn",
|
||||
IsDefault = true,
|
||||
IsOriginal = false
|
||||
},
|
||||
new()
|
||||
{
|
||||
Index = 3,
|
||||
Type = MediaStreamType.Audio,
|
||||
Language = "eng",
|
||||
IsDefault = false,
|
||||
IsOriginal = false
|
||||
},
|
||||
new()
|
||||
{
|
||||
Index = 4,
|
||||
Type = MediaStreamType.Audio,
|
||||
Language = "eng",
|
||||
IsDefault = false,
|
||||
IsOriginal = originalExist,
|
||||
},
|
||||
new()
|
||||
{
|
||||
Index = 5,
|
||||
Type = MediaStreamType.Audio,
|
||||
Language = "eng",
|
||||
IsDefault = true,
|
||||
IsOriginal = false,
|
||||
}
|
||||
};
|
||||
var mediaInfo = new MediaSourceInfo
|
||||
{
|
||||
MediaStreams = streams
|
||||
};
|
||||
_user.AudioLanguagePreference = prefferedLanguage;
|
||||
_user.PlayDefaultAudioTrack = playDefault;
|
||||
_item.OriginalLanguage = originalLanguage;
|
||||
|
||||
_mediaSourceManager.SetDefaultAudioAndSubtitleStreamIndices(_item, mediaInfo, _user);
|
||||
Assert.Equal(expectedIndex, mediaInfo.DefaultAudioStreamIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user