Default to und for audio streams with no language tag

This commit is contained in:
Bogdan 2026-04-19 20:10:22 +03:00 committed by Mark McDowall
parent 91c8d9fa50
commit b3e815e341
5 changed files with 79 additions and 14 deletions

View file

@ -23,7 +23,10 @@ function MediaInfo(props: MediaInfoProps) {
if (key === 'audioStreams') {
return value.map((audioStream, index) => {
const language = getLanguageName(audioStream.language);
const language =
audioStream.language === 'und'
? translate('Unknown')
: getLanguageName(audioStream.language);
let line = `${language}`;

View file

@ -97,6 +97,63 @@ public void should_convert_non_empty_media_info()
mediainfo.SubtitleStreams.Select(s => s.Language).Should().BeEquivalentTo("eng", "ger", "rum");
}
[Test]
public void should_convert_non_empty_media_info_with_empty_audio_languages()
{
var db = WithMigrationTestDb(c =>
{
c.Insert.IntoTable("EpisodeFiles").Row(new
{
SeriesId = 1,
SeasonNumber = 1,
RelativePath = "Season 01/S01E05.mkv",
Size = 125.Megabytes(),
DateAdded = DateTime.UtcNow,
OriginalFilePath = "Series.Title.S01E05.720p.HDTV.x265-Sonarr.mkv",
ReleaseGroup = "Sonarr",
Quality = new QualityModel(Quality.HDTV720p).ToJson(),
Languages = "[1]",
MediaInfo = new
{
AudioFormat = "truehd",
AudioCodecID = "[0][0][0][0]",
AudioProfile = "Dolby TrueHD + Dolby Atmos",
AudioBitrate = 224000,
AudioChannels = 2,
AudioChannelPositions = "stereo",
AudioLanguages = new List<string>(),
Subtitles = new List<string> { "ger", "eng", "rum" },
ScanType = "Progressive",
SchemaRevision = 13
}.ToJson()
});
});
var items = db.Query<EpisodeFile225>("SELECT \"Id\", \"RelativePath\", \"MediaInfo\" FROM \"EpisodeFiles\"");
items.Should().HaveCount(1);
var mediainfo = items.First().MediaInfo;
mediainfo.AudioFormat.Should().BeNull();
mediainfo.AudioCodecID.Should().BeNull();
mediainfo.AudioProfile.Should().BeNull();
mediainfo.AudioBitrate.Should().BeNull();
mediainfo.AudioChannels.Should().BeNull();
mediainfo.AudioChannelPositions.Should().BeNull();
mediainfo.AudioStreams.First().Format.Should().Be("truehd");
mediainfo.AudioStreams.First().CodecId.Should().Be("[0][0][0][0]");
mediainfo.AudioStreams.First().Profile.Should().Be("Dolby TrueHD + Dolby Atmos");
mediainfo.AudioStreams.First().Bitrate.Should().Be(224000);
mediainfo.AudioStreams.First().Channels.Should().Be(2);
mediainfo.AudioStreams.First().ChannelPositions.Should().Be("stereo");
mediainfo.AudioStreams.First().Language.Should().Be("und");
mediainfo.AudioStreams.Select(s => s.Language).Should().BeEquivalentTo("und");
mediainfo.SubtitleStreams.Select(s => s.Language).Should().BeEquivalentTo("eng", "ger", "rum");
}
[Test]
public void should_convert_to_null_on_invalid_media_info()
{

View file

@ -126,13 +126,19 @@ private static List<MediaInfoAudioStream225> MigrateAudioStreams(MediaInfo224 ol
{
Language = language,
})
.ToList();
audioStreams?.FirstOrDefault()?.Format = old.AudioFormat;
audioStreams?.FirstOrDefault()?.CodecId = old.AudioCodecID;
audioStreams?.FirstOrDefault()?.Profile = old.AudioProfile;
audioStreams?.FirstOrDefault()?.Bitrate = old.AudioBitrate;
audioStreams?.FirstOrDefault()?.Channels = old.AudioChannels;
audioStreams?.FirstOrDefault()?.ChannelPositions = old.AudioChannelPositions;
.ToList() ?? [];
if (audioStreams.Count == 0)
{
audioStreams.Add(new MediaInfoAudioStream225 { Language = "und" });
}
audioStreams.FirstOrDefault()?.Format = old.AudioFormat;
audioStreams.FirstOrDefault()?.CodecId = old.AudioCodecID;
audioStreams.FirstOrDefault()?.Profile = old.AudioProfile;
audioStreams.FirstOrDefault()?.Bitrate = old.AudioBitrate;
audioStreams.FirstOrDefault()?.Channels = old.AudioChannels;
audioStreams.FirstOrDefault()?.ChannelPositions = old.AudioChannelPositions;
return audioStreams;
}
@ -144,7 +150,7 @@ private static List<MediaInfoSubtitleStream225> MigrateSubtitleStreams(MediaInfo
{
Language = language,
})
.ToList();
.ToList() ?? [];
return subtitleStreams;
}

View file

@ -31,7 +31,7 @@ public static decimal FormatAudioChannels(MediaInfoAudioStreamModel audioStream)
public static string FormatAudioCodec(MediaInfoAudioStreamModel audioStream, string sceneName)
{
if (audioStream.Format == null)
if (audioStream?.Format == null)
{
return null;
}
@ -155,7 +155,7 @@ public static string FormatAudioCodec(MediaInfoAudioStreamModel audioStream, str
public static string FormatVideoCodec(MediaInfoModel mediaInfo, string sceneName)
{
if (mediaInfo.VideoFormat == null)
if (mediaInfo?.VideoFormat == null)
{
return null;
}
@ -270,7 +270,7 @@ public static string FormatVideoCodec(MediaInfoModel mediaInfo, string sceneName
private static decimal? FormatAudioChannelsFromAudioChannelPositions(MediaInfoAudioStreamModel audioStream)
{
if (audioStream.ChannelPositions == null)
if (audioStream?.ChannelPositions == null)
{
return 0;
}

View file

@ -85,13 +85,12 @@ public MediaInfoModel GetMediaInfo(string filename)
mediaInfoModel.RawStreamData = string.Concat(analysis.OutputData);
mediaInfoModel.AudioStreams = analysis.AudioStreams?
.Where(stream => stream.Language.IsNotNullOrWhiteSpace())
.OrderBy(stream => stream.Index)
.Select(stream =>
{
var model = new MediaInfoAudioStreamModel
{
Language = stream.Language,
Language = stream.Language.IsNotNullOrWhiteSpace() ? stream.Language : "und",
Format = stream.CodecName,
CodecId = stream.CodecTagString,
Profile = stream.Profile,