Przeglądaj źródła

Merge pull request #1080 from MediaBrowser/dev

3.0.5582.1
Luke 10 lat temu
rodzic
commit
9b451f9095
25 zmienionych plików z 110 dodań i 236 usunięć
  1. 0 96
      MediaBrowser.Api/Playback/BaseStreamingService.cs
  2. 13 3
      MediaBrowser.Controller/Channels/Channel.cs
  3. 15 2
      MediaBrowser.Controller/Entities/Folder.cs
  4. 3 4
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  5. 1 1
      MediaBrowser.Controller/Sync/IServerSyncProvider.cs
  6. 1 1
      MediaBrowser.Controller/packages.config
  7. 1 1
      MediaBrowser.Model/Configuration/EncodingOptions.cs
  8. 15 12
      MediaBrowser.Model/Dlna/StreamBuilder.cs
  9. 0 6
      MediaBrowser.Model/Entities/MediaStream.cs
  10. 2 2
      MediaBrowser.Model/Session/ClientCapabilities.cs
  11. 6 3
      MediaBrowser.Model/Users/UserPolicy.cs
  12. 1 1
      MediaBrowser.Providers/Movies/FanArtMovieUpdatesPostScanTask.cs
  13. 1 8
      MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
  14. 3 4
      MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
  15. 34 78
      MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs
  16. 1 1
      MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
  17. 2 2
      MediaBrowser.Server.Implementations/Sync/CloudSyncProfile.cs
  18. 1 1
      MediaBrowser.Server.Implementations/Sync/MediaSync.cs
  19. 1 1
      MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs
  20. 1 1
      MediaBrowser.Server.Implementations/packages.config
  21. 2 2
      Nuget/MediaBrowser.Common.Internal.nuspec
  22. 1 1
      Nuget/MediaBrowser.Common.nuspec
  23. 1 1
      Nuget/MediaBrowser.Model.Signed.nuspec
  24. 3 3
      Nuget/MediaBrowser.Server.Core.nuspec
  25. 1 1
      SharedVersion.cs

+ 0 - 96
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -1709,102 +1709,6 @@ namespace MediaBrowser.Api.Playback
             {
                 state.OutputAudioCodec = "copy";
             }
-
-            if (string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase) && TranscodingJobType == TranscodingJobType.Hls)
-            {
-                var segmentLength = GetSegmentLength(state);
-                if (segmentLength.HasValue)
-                {
-                    state.SegmentLength = segmentLength.Value;
-                }
-            }
-        }
-
-        private int? GetSegmentLength(StreamState state)
-        {
-            var stream = state.VideoStream;
-
-            if (stream == null)
-            {
-                return null;
-            }
-
-            var frames = stream.KeyFrames;
-
-            if (frames == null || frames.Count < 2)
-            {
-                return null;
-            }
-
-            Logger.Debug("Found keyframes at {0}", string.Join(",", frames.ToArray()));
-
-            var intervals = new List<int>();
-            for (var i = 1; i < frames.Count; i++)
-            {
-                var start = frames[i - 1];
-                var end = frames[i];
-                intervals.Add(end - start);
-            }
-
-            Logger.Debug("Found keyframes intervals {0}", string.Join(",", intervals.ToArray()));
-
-            var results = new List<Tuple<int, int>>();
-
-            for (var i = 1; i <= 10; i++)
-            {
-                var idealMs = i*1000;
-
-                if (intervals.Max() < idealMs - 1000)
-                {
-                    break;
-                }
-
-                var segments = PredictStreamCopySegments(intervals, idealMs);
-                var variance = segments.Select(s => Math.Abs(idealMs - s)).Sum();
-
-                results.Add(new Tuple<int, int>(i, variance));
-            }
-
-            if (results.Count == 0)
-            {
-                return null;
-            }
-
-            return results.OrderBy(i => i.Item2).ThenBy(i => i.Item1).Select(i => i.Item1).First();
-        }
-
-        private List<int> PredictStreamCopySegments(List<int> intervals, int idealMs)
-        {
-            var segments = new List<int>();
-            var currentLength = 0;
-
-            foreach (var interval in intervals)
-            {
-                if (currentLength == 0 || (currentLength + interval) <= idealMs)
-                {
-                    currentLength += interval;
-                }
-
-                else
-                {
-                    // The segment will either be above or below the ideal. 
-                    // Need to figure out which is preferable
-                    var offset1 = Math.Abs(idealMs - currentLength);
-                    var offset2 = Math.Abs(idealMs - (currentLength + interval));
-
-                    if (offset1 <= offset2)
-                    {
-                        segments.Add(currentLength);
-                        currentLength = interval;
-                    }
-                    else
-                    {
-                        currentLength += interval;
-                    }
-                }
-            }
-            Logger.Debug("Predicted actual segment lengths for length {0}: {1}", idealMs, string.Join(",", segments.ToArray()));
-            return segments;
         }
 
         private void AttachMediaSourceInfo(StreamState state,

+ 13 - 3
MediaBrowser.Controller/Channels/Channel.cs

@@ -14,11 +14,21 @@ namespace MediaBrowser.Controller.Channels
 
         public override bool IsVisible(User user)
         {
-            if (!user.Policy.EnableAllChannels && !user.Policy.EnabledChannels.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
+            if (user.Policy.BlockedChannels != null)
             {
-                return false;
+                if (user.Policy.BlockedChannels.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
+                {
+                    return false;
+                }
             }
-            
+            else
+            {
+                if (!user.Policy.EnableAllChannels && !user.Policy.EnabledChannels.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
+                {
+                    return false;
+                }
+            }
+
             return base.IsVisible(user);
         }
 

+ 15 - 2
MediaBrowser.Controller/Entities/Folder.cs

@@ -334,9 +334,22 @@ namespace MediaBrowser.Controller.Entities
         {
             if (this is ICollectionFolder && !(this is BasePluginFolder))
             {
-                if (!user.Policy.EnableAllFolders && !user.Policy.EnabledFolders.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
+                if (user.Policy.BlockedMediaFolders != null)
                 {
-                    return false;
+                    if (user.Policy.BlockedMediaFolders.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase) ||
+
+                        // Backwards compatibility
+                        user.Policy.BlockedMediaFolders.Contains(Name, StringComparer.OrdinalIgnoreCase))
+                    {
+                        return false;
+                    }
+                }
+                else
+                {
+                    if (!user.Policy.EnableAllFolders && !user.Policy.EnabledFolders.Contains(Id.ToString("N"), StringComparer.OrdinalIgnoreCase))
+                    {
+                        return false;
+                    }
                 }
             }
 

+ 3 - 4
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -48,14 +48,13 @@
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Interfaces.IO">
+      <HintPath>..\packages\Interfaces.IO.1.0.0.5\lib\portable-net45+sl4+wp71+win8+wpa81\Interfaces.IO.dll</HintPath>
+    </Reference>
     <Reference Include="MoreLinq, Version=1.1.17511.0, Culture=neutral, PublicKeyToken=384d532d7e88985d, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\packages\morelinq.1.1.0\lib\net35\MoreLinq.dll</HintPath>
     </Reference>
-    <Reference Include="Patterns.IO, Version=1.0.5580.36861, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\Patterns.IO.1.0.0.3\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.IO.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Data" />

+ 1 - 1
MediaBrowser.Controller/Sync/IServerSyncProvider.cs

@@ -1,6 +1,6 @@
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Sync;
-using Patterns.IO;
+using Interfaces.IO;
 using System;
 using System.IO;
 using System.Threading;

+ 1 - 1
MediaBrowser.Controller/packages.config

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
+  <package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
   <package id="morelinq" version="1.1.0" targetFramework="net45" />
-  <package id="Patterns.IO" version="1.0.0.3" targetFramework="net45" />
 </packages>

+ 1 - 1
MediaBrowser.Model/Configuration/EncodingOptions.cs

@@ -17,7 +17,7 @@ namespace MediaBrowser.Model.Configuration
             DownMixAudioBoost = 2;
             EncodingQuality = EncodingQuality.Auto;
             EnableThrottling = true;
-            ThrottleThresholdSeconds = 120;
+            ThrottleThresholdSeconds = 90;
         }
     }
 }

+ 15 - 12
MediaBrowser.Model/Dlna/StreamBuilder.cs

@@ -564,10 +564,7 @@ namespace MediaBrowser.Model.Dlna
             {
                 if (!conditionProcessor.IsVideoConditionSatisfied(i, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams))
                 {
-                    _logger.Debug("Profile: {0}, DirectPlay=false. Reason=VideoContainerProfile.{1} Path: {2}",
-                        profile.Name ?? "Unknown Profile",
-                        i.Property,
-                        mediaSource.Path ?? "Unknown path");
+                    LogConditionFailure(profile, "VideoContainerProfile", i, mediaSource);
 
                     return null;
                 }
@@ -600,10 +597,7 @@ namespace MediaBrowser.Model.Dlna
             {
                 if (!conditionProcessor.IsVideoConditionSatisfied(i, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isCabac, refFrames, numVideoStreams, numAudioStreams))
                 {
-                    _logger.Debug("Profile: {0}, DirectPlay=false. Reason=VideoCodecProfile.{1} Path: {2}",
-                        profile.Name ?? "Unknown Profile",
-                        i.Property,
-                        mediaSource.Path ?? "Unknown path");
+                    LogConditionFailure(profile, "VideoCodecProfile", i, mediaSource);
 
                     return null;
                 }
@@ -639,10 +633,7 @@ namespace MediaBrowser.Model.Dlna
                     bool? isSecondaryAudio = audioStream == null ? null : mediaSource.IsSecondaryAudio(audioStream);
                     if (!conditionProcessor.IsVideoAudioConditionSatisfied(i, audioChannels, audioBitrate, audioProfile, isSecondaryAudio))
                     {
-                        _logger.Debug("Profile: {0}, DirectPlay=false. Reason=VideoAudioCodecProfile.{1} Path: {2}",
-                            profile.Name ?? "Unknown Profile",
-                            i.Property,
-                            mediaSource.Path ?? "Unknown path");
+                        LogConditionFailure(profile, "VideoAudioCodecProfile", i, mediaSource);
                         
                         return null;
                     }
@@ -679,6 +670,18 @@ namespace MediaBrowser.Model.Dlna
             return null;
         }
 
+        private void LogConditionFailure(DeviceProfile profile, string type, ProfileCondition condition, MediaSourceInfo mediaSource)
+        {
+            _logger.Debug("Profile: {0}, DirectPlay=false. Reason={1}.{2} Condition: {3}. ConditionValue: {4}. IsRequired: {5}. Path: {6}",
+                type,
+                profile.Name ?? "Unknown Profile",
+                condition.Property,
+                condition.Condition,
+                condition.Value ?? string.Empty,
+                condition.IsRequired,
+                mediaSource.Path ?? "Unknown path");
+        }
+
         private bool IsEligibleForDirectPlay(MediaSourceInfo item,
             int? maxBitrate,
             MediaStream subtitleStream,

+ 0 - 6
MediaBrowser.Model/Entities/MediaStream.cs

@@ -58,12 +58,6 @@ namespace MediaBrowser.Model.Entities
         /// </summary>
         /// <value>The length of the packet.</value>
         public int? PacketLength { get; set; }
-
-        /// <summary>
-        /// Gets or sets the key frames.
-        /// </summary>
-        /// <value>The key frames.</value>
-        public List<int> KeyFrames { get; set; }
         
         /// <summary>
         /// Gets or sets the channels.

+ 2 - 2
MediaBrowser.Model/Session/ClientCapabilities.cs

@@ -21,8 +21,8 @@ namespace MediaBrowser.Model.Session
         public DeviceProfile DeviceProfile { get; set; }
         public List<string> SupportedLiveMediaTypes { get; set; }
 
-        public string AppUrl { get; set; }
-        public string AppImageUrl { get; set; }
+        public string Url { get; set; }
+        public string ImageUrl { get; set; }
 
         public ClientCapabilities()
         {

+ 6 - 3
MediaBrowser.Model/Users/UserPolicy.cs

@@ -41,7 +41,7 @@ namespace MediaBrowser.Model.Users
         public bool EnableMediaPlayback { get; set; }
         public bool EnableAudioPlaybackTranscoding { get; set; }
         public bool EnableVideoPlaybackTranscoding { get; set; }
-   
+
         public bool EnableContentDeletion { get; set; }
         public bool EnableContentDownloading { get; set; }
 
@@ -64,7 +64,10 @@ namespace MediaBrowser.Model.Users
         public int InvalidLoginAttemptCount { get; set; }
 
         public bool EnablePublicSharing { get; set; }
-        
+
+        public string[] BlockedMediaFolders { get; set; }
+        public string[] BlockedChannels { get; set; }
+
         public UserPolicy()
         {
             EnableSync = true;
@@ -73,7 +76,7 @@ namespace MediaBrowser.Model.Users
             EnableMediaPlayback = true;
             EnableAudioPlaybackTranscoding = true;
             EnableVideoPlaybackTranscoding = true;
-     
+
             EnableLiveTvManagement = true;
             EnableLiveTvAccess = true;
 

+ 1 - 1
MediaBrowser.Providers/Movies/FanArtMovieUpdatesPostScanTask.cs

@@ -6,6 +6,7 @@ using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using MediaBrowser.Providers.Music;
+using MediaBrowser.Providers.TV;
 using System;
 using System.Collections.Generic;
 using System.Globalization;
@@ -14,7 +15,6 @@ using System.Linq;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Providers.TV;
 
 namespace MediaBrowser.Providers.Movies
 {

+ 1 - 8
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1007,12 +1007,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
                 innerProgress.RegisterAction(p => progress.Report(90 + (p * .1)));
                 await CleanDatabaseInternal(progress, cancellationToken).ConfigureAwait(false);
 
-                foreach (var program in _programs.Values
-                    .Where(i => (i.StartDate - DateTime.UtcNow).TotalDays <= 1)
-                    .ToList())
-                {
-                    RefreshIfNeeded(program);
-                }
+                RefreshIfNeeded(_programs.Values.Where(i => (i.StartDate - DateTime.UtcNow).TotalDays <= 1).ToList());
             }
             finally
             {
@@ -1145,8 +1140,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
             _refreshedPrograms.Clear();
             progress.Report(90);
 
-            RefreshIfNeeded(programs.Take(500));
-
             // Load these now which will prefetch metadata
             var dtoOptions = new DtoOptions();
             dtoOptions.Fields.Remove(ItemFields.SyncInfo);

+ 3 - 4
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -45,6 +45,9 @@
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="Interfaces.IO">
+      <HintPath>..\packages\Interfaces.IO.1.0.0.5\lib\portable-net45+sl4+wp71+win8+wpa81\Interfaces.IO.dll</HintPath>
+    </Reference>
     <Reference Include="MediaBrowser.Naming, Version=1.0.5509.27636, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\packages\MediaBrowser.Naming.1.0.0.32\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
@@ -57,10 +60,6 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\packages\morelinq.1.1.0\lib\net35\MoreLinq.dll</HintPath>
     </Reference>
-    <Reference Include="Patterns.IO, Version=1.0.5580.36861, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\Patterns.IO.1.0.0.3\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.IO.dll</HintPath>
-    </Reference>
     <Reference Include="Patterns.Logging">
       <HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>
       <Private>True</Private>

+ 34 - 78
MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs

@@ -41,7 +41,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
 
             // Add PixelFormat column
 
-            createTableCommand += "(ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, IsCabac BIT NULL, KeyFrames TEXT NULL, PRIMARY KEY (ItemId, StreamIndex))";
+            createTableCommand += "(ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, IsCabac BIT NULL, PRIMARY KEY (ItemId, StreamIndex))";
 
             string[] queries = {
 
@@ -62,7 +62,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
             AddIsAnamorphicColumn();
             AddIsCabacColumn();
             AddRefFramesCommand();
-            AddKeyFramesCommand();
 
             PrepareStatements();
 
@@ -162,37 +161,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
             _connection.RunQueries(new[] { builder.ToString() }, _logger);
         }
 
-        private void AddKeyFramesCommand()
-        {
-            using (var cmd = _connection.CreateCommand())
-            {
-                cmd.CommandText = "PRAGMA table_info(mediastreams)";
-
-                using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
-                {
-                    while (reader.Read())
-                    {
-                        if (!reader.IsDBNull(1))
-                        {
-                            var name = reader.GetString(1);
-
-                            if (string.Equals(name, "KeyFrames", StringComparison.OrdinalIgnoreCase))
-                            {
-                                return;
-                            }
-                        }
-                    }
-                }
-            }
-
-            var builder = new StringBuilder();
-
-            builder.AppendLine("alter table mediastreams");
-            builder.AppendLine("add column KeyFrames TEXT NULL");
-
-            _connection.RunQueries(new[] { builder.ToString() }, _logger);
-        }
-
         private void AddIsCabacColumn()
         {
             using (var cmd = _connection.CreateCommand())
@@ -282,7 +250,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
             "BitDepth",
             "IsAnamorphic",
             "RefFrames",
-            "KeyFrames",
             "IsCabac"
         };
 
@@ -464,12 +431,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
 
             if (!reader.IsDBNull(25))
             {
-                item.KeyFrames = reader.GetString(25).Split(',').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => int.Parse(i, CultureInfo.InvariantCulture)).ToList();
-            }
-
-            if (!reader.IsDBNull(26))
-            {
-                item.IsCabac = reader.GetBoolean(26);
+                item.IsCabac = reader.GetBoolean(25);
             }
 
             return item;
@@ -508,44 +470,38 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 {
                     cancellationToken.ThrowIfCancellationRequested();
 
-                    _saveStreamCommand.GetParameter(0).Value = id;
-                    _saveStreamCommand.GetParameter(1).Value = stream.Index;
-                    _saveStreamCommand.GetParameter(2).Value = stream.Type.ToString();
-                    _saveStreamCommand.GetParameter(3).Value = stream.Codec;
-                    _saveStreamCommand.GetParameter(4).Value = stream.Language;
-                    _saveStreamCommand.GetParameter(5).Value = stream.ChannelLayout;
-                    _saveStreamCommand.GetParameter(6).Value = stream.Profile;
-                    _saveStreamCommand.GetParameter(7).Value = stream.AspectRatio;
-                    _saveStreamCommand.GetParameter(8).Value = stream.Path;
-
-                    _saveStreamCommand.GetParameter(9).Value = stream.IsInterlaced;
-
-                    _saveStreamCommand.GetParameter(10).Value = stream.BitRate;
-                    _saveStreamCommand.GetParameter(11).Value = stream.Channels;
-                    _saveStreamCommand.GetParameter(12).Value = stream.SampleRate;
-
-                    _saveStreamCommand.GetParameter(13).Value = stream.IsDefault;
-                    _saveStreamCommand.GetParameter(14).Value = stream.IsForced;
-                    _saveStreamCommand.GetParameter(15).Value = stream.IsExternal;
-
-                    _saveStreamCommand.GetParameter(16).Value = stream.Width;
-                    _saveStreamCommand.GetParameter(17).Value = stream.Height;
-                    _saveStreamCommand.GetParameter(18).Value = stream.AverageFrameRate;
-                    _saveStreamCommand.GetParameter(19).Value = stream.RealFrameRate;
-                    _saveStreamCommand.GetParameter(20).Value = stream.Level;
-                    _saveStreamCommand.GetParameter(21).Value = stream.PixelFormat;
-                    _saveStreamCommand.GetParameter(22).Value = stream.BitDepth;
-                    _saveStreamCommand.GetParameter(23).Value = stream.IsAnamorphic;
-                    _saveStreamCommand.GetParameter(24).Value = stream.RefFrames;
-                    if (stream.KeyFrames != null)
-                    {
-                        _saveStreamCommand.GetParameter(25).Value = string.Join(",", stream.KeyFrames.Select(i => i.ToString(CultureInfo.InvariantCulture)).ToArray());
-                    }
-                    else
-                    {
-                        _saveStreamCommand.GetParameter(25).Value = null;
-                    }
-                    _saveStreamCommand.GetParameter(26).Value = stream.IsCabac;
+                    var index = 0;
+
+                    _saveStreamCommand.GetParameter(index++).Value = id;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Index;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Type.ToString();
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Codec;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Language;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.ChannelLayout;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Profile;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.AspectRatio;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Path;
+
+                    _saveStreamCommand.GetParameter(index++).Value = stream.IsInterlaced;
+
+                    _saveStreamCommand.GetParameter(index++).Value = stream.BitRate;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Channels;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.SampleRate;
+
+                    _saveStreamCommand.GetParameter(index++).Value = stream.IsDefault;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.IsForced;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.IsExternal;
+
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Width;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Height;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.AverageFrameRate;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.RealFrameRate;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.Level;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.PixelFormat;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.BitDepth;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.IsAnamorphic;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.RefFrames;
+                    _saveStreamCommand.GetParameter(index++).Value = stream.IsCabac;
 
                     _saveStreamCommand.Transaction = transaction;
                     _saveStreamCommand.ExecuteNonQuery();

+ 1 - 1
MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs

@@ -18,7 +18,7 @@ namespace MediaBrowser.Server.Implementations.Photos
         protected override Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
         {
             var photoAlbum = (PhotoAlbum)item;
-            var items = GetFinalItems(photoAlbum.GetRecursiveChildren().ToList());
+            var items = GetFinalItems(photoAlbum.Children.ToList());
 
             return Task.FromResult(items);
         }

+ 2 - 2
MediaBrowser.Server.Implementations/Sync/CloudSyncProfile.cs

@@ -206,7 +206,7 @@ namespace MediaBrowser.Server.Implementations.Sync
                             Condition = ProfileConditionType.LessThanEqual,
                             Property = ProfileConditionValue.AudioChannels,
                             Value = "5",
-                            IsRequired = true
+                            IsRequired = false
                         },
                         new ProfileCondition
                         {
@@ -220,7 +220,7 @@ namespace MediaBrowser.Server.Implementations.Sync
             codecProfiles.Add(new CodecProfile
             {
                 Type = CodecType.VideoAudio,
-                Codec = "ac3",
+                Codec = "aac,mp3",
                 Conditions = new[]
                     {
                         new ProfileCondition

+ 1 - 1
MediaBrowser.Server.Implementations/Sync/MediaSync.cs

@@ -18,7 +18,7 @@ using System.Security.Cryptography;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
-using Patterns.IO;
+using Interfaces.IO;
 
 namespace MediaBrowser.Server.Implementations.Sync
 {

+ 1 - 1
MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs

@@ -11,7 +11,7 @@ using System.IO;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
-using Patterns.IO;
+using Interfaces.IO;
 
 namespace MediaBrowser.Server.Implementations.Sync
 {

+ 1 - 1
MediaBrowser.Server.Implementations/packages.config

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
+  <package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
   <package id="MediaBrowser.Naming" version="1.0.0.32" targetFramework="net45" />
   <package id="Mono.Nat" version="1.2.23.0" targetFramework="net45" />
   <package id="morelinq" version="1.1.0" targetFramework="net45" />
-  <package id="Patterns.IO" version="1.0.0.3" targetFramework="net45" />
   <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
   <package id="SocketHttpListener" version="1.0.0.4" targetFramework="net45" />
 </packages>

+ 2 - 2
Nuget/MediaBrowser.Common.Internal.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.619</version>
+        <version>3.0.620</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains common components shared by Emby Theater and Emby Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Emby 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.619" />
+            <dependency id="MediaBrowser.Common" version="3.0.620" />
             <dependency id="NLog" version="3.2.0.0" />
             <dependency id="SimpleInjector" version="2.7.0" />
         </dependencies>

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.619</version>
+        <version>3.0.620</version>
         <title>MediaBrowser.Common</title>
         <authors>Emby Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 1 - 1
Nuget/MediaBrowser.Model.Signed.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Model.Signed</id>
-        <version>3.0.619</version>
+        <version>3.0.620</version>
         <title>MediaBrowser.Model - Signed Edition</title>
         <authors>Emby Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 3 - 3
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.619</version>
+        <version>3.0.620</version>
         <title>Media Browser.Server.Core</title>
         <authors>Emby Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,8 +12,8 @@
         <description>Contains core components required to build plugins for Emby Server.</description>
         <copyright>Copyright © Emby 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.619" />
-			<dependency id="Patterns.IO" version="1.0.0.3" />
+            <dependency id="MediaBrowser.Common" version="3.0.620" />
+			<dependency id="Interfaces.IO" version="1.0.0.5" />
         </dependencies>
     </metadata>
     <files>

+ 1 - 1
SharedVersion.cs

@@ -1,4 +1,4 @@
 using System.Reflection;
 
 //[assembly: AssemblyVersion("3.0.*")]
-[assembly: AssemblyVersion("3.0.5582.0")]
+[assembly: AssemblyVersion("3.0.5582.1")]