ConditionProcessor.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #pragma warning disable CS1591
  2. #pragma warning disable SA1600
  3. using System;
  4. using System.Globalization;
  5. using MediaBrowser.Model.Extensions;
  6. using MediaBrowser.Model.MediaInfo;
  7. namespace MediaBrowser.Model.Dlna
  8. {
  9. public static class ConditionProcessor
  10. {
  11. public static bool IsVideoConditionSatisfied(
  12. ProfileCondition condition,
  13. int? width,
  14. int? height,
  15. int? videoBitDepth,
  16. int? videoBitrate,
  17. string videoProfile,
  18. double? videoLevel,
  19. float? videoFramerate,
  20. int? packetLength,
  21. TransportStreamTimestamp? timestamp,
  22. bool? isAnamorphic,
  23. bool? isInterlaced,
  24. int? refFrames,
  25. int? numVideoStreams,
  26. int? numAudioStreams,
  27. string videoCodecTag,
  28. bool? isAvc)
  29. {
  30. switch (condition.Property)
  31. {
  32. case ProfileConditionValue.IsInterlaced:
  33. return IsConditionSatisfied(condition, isInterlaced);
  34. case ProfileConditionValue.IsAnamorphic:
  35. return IsConditionSatisfied(condition, isAnamorphic);
  36. case ProfileConditionValue.IsAvc:
  37. return IsConditionSatisfied(condition, isAvc);
  38. case ProfileConditionValue.VideoFramerate:
  39. return IsConditionSatisfied(condition, videoFramerate);
  40. case ProfileConditionValue.VideoLevel:
  41. return IsConditionSatisfied(condition, videoLevel);
  42. case ProfileConditionValue.VideoProfile:
  43. return IsConditionSatisfied(condition, videoProfile);
  44. case ProfileConditionValue.VideoCodecTag:
  45. return IsConditionSatisfied(condition, videoCodecTag);
  46. case ProfileConditionValue.PacketLength:
  47. return IsConditionSatisfied(condition, packetLength);
  48. case ProfileConditionValue.VideoBitDepth:
  49. return IsConditionSatisfied(condition, videoBitDepth);
  50. case ProfileConditionValue.VideoBitrate:
  51. return IsConditionSatisfied(condition, videoBitrate);
  52. case ProfileConditionValue.Height:
  53. return IsConditionSatisfied(condition, height);
  54. case ProfileConditionValue.Width:
  55. return IsConditionSatisfied(condition, width);
  56. case ProfileConditionValue.RefFrames:
  57. return IsConditionSatisfied(condition, refFrames);
  58. case ProfileConditionValue.NumAudioStreams:
  59. return IsConditionSatisfied(condition, numAudioStreams);
  60. case ProfileConditionValue.NumVideoStreams:
  61. return IsConditionSatisfied(condition, numVideoStreams);
  62. case ProfileConditionValue.VideoTimestamp:
  63. return IsConditionSatisfied(condition, timestamp);
  64. default:
  65. return true;
  66. }
  67. }
  68. public static bool IsImageConditionSatisfied(ProfileCondition condition, int? width, int? height)
  69. {
  70. switch (condition.Property)
  71. {
  72. case ProfileConditionValue.Height:
  73. return IsConditionSatisfied(condition, height);
  74. case ProfileConditionValue.Width:
  75. return IsConditionSatisfied(condition, width);
  76. default:
  77. throw new ArgumentException("Unexpected condition on image file: " + condition.Property);
  78. }
  79. }
  80. public static bool IsAudioConditionSatisfied(ProfileCondition condition, int? audioChannels, int? audioBitrate, int? audioSampleRate, int? audioBitDepth)
  81. {
  82. switch (condition.Property)
  83. {
  84. case ProfileConditionValue.AudioBitrate:
  85. return IsConditionSatisfied(condition, audioBitrate);
  86. case ProfileConditionValue.AudioChannels:
  87. return IsConditionSatisfied(condition, audioChannels);
  88. case ProfileConditionValue.AudioSampleRate:
  89. return IsConditionSatisfied(condition, audioSampleRate);
  90. case ProfileConditionValue.AudioBitDepth:
  91. return IsConditionSatisfied(condition, audioBitDepth);
  92. default:
  93. throw new ArgumentException("Unexpected condition on audio file: " + condition.Property);
  94. }
  95. }
  96. public static bool IsVideoAudioConditionSatisfied(
  97. ProfileCondition condition,
  98. int? audioChannels,
  99. int? audioBitrate,
  100. int? audioSampleRate,
  101. int? audioBitDepth,
  102. string audioProfile,
  103. bool? isSecondaryTrack)
  104. {
  105. switch (condition.Property)
  106. {
  107. case ProfileConditionValue.AudioProfile:
  108. return IsConditionSatisfied(condition, audioProfile);
  109. case ProfileConditionValue.AudioBitrate:
  110. return IsConditionSatisfied(condition, audioBitrate);
  111. case ProfileConditionValue.AudioChannels:
  112. return IsConditionSatisfied(condition, audioChannels);
  113. case ProfileConditionValue.IsSecondaryAudio:
  114. return IsConditionSatisfied(condition, isSecondaryTrack);
  115. case ProfileConditionValue.AudioSampleRate:
  116. return IsConditionSatisfied(condition, audioSampleRate);
  117. case ProfileConditionValue.AudioBitDepth:
  118. return IsConditionSatisfied(condition, audioBitDepth);
  119. default:
  120. throw new ArgumentException("Unexpected condition on audio file: " + condition.Property);
  121. }
  122. }
  123. private static bool IsConditionSatisfied(ProfileCondition condition, int? currentValue)
  124. {
  125. if (!currentValue.HasValue)
  126. {
  127. // If the value is unknown, it satisfies if not marked as required
  128. return !condition.IsRequired;
  129. }
  130. if (int.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var expected))
  131. {
  132. switch (condition.Condition)
  133. {
  134. case ProfileConditionType.Equals:
  135. case ProfileConditionType.EqualsAny:
  136. return currentValue.Value.Equals(expected);
  137. case ProfileConditionType.GreaterThanEqual:
  138. return currentValue.Value >= expected;
  139. case ProfileConditionType.LessThanEqual:
  140. return currentValue.Value <= expected;
  141. case ProfileConditionType.NotEquals:
  142. return !currentValue.Value.Equals(expected);
  143. default:
  144. throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
  145. }
  146. }
  147. return false;
  148. }
  149. private static bool IsConditionSatisfied(ProfileCondition condition, string currentValue)
  150. {
  151. if (string.IsNullOrEmpty(currentValue))
  152. {
  153. // If the value is unknown, it satisfies if not marked as required
  154. return !condition.IsRequired;
  155. }
  156. string expected = condition.Value;
  157. switch (condition.Condition)
  158. {
  159. case ProfileConditionType.EqualsAny:
  160. {
  161. return ListHelper.ContainsIgnoreCase(expected.Split('|'), currentValue);
  162. }
  163. case ProfileConditionType.Equals:
  164. return string.Equals(currentValue, expected, StringComparison.OrdinalIgnoreCase);
  165. case ProfileConditionType.NotEquals:
  166. return !string.Equals(currentValue, expected, StringComparison.OrdinalIgnoreCase);
  167. default:
  168. throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
  169. }
  170. }
  171. private static bool IsConditionSatisfied(ProfileCondition condition, bool? currentValue)
  172. {
  173. if (!currentValue.HasValue)
  174. {
  175. // If the value is unknown, it satisfies if not marked as required
  176. return !condition.IsRequired;
  177. }
  178. if (bool.TryParse(condition.Value, out var expected))
  179. {
  180. switch (condition.Condition)
  181. {
  182. case ProfileConditionType.Equals:
  183. return currentValue.Value == expected;
  184. case ProfileConditionType.NotEquals:
  185. return currentValue.Value != expected;
  186. default:
  187. throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
  188. }
  189. }
  190. return false;
  191. }
  192. private static bool IsConditionSatisfied(ProfileCondition condition, float currentValue)
  193. {
  194. if (currentValue <= 0)
  195. {
  196. // If the value is unknown, it satisfies if not marked as required
  197. return !condition.IsRequired;
  198. }
  199. if (float.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var expected))
  200. {
  201. switch (condition.Condition)
  202. {
  203. case ProfileConditionType.Equals:
  204. return currentValue.Equals(expected);
  205. case ProfileConditionType.GreaterThanEqual:
  206. return currentValue >= expected;
  207. case ProfileConditionType.LessThanEqual:
  208. return currentValue <= expected;
  209. case ProfileConditionType.NotEquals:
  210. return !currentValue.Equals(expected);
  211. default:
  212. throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
  213. }
  214. }
  215. return false;
  216. }
  217. private static bool IsConditionSatisfied(ProfileCondition condition, double? currentValue)
  218. {
  219. if (!currentValue.HasValue)
  220. {
  221. // If the value is unknown, it satisfies if not marked as required
  222. return !condition.IsRequired;
  223. }
  224. if (double.TryParse(condition.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var expected))
  225. {
  226. switch (condition.Condition)
  227. {
  228. case ProfileConditionType.Equals:
  229. return currentValue.Value.Equals(expected);
  230. case ProfileConditionType.GreaterThanEqual:
  231. return currentValue.Value >= expected;
  232. case ProfileConditionType.LessThanEqual:
  233. return currentValue.Value <= expected;
  234. case ProfileConditionType.NotEquals:
  235. return !currentValue.Value.Equals(expected);
  236. default:
  237. throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
  238. }
  239. }
  240. return false;
  241. }
  242. private static bool IsConditionSatisfied(ProfileCondition condition, TransportStreamTimestamp? timestamp)
  243. {
  244. if (!timestamp.HasValue)
  245. {
  246. // If the value is unknown, it satisfies if not marked as required
  247. return !condition.IsRequired;
  248. }
  249. var expected = (TransportStreamTimestamp)Enum.Parse(typeof(TransportStreamTimestamp), condition.Value, true);
  250. switch (condition.Condition)
  251. {
  252. case ProfileConditionType.Equals:
  253. return timestamp == expected;
  254. case ProfileConditionType.NotEquals:
  255. return timestamp != expected;
  256. default:
  257. throw new InvalidOperationException("Unexpected ProfileConditionType: " + condition.Condition);
  258. }
  259. }
  260. }
  261. }