You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
6.1 KiB
215 lines
6.1 KiB
using System;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using NLog;
|
|
using NLog.Fluent;
|
|
using NzbDrone.Common.Extensions;
|
|
using NzbDrone.Common.Instrumentation;
|
|
using NzbDrone.Common.Instrumentation.Extensions;
|
|
|
|
namespace NzbDrone.Core.MediaFiles.MediaInfo
|
|
{
|
|
public static class MediaInfoFormatter
|
|
{
|
|
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(MediaInfoFormatter));
|
|
|
|
public static string FormatAudioBitrate(MediaInfoModel mediaInfo)
|
|
{
|
|
int audioBitrate = mediaInfo.AudioBitrate / 1000;
|
|
|
|
return audioBitrate + " kbps";
|
|
}
|
|
|
|
public static decimal FormatAudioChannels(MediaInfoModel mediaInfo)
|
|
{
|
|
var audioChannelPositions = mediaInfo.AudioChannelPositions;
|
|
var audioChannelPositionsText = mediaInfo.AudioChannelPositionsText;
|
|
var audioChannels = mediaInfo.AudioChannels;
|
|
|
|
if (audioChannelPositions.IsNullOrWhiteSpace())
|
|
{
|
|
if (audioChannelPositionsText.IsNullOrWhiteSpace())
|
|
{
|
|
if (mediaInfo.SchemaRevision >= 3)
|
|
{
|
|
return audioChannels;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
return mediaInfo.AudioChannelPositionsText.ContainsIgnoreCase("LFE") ? audioChannels - 1 + 0.1m : audioChannels;
|
|
}
|
|
|
|
if (audioChannelPositions.Contains("+"))
|
|
{
|
|
return audioChannelPositions.Split('+')
|
|
.Sum(s => decimal.Parse(s.Trim(), CultureInfo.InvariantCulture));
|
|
}
|
|
|
|
return audioChannelPositions.Replace("Object Based / ", "")
|
|
.Split(new[] { " / " }, StringSplitOptions.RemoveEmptyEntries)
|
|
.First()
|
|
.Split('/')
|
|
.Sum(s => decimal.Parse(s, CultureInfo.InvariantCulture));
|
|
}
|
|
|
|
public static string FormatAudioCodec(MediaInfoModel mediaInfo)
|
|
{
|
|
if (mediaInfo.AudioCodecID == null)
|
|
{
|
|
return FormatAudioCodecLegacy(mediaInfo);
|
|
}
|
|
|
|
var audioFormat = mediaInfo.AudioFormat;
|
|
var audioCodecID = mediaInfo.AudioCodecID ?? string.Empty;
|
|
var audioProfile = mediaInfo.AudioProfile ?? string.Empty;
|
|
var audioCodecLibrary = mediaInfo.AudioCodecLibrary ?? string.Empty;
|
|
|
|
if (audioFormat.IsNullOrWhiteSpace())
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("AC-3"))
|
|
{
|
|
return "AC3";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("E-AC-3"))
|
|
{
|
|
return "EAC3";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("AAC"))
|
|
{
|
|
if (audioCodecID == "A_AAC/MPEG4/LC/SBR")
|
|
{
|
|
return "HE-AAC";
|
|
}
|
|
|
|
return "AAC";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("DTS"))
|
|
{
|
|
return "DTS";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("FLAC"))
|
|
{
|
|
return "FLAC";
|
|
}
|
|
|
|
if (audioFormat.Trim().EqualsIgnoreCase("mp3"))
|
|
{
|
|
return "MP3";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("MPEG Audio"))
|
|
{
|
|
if (mediaInfo.AudioCodecID == "55" || mediaInfo.AudioCodecID == "A_MPEG/L3" || mediaInfo.AudioProfile == "Layer 3")
|
|
{
|
|
return "MP3";
|
|
}
|
|
|
|
if (mediaInfo.AudioCodecID == "A_MPEG/L2" || mediaInfo.AudioProfile == "Layer 2")
|
|
{
|
|
return "MP2";
|
|
}
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("Opus"))
|
|
{
|
|
return "Opus";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("PCM"))
|
|
{
|
|
return "PCM";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("TrueHD"))
|
|
{
|
|
return "TrueHD";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("Vorbis"))
|
|
{
|
|
return "Vorbis";
|
|
}
|
|
|
|
if (audioFormat == "WMA")
|
|
{
|
|
return "WMA";
|
|
}
|
|
|
|
Logger.Debug()
|
|
.Message("Unknown audio format: '{0}'.", string.Join(", ", audioFormat, audioCodecID, audioProfile, audioCodecLibrary))
|
|
.WriteSentryWarn("UnknownAudioFormat", mediaInfo.ContainerFormat, audioFormat, audioCodecID)
|
|
.Write();
|
|
|
|
return audioFormat;
|
|
}
|
|
|
|
public static string FormatAudioCodecLegacy(MediaInfoModel mediaInfo)
|
|
{
|
|
var audioFormat = mediaInfo.AudioFormat;
|
|
|
|
if (audioFormat.IsNullOrWhiteSpace())
|
|
{
|
|
return audioFormat;
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("AC-3"))
|
|
{
|
|
return "AC3";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("E-AC-3"))
|
|
{
|
|
return "EAC3";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("AAC"))
|
|
{
|
|
return "AAC";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("MPEG Audio") && mediaInfo.AudioProfile == "Layer 3")
|
|
{
|
|
return "MP3";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("DTS"))
|
|
{
|
|
return "DTS";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("TrueHD"))
|
|
{
|
|
return "TrueHD";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("FLAC"))
|
|
{
|
|
return "FLAC";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("Vorbis"))
|
|
{
|
|
return "Vorbis";
|
|
}
|
|
|
|
if (audioFormat.EqualsIgnoreCase("Opus"))
|
|
{
|
|
return "Opus";
|
|
}
|
|
|
|
return audioFormat;
|
|
}
|
|
}
|
|
}
|