BdInfoExaminer.cs 5.6 KB

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