2
0
Luke Pulverenti 11 жил өмнө
parent
commit
063675bb07
58 өөрчлөгдсөн 403 нэмэгдсэн , 141 устгасан
  1. 11 3
      MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
  2. 20 0
      MediaBrowser.Api/SystemService.cs
  3. 6 0
      MediaBrowser.Controller/IServerApplicationHost.cs
  4. 8 0
      MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs
  5. 1 1
      MediaBrowser.Dlna/Didl/DidlBuilder.cs
  6. 2 2
      MediaBrowser.Dlna/PlayTo/PlayToController.cs
  7. 2 1
      MediaBrowser.Dlna/Profiles/DefaultProfile.cs
  8. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Android.xml
  9. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Default.xml
  10. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml
  11. 2 1
      MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml
  12. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml
  13. 2 1
      MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml
  14. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml
  15. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml
  16. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml
  17. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml
  18. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml
  19. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml
  20. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml
  21. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml
  22. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml
  23. 2 1
      MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml
  24. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml
  25. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml
  26. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml
  27. 2 1
      MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml
  28. 2 1
      MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml
  29. 3 0
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  30. 3 0
      MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
  31. 42 18
      MediaBrowser.Model/ApiClient/IApiClient.cs
  32. 22 0
      MediaBrowser.Model/ApiClient/ServerDiscoveryInfo.cs
  33. 0 1
      MediaBrowser.Model/Configuration/ServerConfiguration.cs
  34. 24 0
      MediaBrowser.Model/Dlna/AudioOptions.cs
  35. 3 2
      MediaBrowser.Model/Dlna/DeviceProfile.cs
  36. 2 2
      MediaBrowser.Model/Dlna/StreamBuilder.cs
  37. 1 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  38. 1 1
      MediaBrowser.Model/Sync/SyncJobStatus.cs
  39. 22 19
      MediaBrowser.Model/System/SystemInfo.cs
  40. 6 0
      MediaBrowser.Model/Users/AuthenticationResult.cs
  41. 2 10
      MediaBrowser.Providers/Manager/ProviderManager.cs
  42. 2 2
      MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
  43. 19 6
      MediaBrowser.Server.Implementations/Dto/DtoService.cs
  44. 5 2
      MediaBrowser.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
  45. 21 0
      MediaBrowser.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs
  46. 13 20
      MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
  47. 11 1
      MediaBrowser.Server.Implementations/Localization/Server/server.json
  48. 1 0
      MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
  49. 24 0
      MediaBrowser.Server.Implementations/Security/EncryptionManager.cs
  50. 2 1
      MediaBrowser.Server.Implementations/Session/SessionManager.cs
  51. 2 1
      MediaBrowser.Server.Implementations/Sync/SyncManager.cs
  52. 60 16
      MediaBrowser.Server.Implementations/Udp/UdpServer.cs
  53. 13 1
      MediaBrowser.ServerApplication/ApplicationHost.cs
  54. 0 3
      MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
  55. 3 3
      Nuget/MediaBrowser.Common.Internal.nuspec
  56. 1 1
      Nuget/MediaBrowser.Common.nuspec
  57. 1 1
      Nuget/MediaBrowser.Model.Signed.nuspec
  58. 2 2
      Nuget/MediaBrowser.Server.Core.nuspec

+ 11 - 3
MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs

@@ -269,10 +269,18 @@ namespace MediaBrowser.Api.Playback.Hls
 
             var segmentFilename = Path.GetFileName(segmentPath);
 
-            // If it appears in the playlist, it's done
-            if (File.ReadAllText(playlistPath).IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
+            using (var fileStream = FileSystem.GetFileStream(playlistPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true))
             {
-                return ResultFactory.GetStaticFileResult(Request, segmentPath, FileShare.ReadWrite);
+                using (var reader = new StreamReader(fileStream))
+                {
+                    var text = await reader.ReadToEndAsync().ConfigureAwait(false);
+
+                    // If it appears in the playlist, it's done
+                    if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
+                    {
+                        return ResultFactory.GetStaticFileResult(Request, segmentPath, FileShare.ReadWrite);
+                    }
+                }
             }
 
             // if a different file is encoding, it's done

+ 20 - 0
MediaBrowser.Api/SystemService.cs

@@ -21,6 +21,12 @@ namespace MediaBrowser.Api
 
     }
 
+    [Route("/System/Info/Public", "GET", Summary = "Gets public information about the server")]
+    public class GetPublicSystemInfo : IReturn<PublicSystemInfo>
+    {
+
+    }
+
     /// <summary>
     /// Class RestartApplication
     /// </summary>
@@ -125,6 +131,20 @@ namespace MediaBrowser.Api
             return ToOptimizedResult(result);
         }
 
+        public object Get(GetPublicSystemInfo request)
+        {
+            var result = _appHost.GetSystemInfo();
+
+            var publicInfo = new PublicSystemInfo
+            {
+                Id = result.Id,
+                ServerName = result.ServerName,
+                Version = result.Version
+            };
+
+            return ToOptimizedResult(publicInfo);
+        }
+
         /// <summary>
         /// Posts the specified request.
         /// </summary>

+ 6 - 0
MediaBrowser.Controller/IServerApplicationHost.cs

@@ -40,5 +40,11 @@ namespace MediaBrowser.Controller
         /// </summary>
         /// <value><c>true</c> if this instance has update available; otherwise, <c>false</c>.</value>
         bool HasUpdateAvailable { get; }
+
+        /// <summary>
+        /// Gets or sets the server identifier.
+        /// </summary>
+        /// <value>The server identifier.</value>
+        string ServerId { get; }
     }
 }

+ 8 - 0
MediaBrowser.Dlna/Channels/DlnaChannelFactory.cs

@@ -201,6 +201,14 @@ namespace MediaBrowser.Dlna.Channels
         private readonly ILogger _logger;
         private readonly string _controlUrl;
 
+        /// <summary>
+        /// Prevents core from throwing an exception
+        /// </summary>
+        public ServerChannel()
+        {
+            
+        }
+
         public ServerChannel(List<Device> servers, IHttpClient httpClient, ILogger logger, string controlUrl)
         {
             _servers = servers;

+ 1 - 1
MediaBrowser.Dlna/Didl/DidlBuilder.cs

@@ -108,7 +108,7 @@ namespace MediaBrowser.Dlna.Didl
                    MediaSources = sources,
                    Profile = _profile,
                    DeviceId = deviceId,
-                   MaxBitrate = _profile.MaxBitrate
+                   MaxBitrate = _profile.MaxStreamingBitrate
                });
             }
 

+ 2 - 2
MediaBrowser.Dlna/PlayTo/PlayToController.cs

@@ -537,7 +537,7 @@ namespace MediaBrowser.Dlna.PlayTo
                         MediaSources = mediaSources,
                         Profile = profile,
                         DeviceId = deviceId,
-                        MaxBitrate = profile.MaxBitrate,
+                        MaxBitrate = profile.MaxStreamingBitrate,
                         MediaSourceId = mediaSourceId,
                         AudioStreamIndex = audioStreamIndex,
                         SubtitleStreamIndex = subtitleStreamIndex
@@ -557,7 +557,7 @@ namespace MediaBrowser.Dlna.PlayTo
                         MediaSources = mediaSources,
                         Profile = profile,
                         DeviceId = deviceId,
-                        MaxBitrate = profile.MaxBitrate,
+                        MaxBitrate = profile.MaxStreamingBitrate,
                         MediaSourceId = mediaSourceId
                     }),
 

+ 2 - 1
MediaBrowser.Dlna/Profiles/DefaultProfile.cs

@@ -27,7 +27,8 @@ namespace MediaBrowser.Dlna.Profiles
             MaxAlbumArtHeight = 512;
             MaxAlbumArtWidth = 512;
 
-            MaxBitrate = 8000000;
+            MaxStreamingBitrate = 8000000;
+            MaxStaticBitrate = 8000000;
 
             TranscodingProfiles = new[]
             {

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Android.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Default.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Denon AVR.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/LG Smart TV.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Linksys DMA2100.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/MediaMonkey.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Panasonic Viera.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Samsung Smart TV.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player 2013.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Sony Blu-ray Player.xml


+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2010).xml

@@ -23,7 +23,8 @@
   <MaxAlbumArtHeight>512</MaxAlbumArtHeight>
   <MaxIconWidth xsi:nil="true" />
   <MaxIconHeight xsi:nil="true" />
-  <MaxBitrate>8000000</MaxBitrate>
+  <MaxStreamingBitrate>8000000</MaxStreamingBitrate>
+  <MaxStaticBitrate>8000000</MaxStaticBitrate>
   <XDlnaDoc>DMS-1.50</XDlnaDoc>
   <SonyAggregationFlags>10</SonyAggregationFlags>
   <ProtocolInfo>http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_FLAGS=81500000000000000000000000000000,http-get:*:image/jpeg:DLNA.ORG_PN=JPEG_SM;DLNA.ORG_OP=00;DLNA.ORG_FLAGS=00D00000000000000000000000000000,http-get:*:video/mpeg:DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=11;DLNA.ORG_FLAGS=81500000000000000000000000000000</ProtocolInfo>

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2011).xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2012).xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Sony Bravia (2013).xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Sony PlayStation 3.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/WDTV Live.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Windows 8 RT.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Windows Phone.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Xbox 360.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/Xbox One.xml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
MediaBrowser.Dlna/Profiles/Xml/foobar2000.xml


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

@@ -98,6 +98,9 @@
     <Compile Include="..\MediaBrowser.Model\ApiClient\IServerEvents.cs">
       <Link>ApiClient\IServerEvents.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\ApiClient\ServerDiscoveryInfo.cs">
+      <Link>ApiClient\ServerDiscoveryInfo.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\ApiClient\SessionUpdatesEventArgs.cs">
       <Link>ApiClient\SessionUpdatesEventArgs.cs</Link>
     </Compile>

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

@@ -61,6 +61,9 @@
     <Compile Include="..\MediaBrowser.Model\ApiClient\IServerEvents.cs">
       <Link>ApiClient\IServerEvents.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\ApiClient\ServerDiscoveryInfo.cs">
+      <Link>ApiClient\ServerDiscoveryInfo.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\ApiClient\SessionUpdatesEventArgs.cs">
       <Link>ApiClient\SessionUpdatesEventArgs.cs</Link>
     </Compile>

+ 42 - 18
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -226,7 +226,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="userId">The user identifier.</param>
         /// <returns>Task{BaseItemDto[]}.</returns>
         Task<ItemsResult> GetAdditionalParts(string itemId, string userId);
-        
+
         /// <summary>
         /// Gets the users async.
         /// </summary>
@@ -253,7 +253,7 @@ namespace MediaBrowser.Model.ApiClient
         /// </summary>
         /// <returns>Task{SessionInfoDto}.</returns>
         Task<SessionInfoDto> GetCurrentSessionAsync(CancellationToken cancellationToken);
-        
+
         /// <summary>
         /// Gets the item counts async.
         /// </summary>
@@ -368,7 +368,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="query">The query.</param>
         /// <returns>Task{ItemsResult}.</returns>
         Task<ItemsResult> GetAlbumArtistsAsync(ArtistsQuery query);
-        
+
         /// <summary>
         /// Gets a studio
         /// </summary>
@@ -467,6 +467,13 @@ namespace MediaBrowser.Model.ApiClient
         /// <returns>Task{SystemInfo}.</returns>
         Task<SystemInfo> GetSystemInfoAsync(CancellationToken cancellationToken);
 
+        /// <summary>
+        /// Gets the public system information asynchronous.
+        /// </summary>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>Task&lt;PublicSystemInfo&gt;.</returns>
+        Task<PublicSystemInfo> GetPublicSystemInfoAsync(CancellationToken cancellationToken);
+        
         /// <summary>
         /// Gets a person
         /// </summary>
@@ -672,7 +679,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="index">The index.</param>
         /// <returns>Task.</returns>
         Task SetSubtitleStreamIndex(string sessionId, int? index);
-        
+
         /// <summary>
         /// Instructs the client to display a message to the user
         /// </summary>
@@ -772,23 +779,16 @@ namespace MediaBrowser.Model.ApiClient
         IJsonSerializer JsonSerializer { get; set; }
 
         /// <summary>
-        /// Gets or sets the server host name (myserver or 192.168.x.x)
-        /// </summary>
-        /// <value>The name of the server host.</value>
-        string ServerHostName { get; }
-
-        /// <summary>
-        /// Gets or sets the port number used by the API
+        /// Gets or sets the server address
         /// </summary>
-        /// <value>The server API port.</value>
-        int ServerApiPort { get; }
+        /// <value>The server address.</value>
+        string ServerAddress { get; }
 
         /// <summary>
         /// Changes the server location.
         /// </summary>
-        /// <param name="hostName">Name of the host.</param>
-        /// <param name="apiPort">The API port.</param>
-        void ChangeServerLocation(string hostName, int apiPort);
+        /// <param name="address">The address.</param>
+        void ChangeServerLocation(string address);
 
         /// <summary>
         /// Gets or sets the type of the client.
@@ -812,7 +812,31 @@ namespace MediaBrowser.Model.ApiClient
         /// Gets or sets the current user id.
         /// </summary>
         /// <value>The current user id.</value>
-        string CurrentUserId { get; set; }
+        string CurrentUserId { get; }
+
+        /// <summary>
+        /// Gets the access token.
+        /// </summary>
+        /// <value>The access token.</value>
+        string AccessToken { get; }
+
+        /// <summary>
+        /// Sets the authentication information.
+        /// </summary>
+        /// <param name="accessToken">The access token.</param>
+        /// <param name="userId">The user identifier.</param>
+        void SetAuthenticationInfo(string accessToken, string userId);
+        
+        /// <summary>
+        /// Sets the authentication information.
+        /// </summary>
+        /// <param name="accessToken">The access token.</param>
+        void SetAuthenticationInfo(string accessToken);
+
+        /// <summary>
+        /// Clears the authentication information.
+        /// </summary>
+        void ClearAuthenticationInfo();
 
         /// <summary>
         /// Gets the image URL.
@@ -853,7 +877,7 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="options">The options.</param>
         /// <returns>System.String.</returns>
         string GetSubtitleUrl(SubtitleDownloadOptions options);
-        
+
         /// <summary>
         /// Gets an image url that can be used to download an image from the api
         /// </summary>

+ 22 - 0
MediaBrowser.Model/ApiClient/ServerDiscoveryInfo.cs

@@ -0,0 +1,22 @@
+
+namespace MediaBrowser.Model.ApiClient
+{
+    public class ServerDiscoveryInfo
+    {
+        /// <summary>
+        /// Gets or sets the address.
+        /// </summary>
+        /// <value>The address.</value>
+        public string Address { get; set; }
+        /// <summary>
+        /// Gets or sets the server identifier.
+        /// </summary>
+        /// <value>The server identifier.</value>
+        public string Id { get; set; }
+        /// <summary>
+        /// Gets or sets the name.
+        /// </summary>
+        /// <value>The name.</value>
+        public string Name { get; set; }
+    }
+}

+ 0 - 1
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -304,7 +304,6 @@ namespace MediaBrowser.Model.Configuration
             };
 
             SubtitleOptions = new SubtitleOptions();
-            LiveTvOptions = new LiveTvOptions();
             TvFileOrganizationOptions = new TvFileOrganizationOptions();
         }
     }

+ 24 - 0
MediaBrowser.Model/Dlna/AudioOptions.cs

@@ -35,5 +35,29 @@ namespace MediaBrowser.Model.Dlna
         /// </summary>
         /// <value>The context.</value>
         public EncodingContext Context { get; set; }
+
+        /// <summary>
+        /// Gets the maximum bitrate.
+        /// </summary>
+        /// <returns>System.Nullable&lt;System.Int32&gt;.</returns>
+        public int? GetMaxBitrate()
+        {
+            if (MaxBitrate.HasValue)
+            {
+                return MaxBitrate;
+            }
+
+            if (Profile != null)
+            {
+                if (Context == EncodingContext.Static)
+                {
+                    return Profile.MaxStaticBitrate;
+                }
+
+                return Profile.MaxStreamingBitrate;
+            }
+
+            return null;
+        }
     }
 }

+ 3 - 2
MediaBrowser.Model/Dlna/DeviceProfile.cs

@@ -49,8 +49,9 @@ namespace MediaBrowser.Model.Dlna
         public int? MaxIconWidth { get; set; }
         public int? MaxIconHeight { get; set; }
 
-        public int? MaxBitrate { get; set; }
-        
+        public int? MaxStreamingBitrate { get; set; }
+        public int? MaxStaticBitrate { get; set; }
+
         /// <summary>
         /// Controls the content of the X_DLNADOC element in the urn:schemas-dlna-org:device-1-0 namespace.
         /// </summary>

+ 2 - 2
MediaBrowser.Model/Dlna/StreamBuilder.cs

@@ -105,7 +105,7 @@ namespace MediaBrowser.Model.Dlna
                 RunTimeTicks = item.RunTimeTicks
             };
 
-            int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate;
+            int? maxBitrateSetting = options.GetMaxBitrate();
 
             MediaStream audioStream = item.DefaultAudioStream;
 
@@ -243,7 +243,7 @@ namespace MediaBrowser.Model.Dlna
 
             MediaStream videoStream = item.VideoStream;
 
-            int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate;
+            int? maxBitrateSetting = options.GetMaxBitrate();
 
             if (IsEligibleForDirectPlay(item, maxBitrateSetting, subtitleStream, options))
             {

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

@@ -64,6 +64,7 @@
     <Compile Include="ApiClient\ApiClientExtensions.cs" />
     <Compile Include="ApiClient\IServerEvents.cs" />
     <Compile Include="ApiClient\GeneralCommandEventArgs.cs" />
+    <Compile Include="ApiClient\ServerDiscoveryInfo.cs" />
     <Compile Include="ApiClient\SessionUpdatesEventArgs.cs" />
     <Compile Include="Branding\BrandingOptions.cs" />
     <Compile Include="Channels\ChannelFeatures.cs" />

+ 1 - 1
MediaBrowser.Model/Sync/SyncJobStatus.cs

@@ -6,7 +6,7 @@ namespace MediaBrowser.Model.Sync
         Queued = 0,
         Transcoding = 1,
         TranscodingFailed = 2,
-        Transfering = 3,
+        Transferring = 3,
         Completed = 4,
         Cancelled = 5
     }

+ 22 - 19
MediaBrowser.Model/System/SystemInfo.cs

@@ -6,14 +6,8 @@ namespace MediaBrowser.Model.System
     /// <summary>
     /// Class SystemInfo
     /// </summary>
-    public class SystemInfo
+    public class SystemInfo : PublicSystemInfo
     {
-        /// <summary>
-        /// Gets or sets the version.
-        /// </summary>
-        /// <value>The version.</value>
-        public string Version { get; set; }
-
         /// <summary>
         /// Gets or sets the operating sytem.
         /// </summary>
@@ -86,12 +80,6 @@ namespace MediaBrowser.Model.System
         /// <value>The failed assembly loads.</value>
         public List<string> FailedPluginAssemblies { get; set; }
 
-        /// <summary>
-        /// Gets or sets the id.
-        /// </summary>
-        /// <value>The id.</value>
-        public string Id { get; set; }
-
         /// <summary>
         /// Gets or sets the program data path.
         /// </summary>
@@ -152,12 +140,6 @@ namespace MediaBrowser.Model.System
         /// <value><c>true</c> if [supports automatic run at startup]; otherwise, <c>false</c>.</value>
         public bool SupportsAutoRunAtStartup { get; set; }
 
-        /// <summary>
-        /// Gets or sets the name of the server.
-        /// </summary>
-        /// <value>The name of the server.</value>
-        public string ServerName { get; set; }
-
         /// <summary>
         /// Initializes a new instance of the <see cref="SystemInfo" /> class.
         /// </summary>
@@ -170,4 +152,25 @@ namespace MediaBrowser.Model.System
             FailedPluginAssemblies = new List<string>();
         }
     }
+
+    public class PublicSystemInfo
+    {
+        /// <summary>
+        /// Gets or sets the name of the server.
+        /// </summary>
+        /// <value>The name of the server.</value>
+        public string ServerName { get; set; }
+
+        /// <summary>
+        /// Gets or sets the version.
+        /// </summary>
+        /// <value>The version.</value>
+        public string Version { get; set; }
+
+        /// <summary>
+        /// Gets or sets the id.
+        /// </summary>
+        /// <value>The id.</value>
+        public string Id { get; set; }
+    }
 }

+ 6 - 0
MediaBrowser.Model/Users/AuthenticationResult.cs

@@ -22,5 +22,11 @@ namespace MediaBrowser.Model.Users
         /// </summary>
         /// <value>The authentication token.</value>
         public string AccessToken { get; set; }
+
+        /// <summary>
+        /// Gets or sets the server identifier.
+        /// </summary>
+        /// <value>The server identifier.</value>
+        public string ServerId { get; set; }
     }
 }

+ 2 - 10
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -540,18 +540,10 @@ namespace MediaBrowser.Providers.Manager
                 Type = MetadataPluginType.LocalImageProvider
             }));
 
-            if (ConfigurationManager.Configuration.EnableInternetProviders)
-            {
-                // Fetchers
-                list.AddRange(imageProviders.Where(i => i is IRemoteImageProvider).Select(i => new MetadataPlugin
-                {
-                    Name = i.Name,
-                    Type = MetadataPluginType.ImageFetcher
-                }));
-            }
+            var enableInternet = ConfigurationManager.Configuration.EnableInternetProviders;
 
             // Fetchers
-            list.AddRange(imageProviders.Where(i => i is IDynamicImageProvider).Select(i => new MetadataPlugin
+            list.AddRange(imageProviders.Where(i => i is IDynamicImageProvider || (enableInternet && i is IRemoteImageProvider)).Select(i => new MetadataPlugin
             {
                 Name = i.Name,
                 Type = MetadataPluginType.ImageFetcher

+ 2 - 2
MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs

@@ -1,5 +1,4 @@
-using System.Linq;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Events;
 using MediaBrowser.Common.Implementations.Configuration;
 using MediaBrowser.Controller;
@@ -14,6 +13,7 @@ using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Serialization;
 using System;
 using System.IO;
+using System.Linq;
 
 namespace MediaBrowser.Server.Implementations.Configuration
 {

+ 19 - 6
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -66,22 +66,35 @@ namespace MediaBrowser.Server.Implementations.Dto
         /// <exception cref="System.ArgumentNullException">item</exception>
         public BaseItemDto GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null)
         {
+            var dto = GetBaseItemDtoInternal(item, fields, user, owner);
+
             var byName = item as IItemByName;
 
-            if (byName != null)
+            if (byName != null && !(item is LiveTvChannel))
             {
-                var libraryItems = user != null ?
-                    user.RootFolder.GetRecursiveChildren(user) :
-                    _libraryManager.RootFolder.RecursiveChildren;
+                IEnumerable<BaseItem> libraryItems;
+
+                var artist = item as MusicArtist;
 
-                var dto = GetBaseItemDtoInternal(item, fields, user);
+                if (artist == null || artist.IsAccessedByName)
+                {
+                    libraryItems = user != null ?
+                       user.RootFolder.GetRecursiveChildren(user) :
+                       _libraryManager.RootFolder.RecursiveChildren;
+                }
+                else
+                {
+                    libraryItems = user != null ?
+                       artist.GetRecursiveChildren(user) :
+                       artist.RecursiveChildren;
+                }
 
                 SetItemByNameInfo(item, dto, byName.GetTaggedItems(libraryItems).ToList(), user);
 
                 return dto;
             }
 
-            return GetBaseItemDtoInternal(item, fields, user, owner);
+            return dto;
         }
 
         private BaseItemDto GetBaseItemDtoInternal(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null)

+ 5 - 2
MediaBrowser.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Plugins;
@@ -35,6 +36,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         /// The _HTTP server
         /// </summary>
         private readonly IHttpServer _httpServer;
+        private readonly IServerApplicationHost _appHost;
 
         public const int PortNumber = 7359;
 
@@ -45,12 +47,13 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         /// <param name="networkManager">The network manager.</param>
         /// <param name="serverConfigurationManager">The server configuration manager.</param>
         /// <param name="httpServer">The HTTP server.</param>
-        public UdpServerEntryPoint(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer)
+        public UdpServerEntryPoint(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer, IServerApplicationHost appHost)
         {
             _logger = logger;
             _networkManager = networkManager;
             _serverConfigurationManager = serverConfigurationManager;
             _httpServer = httpServer;
+            _appHost = appHost;
         }
 
         /// <summary>
@@ -58,7 +61,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         /// </summary>
         public void Run()
         {
-            var udpServer = new UdpServer(_logger, _networkManager, _serverConfigurationManager, _httpServer);
+            var udpServer = new UdpServer(_logger, _networkManager, _serverConfigurationManager, _httpServer, _appHost);
 
             try
             {

+ 21 - 0
MediaBrowser.Server.Implementations/LiveTv/LiveTvConfigurationFactory.cs

@@ -0,0 +1,21 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Model.Configuration;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Server.Implementations.LiveTv
+{
+    public class LiveTvConfigurationFactory : IConfigurationFactory
+    {
+        public IEnumerable<ConfigurationStore> GetConfigurations()
+        {
+            return new List<ConfigurationStore>
+            {
+                new ConfigurationStore
+                {
+                     ConfigurationType = typeof(LiveTvOptions),
+                     Key = "livetv"
+                }
+            };
+        }
+    }
+}

+ 13 - 20
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Common.ScheduledTasks;
 using MediaBrowser.Controller.Configuration;
@@ -11,6 +12,7 @@ using MediaBrowser.Controller.Localization;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Sorting;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.LiveTv;
@@ -83,6 +85,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
         public ILiveTvService ActiveService { get; private set; }
 
+        private LiveTvOptions GetConfiguration()
+        {
+            return _config.GetConfiguration<LiveTvOptions>("livetv");
+        }
+
         /// <summary>
         /// Adds the parts.
         /// </summary>
@@ -91,7 +98,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
         {
             _services.AddRange(services);
 
-            SetActiveService(_config.Configuration.LiveTvOptions.ActiveService);
+            SetActiveService(GetConfiguration().ActiveService);
         }
 
         private void SetActiveService(string name)
@@ -303,22 +310,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
             try
             {
-                // Avoid implicitly captured closure
-                var itemId = id;
-
-                var stream = _openStreams
-                    .Where(i => string.Equals(i.Value.ItemId, itemId) && isChannel == i.Value.IsChannel)
-                    .Take(1)
-                    .Select(i => i.Value)
-                    .FirstOrDefault();
-
-                if (stream != null)
-                {
-                    stream.ConsumerCount++;
-                    _logger.Debug("Returning existing live tv stream");
-                    return stream.Info;
-                }
-
                 var service = ActiveService;
                 LiveStreamInfo info;
 
@@ -1010,9 +1001,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
         private double GetGuideDays(int channelCount)
         {
-            if (_config.Configuration.LiveTvOptions.GuideDays.HasValue)
+            var config = GetConfiguration();
+
+            if (config.GuideDays.HasValue)
             {
-                return _config.Configuration.LiveTvOptions.GuideDays.Value;
+                return config.GuideDays.Value;
             }
 
             var programsPerDay = channelCount * 48;

+ 11 - 1
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -699,6 +699,10 @@
     "HeaderProfileServerSettingsHelp": "These values control how Media Browser will present itself to the device.",
     "LabelMaxBitrate": "Max bitrate:",
     "LabelMaxBitrateHelp": "Specify a max bitrate in bandwidth constrained environments, or if the device imposes it's own limit.",
+    "LabelMaxStreamingBitrate":  "Max streaming bitrate:",
+    "LabelMaxStreamingBitrateHelp":  "Specify a max bitrate when streaming.",
+    "LabelMaxStaticBitrate":  "Max sync bitrate:",
+    "LabelMaxStaticBitrateHelp":  "Specify a max bitrate when syncing content at high quality.",
     "OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
     "OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
     "LabelFriendlyName": "Friendly name",
@@ -905,5 +909,11 @@
     "HeaderChapters": "Chapters",
     "HeaderResumeSettings": "Resume Settings",
     "TabSync": "Sync",
-    "TitleUsers": "Users"
+    "TitleUsers": "Users",
+    "LabelProtocol": "Protocol:",
+    "OptionProtocolHttp": "Http",
+    "OptionProtocolHls": "Http Live Streaming",
+    "LabelContext": "Context:",
+    "OptionContextStreaming": "Streaming",
+    "OptionContextStatic": "Sync"
 }

+ 1 - 0
MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj

@@ -198,6 +198,7 @@
     <Compile Include="Library\Validators\YearsPostScanTask.cs" />
     <Compile Include="LiveTv\ChannelImageProvider.cs" />
     <Compile Include="LiveTv\CleanDatabaseScheduledTask.cs" />
+    <Compile Include="LiveTv\LiveTvConfigurationFactory.cs" />
     <Compile Include="LiveTv\LiveTvDtoService.cs" />
     <Compile Include="LiveTv\LiveTvManager.cs" />
     <Compile Include="LiveTv\ProgramImageProvider.cs" />

+ 24 - 0
MediaBrowser.Server.Implementations/Security/EncryptionManager.cs

@@ -17,6 +17,10 @@ namespace MediaBrowser.Server.Implementations.Security
         {
             if (value == null) throw new ArgumentNullException("value");
 
+#if __MonoCS__
+            return EncryptStringUniversal(value);
+#endif
+
             return Encoding.Default.GetString(ProtectedData.Protect(Encoding.Default.GetBytes(value), null, DataProtectionScope.LocalMachine));
         }
 
@@ -30,7 +34,27 @@ namespace MediaBrowser.Server.Implementations.Security
         {
             if (value == null) throw new ArgumentNullException("value");
 
+#if __MonoCS__
+            return DecryptStringUniversal(value);
+#endif
+
             return Encoding.Default.GetString(ProtectedData.Unprotect(Encoding.Default.GetBytes(value), null, DataProtectionScope.LocalMachine));
         }
+
+        private string EncryptStringUniversal(string value)
+        {
+            // Yes, this isn't good, but ProtectedData in mono is throwing exceptions, so use this for now
+
+            var bytes = Encoding.UTF8.GetBytes(value);
+            return Convert.ToBase64String(bytes);
+        }
+
+        private string DecryptStringUniversal(string value)
+        {
+            // Yes, this isn't good, but ProtectedData in mono is throwing exceptions, so use this for now
+
+            var bytes = Convert.FromBase64String(value);
+            return Encoding.UTF8.GetString(bytes);
+        }
     }
 }

+ 2 - 1
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -1236,7 +1236,8 @@ namespace MediaBrowser.Server.Implementations.Session
             {
                 User = _dtoService.GetUserDto(user),
                 SessionInfo = GetSessionInfoDto(session),
-                AccessToken = token
+                AccessToken = token,
+                ServerId = _appHost.ServerId
             };
         }
 

+ 2 - 1
MediaBrowser.Server.Implementations/Sync/SyncManager.cs

@@ -68,7 +68,8 @@ namespace MediaBrowser.Server.Implementations.Sync
                 LimitType = request.LimitType,
                 RequestedItemIds = request.ItemIds,
                 DateCreated = DateTime.UtcNow,
-                DateLastModified = DateTime.UtcNow
+                DateLastModified = DateTime.UtcNow,
+                ItemCount = 1
             };
 
             await _repo.Create(job).ConfigureAwait(false);

+ 60 - 16
MediaBrowser.Server.Implementations/Udp/UdpServer.cs

@@ -1,8 +1,12 @@
 using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.ApiClient;
 using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Net.Sockets;
@@ -37,6 +41,11 @@ namespace MediaBrowser.Server.Implementations.Udp
 
         private bool _isDisposed;
 
+        private readonly List<Tuple<byte[], Action<string>>> _responders = new List<Tuple<byte[], Action<string>>>();
+
+        private readonly IServerApplicationHost _appHost;
+        private readonly IJsonSerializer _json;
+
         /// <summary>
         /// Initializes a new instance of the <see cref="UdpServer" /> class.
         /// </summary>
@@ -44,12 +53,24 @@ namespace MediaBrowser.Server.Implementations.Udp
         /// <param name="networkManager">The network manager.</param>
         /// <param name="serverConfigurationManager">The server configuration manager.</param>
         /// <param name="httpServer">The HTTP server.</param>
-        public UdpServer(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer)
+        /// <param name="appHost">The application host.</param>
+        public UdpServer(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer, IServerApplicationHost appHost)
         {
             _logger = logger;
             _networkManager = networkManager;
             _serverConfigurationManager = serverConfigurationManager;
             _httpServer = httpServer;
+            _appHost = appHost;
+
+            AddMessageResponder("who is MediaBrowserServer?", RespondToV1Message);
+            AddMessageResponder("who is MediaBrowserServer_v2?", RespondToV2Message);
+        }
+
+        private void AddMessageResponder(string message, Action<string> responder)
+        {
+            var expectedMessageBytes = Encoding.UTF8.GetBytes(message);
+
+            _responders.Add(new Tuple<byte[], Action<string>>(expectedMessageBytes, responder));
         }
 
         /// <summary>
@@ -58,28 +79,51 @@ namespace MediaBrowser.Server.Implementations.Udp
         /// <param name="e">The <see cref="UdpMessageReceivedEventArgs"/> instance containing the event data.</param>
         private async void OnMessageReceived(UdpMessageReceivedEventArgs e)
         {
-            const string context = "Server";
+            var responder = _responders.FirstOrDefault(i => i.Item1.SequenceEqual(e.Bytes));
 
-            var expectedMessage = String.Format("who is MediaBrowser{0}?", context);
-            var expectedMessageBytes = Encoding.UTF8.GetBytes(expectedMessage);
+            if (responder != null)
+            {
+                responder.Item2(e.RemoteEndPoint);
+            }
+        }
 
-            if (expectedMessageBytes.SequenceEqual(e.Bytes))
+        private async void RespondToV1Message(string endpoint)
+        {
+            var localAddress = GetLocalIpAddress();
+
+            if (!string.IsNullOrEmpty(localAddress))
             {
-                _logger.Info("Received UDP server request from " + e.RemoteEndPoint);
+                // Send a response back with our ip address and port
+                var response = String.Format("MediaBrowserServer|{0}:{1}", localAddress, _serverConfigurationManager.Configuration.HttpServerPortNumber);
 
-                var localAddress = GetLocalIpAddress();
+                await SendAsync(Encoding.UTF8.GetBytes(response), endpoint);
+            }
+            else
+            {
+                _logger.Warn("Unable to respond to udp request because the local ip address could not be determined.");
+            }
+        }
 
-                if (!string.IsNullOrEmpty(localAddress))
-                {
-                    // Send a response back with our ip address and port
-                    var response = String.Format("MediaBrowser{0}|{1}:{2}", context, GetLocalIpAddress(), _serverConfigurationManager.Configuration.HttpServerPortNumber);
+        private async void RespondToV2Message(string endpoint)
+        {
+            var localAddress = GetLocalIpAddress();
 
-                    await SendAsync(Encoding.UTF8.GetBytes(response), e.RemoteEndPoint);
-                }
-                else
+            if (!string.IsNullOrEmpty(localAddress))
+            {
+                var serverAddress = string.Format("http://{0}:{1}", localAddress, _serverConfigurationManager.Configuration.HttpServerPortNumber);
+
+                var response = new ServerDiscoveryInfo
                 {
-                    _logger.Warn("Unable to respond to udp request because the local ip address could not be determined.");
-                }
+                    Address = serverAddress,
+                    Id = _appHost.ServerId,
+                    Name = _appHost.Name
+                };
+
+                await SendAsync(Encoding.UTF8.GetBytes(_json.SerializeToString(response)), endpoint);
+            }
+            else
+            {
+                _logger.Warn("Unable to respond to udp request because the local ip address could not be determined.");
             }
         }
 

+ 13 - 1
MediaBrowser.ServerApplication/ApplicationHost.cs

@@ -326,6 +326,13 @@ namespace MediaBrowser.ServerApplication
                 saveConfig = true;
             }
 
+            if (ServerConfigurationManager.Configuration.LiveTvOptions != null)
+            {
+                ServerConfigurationManager.SaveConfiguration("livetv", ServerConfigurationManager.Configuration.LiveTvOptions);
+                ServerConfigurationManager.Configuration.LiveTvOptions = null;
+                saveConfig = true;
+            }
+
             if (saveConfig)
             {
                 ServerConfigurationManager.SaveConfiguration();
@@ -1001,6 +1008,11 @@ namespace MediaBrowser.ServerApplication
 
         private readonly string _systemId = Environment.MachineName.GetMD5().ToString();
 
+        public string ServerId
+        {
+            get { return _systemId; }
+        }
+
         /// <summary>
         /// Gets the system status.
         /// </summary>
@@ -1017,7 +1029,7 @@ namespace MediaBrowser.ServerApplication
                 FailedPluginAssemblies = FailedAssemblies.ToList(),
                 InProgressInstallations = InstallationManager.CurrentInstallations.Select(i => i.Item1).ToList(),
                 CompletedInstallations = InstallationManager.CompletedInstallations.ToList(),
-                Id = _systemId,
+                Id = ServerId,
                 ProgramDataPath = ApplicationPaths.ProgramDataPath,
                 LogPath = ApplicationPaths.LogDirectoryPath,
                 ItemsByNamePath = ApplicationPaths.ItemsByNamePath,

+ 0 - 3
MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj

@@ -185,9 +185,6 @@
     <Content Include="dashboard-ui\css\images\items\folders\settings.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="dashboard-ui\css\images\menu.png">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
     <Content Include="dashboard-ui\css\images\icons\audiocd.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>

+ 3 - 3
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.418</version>
+        <version>3.0.421</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,8 +12,8 @@
         <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.418" />
-            <dependency id="NLog" version="2.1.0" />
+            <dependency id="MediaBrowser.Common" version="3.0.421" />
+            <dependency id="NLog" version="3.1.0.0" />
             <dependency id="SimpleInjector" version="2.5.2" />
             <dependency id="sharpcompress" version="0.10.2" />
         </dependencies>

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.418</version>
+        <version>3.0.421</version>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser 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.418</version>
+        <version>3.0.421</version>
         <title>MediaBrowser.Model - Signed Edition</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
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.418</version>
+        <version>3.0.421</version>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.418" />
+            <dependency id="MediaBrowser.Common" version="3.0.421" />
         </dependencies>
     </metadata>
     <files>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно