diff --git a/FFMpegCore/FFProbe/MediaAnalysis.cs b/FFMpegCore/FFProbe/MediaAnalysis.cs index 4717a6f..5a43aa2 100644 --- a/FFMpegCore/FFProbe/MediaAnalysis.cs +++ b/FFMpegCore/FFProbe/MediaAnalysis.cs @@ -8,6 +8,7 @@ namespace FFMpegCore internal class MediaAnalysis : IMediaAnalysis { private static readonly Regex DurationRegex = new Regex("^(\\d{1,2}:\\d{1,2}:\\d{1,2}(.\\d{1,7})?)", RegexOptions.Compiled); + internal MediaAnalysis(string path, FFProbeAnalysis analysis) { Format = ParseFormat(analysis.Format); @@ -27,14 +28,15 @@ private MediaFormat ParseFormat(Format analysisFormat) FormatLongName = analysisFormat.FormatLongName, StreamCount = analysisFormat.NbStreams, ProbeScore = analysisFormat.ProbeScore, - BitRate = long.Parse(analysisFormat.BitRate ?? "0") + BitRate = long.Parse(analysisFormat.BitRate ?? "0"), + Tags = analysisFormat.Tags, }; } public string Path { get; } public string Extension => System.IO.Path.GetExtension(Path); - public TimeSpan Duration => new [] + public TimeSpan Duration => new[] { Format.Duration, PrimaryVideoStream?.Duration ?? TimeSpan.Zero, @@ -67,7 +69,8 @@ private VideoStream ParseVideoStream(FFProbeStream stream) Profile = stream.Profile, PixelFormat = stream.PixelFormat, Rotation = (int)float.Parse(stream.GetRotate() ?? "0"), - Language = stream.GetLanguage() + Language = stream.GetLanguage(), + Tags = stream.Tags, }; } @@ -77,6 +80,7 @@ private static TimeSpan ParseDuration(FFProbeStream ffProbeStream) ? TimeSpan.Parse(ffProbeStream.Duration) : TimeSpan.Parse(TrimTimeSpan(ffProbeStream.GetDuration()) ?? "0"); } + private static string? TrimTimeSpan(string? durationTag) { var durationMatch = DurationRegex.Match(durationTag ?? ""); @@ -96,17 +100,20 @@ private AudioStream ParseAudioStream(FFProbeStream stream) Duration = ParseDuration(stream), SampleRateHz = !string.IsNullOrEmpty(stream.SampleRate) ? ParseIntInvariant(stream.SampleRate) : default, Profile = stream.Profile, - Language = stream.GetLanguage() + Language = stream.GetLanguage(), + Tags = stream.Tags, }; } private static double DivideRatio((double, double) ratio) => ratio.Item1 / ratio.Item2; + private static (int, int) ParseRatioInt(string input, char separator) { if (string.IsNullOrEmpty(input)) return (0, 0); var ratio = input.Split(separator); return (ParseIntInvariant(ratio[0]), ParseIntInvariant(ratio[1])); } + private static (double, double) ParseRatioDouble(string input, char separator) { if (string.IsNullOrEmpty(input)) return (0, 0); @@ -116,6 +123,7 @@ private static (double, double) ParseRatioDouble(string input, char separator) private static double ParseDoubleInvariant(string line) => double.Parse(line, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); + private static int ParseIntInvariant(string line) => int.Parse(line, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } diff --git a/FFMpegCore/FFProbe/MediaFormat.cs b/FFMpegCore/FFProbe/MediaFormat.cs index ea5c6f3..874317c 100644 --- a/FFMpegCore/FFProbe/MediaFormat.cs +++ b/FFMpegCore/FFProbe/MediaFormat.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace FFMpegCore { @@ -10,5 +11,6 @@ public class MediaFormat public int StreamCount { get; set; } public double ProbeScore { get; set; } public double BitRate { get; set; } + public Dictionary? Tags { get; set; } } } \ No newline at end of file diff --git a/FFMpegCore/FFProbe/MediaStream.cs b/FFMpegCore/FFProbe/MediaStream.cs index 61d548f..0780c8e 100644 --- a/FFMpegCore/FFProbe/MediaStream.cs +++ b/FFMpegCore/FFProbe/MediaStream.cs @@ -1,5 +1,7 @@ using FFMpegCore.Enums; + using System; +using System.Collections.Generic; namespace FFMpegCore { @@ -11,6 +13,7 @@ public class MediaStream public int BitRate { get; internal set; } public TimeSpan Duration { get; internal set; } public string? Language { get; internal set; } + public Dictionary? Tags { get; internal set; } public Codec GetCodecInfo() => FFMpeg.GetCodec(CodecName); }