MediaStreamSelector.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using MediaBrowser.Model.Configuration;
  2. using MediaBrowser.Model.Entities;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. namespace MediaBrowser.Model.MediaInfo
  7. {
  8. public static class MediaStreamSelector
  9. {
  10. public static int? GetDefaultAudioStreamIndex(List<MediaStream> streams, IEnumerable<string> preferredLanguages, bool preferDefaultTrack)
  11. {
  12. streams = GetSortedStreams(streams, MediaStreamType.Audio, preferredLanguages.FirstOrDefault())
  13. .ToList();
  14. if (preferDefaultTrack)
  15. {
  16. var defaultStream = streams.FirstOrDefault(i => i.IsDefault);
  17. if (defaultStream != null)
  18. {
  19. return defaultStream.Index;
  20. }
  21. }
  22. var stream = streams.FirstOrDefault();
  23. if (stream != null)
  24. {
  25. return stream.Index;
  26. }
  27. return null;
  28. }
  29. public static int? GetDefaultSubtitleStreamIndex(List<MediaStream> streams,
  30. IEnumerable<string> preferredLanguages,
  31. SubtitlePlaybackMode mode,
  32. string audioTrackLanguage)
  33. {
  34. streams = GetSortedStreams(streams, MediaStreamType.Subtitle, preferredLanguages.FirstOrDefault())
  35. .ToList();
  36. MediaStream stream = null;
  37. if (mode == SubtitlePlaybackMode.Default)
  38. {
  39. stream = streams.FirstOrDefault(i => i.IsDefault);
  40. }
  41. else if (mode == SubtitlePlaybackMode.Always)
  42. {
  43. stream = streams.FirstOrDefault(i => i.IsDefault) ??
  44. streams.FirstOrDefault();
  45. }
  46. else if (mode == SubtitlePlaybackMode.OnlyForced)
  47. {
  48. stream = streams.FirstOrDefault(i => i.IsForced);
  49. }
  50. if (stream != null)
  51. {
  52. return stream.Index;
  53. }
  54. return null;
  55. }
  56. private static IEnumerable<MediaStream> GetSortedStreams(IEnumerable<MediaStream> streams, MediaStreamType type, string defaultLanguage)
  57. {
  58. var orderStreams = streams
  59. .Where(i => i.Type == type);
  60. if (string.IsNullOrEmpty(defaultLanguage))
  61. {
  62. return orderStreams.OrderBy(i => i.IsDefault)
  63. .ThenBy(i => i.Index)
  64. .ToList();
  65. }
  66. return orderStreams.OrderBy(i => string.Equals(i.Language, defaultLanguage, StringComparison.OrdinalIgnoreCase))
  67. .ThenBy(i => i.IsDefault)
  68. .ThenBy(i => i.Index)
  69. .ToList();
  70. }
  71. }
  72. }