Selaa lähdekoodia

stub out media stream selector

Luke Pulverenti 11 vuotta sitten
vanhempi
sitoutus
dc3fa99ea5

+ 3 - 0
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -560,6 +560,9 @@
     <Compile Include="..\MediaBrowser.Model\MediaInfo\IBlurayExaminer.cs">
       <Link>MediaInfo\IBlurayExaminer.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\MediaInfo\MediaStreamSelector.cs">
+      <Link>MediaInfo\MediaStreamSelector.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\MediaInfo\SubtitleFormat.cs">
       <Link>MediaInfo\SubtitleFormat.cs</Link>
     </Compile>

+ 3 - 0
MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj

@@ -541,6 +541,9 @@
     <Compile Include="..\MediaBrowser.Model\MediaInfo\IBlurayExaminer.cs">
       <Link>MediaInfo\IBlurayExaminer.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\MediaInfo\MediaStreamSelector.cs">
+      <Link>MediaInfo\MediaStreamSelector.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\MediaInfo\SubtitleFormat.cs">
       <Link>MediaInfo\SubtitleFormat.cs</Link>
     </Compile>

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -172,6 +172,7 @@
     <Compile Include="Logging\NullLogger.cs" />
     <Compile Include="MediaInfo\AudioCodec.cs" />
     <Compile Include="MediaInfo\Container.cs" />
+    <Compile Include="MediaInfo\MediaStreamSelector.cs" />
     <Compile Include="MediaInfo\SubtitleFormat.cs" />
     <Compile Include="MediaInfo\TransportStreamTimestamp.cs" />
     <Compile Include="MediaInfo\VideoCodec.cs" />

+ 91 - 0
MediaBrowser.Model/MediaInfo/MediaStreamSelector.cs

@@ -0,0 +1,91 @@
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Entities;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace MediaBrowser.Model.MediaInfo
+{
+    public static class MediaStreamSelector
+    {
+        public static int? GetDefaultAudioStreamIndex(MediaSourceInfo mediaSource, IEnumerable<string> preferredLanguages, bool preferDefaultTrack)
+        {
+            var streams = GetSortedStreams(mediaSource.MediaStreams, MediaStreamType.Audio, preferredLanguages.FirstOrDefault())
+                .ToList();
+
+            if (preferDefaultTrack)
+            {
+                var defaultStream = streams.FirstOrDefault(i => i.IsDefault);
+
+                if (defaultStream != null)
+                {
+                    return defaultStream.Index;
+                }
+            }
+
+            var stream = streams.FirstOrDefault();
+
+            if (stream != null)
+            {
+                return stream.Index;
+            }
+
+            return null;
+        }
+
+        public static int? GetDefaultSubtitleStreamIndex(MediaSourceInfo mediaSource, 
+            IEnumerable<string> preferredLanguages, 
+            SubtitlePlaybackMode mode,
+            string audioTrackLanguage)
+        {
+            var streams = GetSortedStreams(mediaSource.MediaStreams, MediaStreamType.Subtitle, preferredLanguages.FirstOrDefault())
+                .ToList();
+
+            MediaStream stream = null;
+
+            if (mode == SubtitlePlaybackMode.Default)
+            {
+                stream = streams.FirstOrDefault(i => i.IsDefault);
+            }
+            else if (mode == SubtitlePlaybackMode.Always)
+            {
+                stream = streams.FirstOrDefault(i => i.IsDefault) ??
+                    streams.FirstOrDefault();
+            }
+            else if (mode == SubtitlePlaybackMode.OnlyForced)
+            {
+                stream = streams.FirstOrDefault(i => i.IsForced);
+            }
+
+            if (stream != null)
+            {
+                return stream.Index;
+            }
+
+            return null;
+        }
+        
+        private static IEnumerable<MediaStream> GetSortedStreams(IEnumerable<MediaStream> streams, MediaStreamType type, string defaultLanguage)
+        {
+            var orderStreams = streams
+                .Where(i => i.Type == type);
+
+            // For subs give a preference to text for performance
+
+            if (string.IsNullOrEmpty(defaultLanguage))
+            {
+                return orderStreams.OrderBy(i => i.IsDefault)
+                    .ThenBy(i => !i.IsGraphicalSubtitleStream)
+                    .ThenBy(i => i.Index)
+                    .ToList();
+            }
+
+            return orderStreams.OrderBy(i => string.Equals(i.Language, defaultLanguage, StringComparison.OrdinalIgnoreCase))
+                .ThenBy(i => i.IsDefault)
+                .ThenBy(i => !i.IsGraphicalSubtitleStream)
+                .ThenBy(i => i.Index)
+                .ToList();
+        }
+    }
+}