BdInfoExaminer.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using BDInfo;
  5. using MediaBrowser.Model.Entities;
  6. using MediaBrowser.Model.IO;
  7. using MediaBrowser.Model.MediaInfo;
  8. namespace MediaBrowser.MediaEncoding.BdInfo;
  9. /// <summary>
  10. /// Class BdInfoExaminer.
  11. /// </summary>
  12. public class BdInfoExaminer : IBlurayExaminer
  13. {
  14. private readonly IFileSystem _fileSystem;
  15. /// <summary>
  16. /// Initializes a new instance of the <see cref="BdInfoExaminer" /> class.
  17. /// </summary>
  18. /// <param name="fileSystem">The filesystem.</param>
  19. public BdInfoExaminer(IFileSystem fileSystem)
  20. {
  21. _fileSystem = fileSystem;
  22. }
  23. /// <summary>
  24. /// Gets the disc info.
  25. /// </summary>
  26. /// <param name="path">The path.</param>
  27. /// <returns>BlurayDiscInfo.</returns>
  28. public BlurayDiscInfo GetDiscInfo(string path)
  29. {
  30. if (string.IsNullOrWhiteSpace(path))
  31. {
  32. throw new ArgumentNullException(nameof(path));
  33. }
  34. var bdrom = new BDROM(BdInfoDirectoryInfo.FromFileSystemPath(_fileSystem, path));
  35. bdrom.Scan();
  36. // Get the longest playlist
  37. var playlist = bdrom.PlaylistFiles.Values.OrderByDescending(p => p.TotalLength).FirstOrDefault(p => p.IsValid);
  38. var outputStream = new BlurayDiscInfo
  39. {
  40. MediaStreams = Array.Empty<MediaStream>()
  41. };
  42. if (playlist is null)
  43. {
  44. return outputStream;
  45. }
  46. outputStream.Chapters = playlist.Chapters.ToArray();
  47. outputStream.RunTimeTicks = TimeSpan.FromSeconds(playlist.TotalLength).Ticks;
  48. var sortedStreams = playlist.SortedStreams;
  49. var mediaStreams = new List<MediaStream>(sortedStreams.Count);
  50. foreach (var stream in sortedStreams)
  51. {
  52. switch (stream)
  53. {
  54. case TSVideoStream videoStream:
  55. AddVideoStream(mediaStreams, videoStream);
  56. break;
  57. case TSAudioStream audioStream:
  58. AddAudioStream(mediaStreams, audioStream);
  59. break;
  60. case TSTextStream textStream:
  61. AddSubtitleStream(mediaStreams, textStream);
  62. break;
  63. case TSGraphicsStream graphicStream:
  64. AddSubtitleStream(mediaStreams, graphicStream);
  65. break;
  66. }
  67. }
  68. outputStream.MediaStreams = mediaStreams.ToArray();
  69. outputStream.PlaylistName = playlist.Name;
  70. if (playlist.StreamClips is not null && playlist.StreamClips.Count > 0)
  71. {
  72. // Get the files in the playlist
  73. outputStream.Files = playlist.StreamClips.Select(i => i.StreamFile.Name).ToArray();
  74. }
  75. return outputStream;
  76. }
  77. /// <summary>
  78. /// Adds the video stream.
  79. /// </summary>
  80. /// <param name="streams">The streams.</param>
  81. /// <param name="videoStream">The video stream.</param>
  82. private void AddVideoStream(List<MediaStream> streams, TSVideoStream videoStream)
  83. {
  84. var mediaStream = new MediaStream
  85. {
  86. BitRate = Convert.ToInt32(videoStream.BitRate),
  87. Width = videoStream.Width,
  88. Height = videoStream.Height,
  89. Codec = videoStream.CodecShortName,
  90. IsInterlaced = videoStream.IsInterlaced,
  91. Type = MediaStreamType.Video,
  92. Index = streams.Count
  93. };
  94. if (videoStream.FrameRateDenominator > 0)
  95. {
  96. float frameRateEnumerator = videoStream.FrameRateEnumerator;
  97. float frameRateDenominator = videoStream.FrameRateDenominator;
  98. mediaStream.AverageFrameRate = mediaStream.RealFrameRate = frameRateEnumerator / frameRateDenominator;
  99. }
  100. streams.Add(mediaStream);
  101. }
  102. /// <summary>
  103. /// Adds the audio stream.
  104. /// </summary>
  105. /// <param name="streams">The streams.</param>
  106. /// <param name="audioStream">The audio stream.</param>
  107. private void AddAudioStream(List<MediaStream> streams, TSAudioStream audioStream)
  108. {
  109. var stream = new MediaStream
  110. {
  111. Codec = audioStream.CodecShortName,
  112. Language = audioStream.LanguageCode,
  113. Channels = audioStream.ChannelCount,
  114. SampleRate = audioStream.SampleRate,
  115. Type = MediaStreamType.Audio,
  116. Index = streams.Count
  117. };
  118. var bitrate = Convert.ToInt32(audioStream.BitRate);
  119. if (bitrate > 0)
  120. {
  121. stream.BitRate = bitrate;
  122. }
  123. if (audioStream.LFE > 0)
  124. {
  125. stream.Channels = audioStream.ChannelCount + 1;
  126. }
  127. streams.Add(stream);
  128. }
  129. /// <summary>
  130. /// Adds the subtitle stream.
  131. /// </summary>
  132. /// <param name="streams">The streams.</param>
  133. /// <param name="textStream">The text stream.</param>
  134. private void AddSubtitleStream(List<MediaStream> streams, TSTextStream textStream)
  135. {
  136. streams.Add(new MediaStream
  137. {
  138. Language = textStream.LanguageCode,
  139. Codec = textStream.CodecShortName,
  140. Type = MediaStreamType.Subtitle,
  141. Index = streams.Count
  142. });
  143. }
  144. /// <summary>
  145. /// Adds the subtitle stream.
  146. /// </summary>
  147. /// <param name="streams">The streams.</param>
  148. /// <param name="textStream">The text stream.</param>
  149. private void AddSubtitleStream(List<MediaStream> streams, TSGraphicsStream textStream)
  150. {
  151. streams.Add(new MediaStream
  152. {
  153. Language = textStream.LanguageCode,
  154. Codec = textStream.CodecShortName,
  155. Type = MediaStreamType.Subtitle,
  156. Index = streams.Count
  157. });
  158. }
  159. }