2
0
Эх сурвалжийг харах

Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser

Luke Pulverenti 11 жил өмнө
parent
commit
219e0ef19b

+ 45 - 2
MediaBrowser.Api/SessionsService.cs

@@ -46,6 +46,14 @@ namespace MediaBrowser.Api
         [ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
         public Guid Id { get; set; }
 
+        /// <summary>
+        /// Gets or sets the UserId.
+        /// </summary>
+        /// <value>The id.</value>
+        [ApiMember(Name = "UserId", Description = "The controlling User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "POST")]
+        public Guid UserId { get; set; }
+        //TODO IsRequired = false shall be changed to true once the clients has been updated and the new ApiClient is in use
+
         /// <summary>
         /// Artist, Genre, Studio, Person, or any kind of BaseItem
         /// </summary>
@@ -88,6 +96,14 @@ namespace MediaBrowser.Api
         [ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
         public Guid Id { get; set; }
 
+        /// <summary>
+        /// Gets or sets the UserId.
+        /// </summary>
+        /// <value>The id.</value>
+        [ApiMember(Name = "UserId", Description = "The controlling User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "POST")]
+        public Guid UserId { get; set; }
+        //TODO IsRequired = false shall be changed to true once the clients has been updated and the new ApiClient is in use
+
         /// <summary>
         /// Artist, Genre, Studio, Person, or any kind of BaseItem
         /// </summary>
@@ -121,6 +137,14 @@ namespace MediaBrowser.Api
         [ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
         public Guid Id { get; set; }
 
+        /// <summary>
+        /// Gets or sets the UserId.
+        /// </summary>
+        /// <value>The id.</value>
+        [ApiMember(Name = "UserId", Description = "The controlling User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "POST")]
+        public Guid UserId { get; set; }
+        //TODO IsRequired = false shall be changed to true once the clients has been updated and the new ApiClient is in use
+
         /// <summary>
         /// Gets or sets the position to seek to
         /// </summary>
@@ -146,6 +170,14 @@ namespace MediaBrowser.Api
         [ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
         public Guid Id { get; set; }
 
+        /// <summary>
+        /// Gets or sets the UserId.
+        /// </summary>
+        /// <value>The id.</value>
+        [ApiMember(Name = "UserId", Description = "The controlling User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "POST")]
+        public Guid UserId { get; set; }
+        //TODO IsRequired = false shall be changed to true once the clients has been updated and the new ApiClient is in use
+
         /// <summary>
         /// Gets or sets the command.
         /// </summary>
@@ -165,6 +197,14 @@ namespace MediaBrowser.Api
         [ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
         public Guid Id { get; set; }
 
+        /// <summary>
+        /// Gets or sets the UserId.
+        /// </summary>
+        /// <value>The id.</value>
+        [ApiMember(Name = "UserId", Description = "The controlling User Id", IsRequired = false, DataType = "string", ParameterType = "path", Verb = "POST")]
+        public Guid UserId { get; set; }
+        //TODO IsRequired = false shall be changed to true once the clients has been updated and the new ApiClient is in use
+
         [ApiMember(Name = "Text", Description = "The message text.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
         public string Text { get; set; }
 
@@ -270,9 +310,10 @@ namespace MediaBrowser.Api
         }
 
         public void Post(SendPlaystateCommand request)
-        {
+        {            
             var command = new PlaystateRequest
             {
+                UserId = request.UserId,
                 Command = request.Command,
                 SeekPositionTicks = request.SeekPositionTicks
             };
@@ -290,6 +331,7 @@ namespace MediaBrowser.Api
         {
             var command = new BrowseRequest
             {
+                UserId = request.UserId,
                 Context = request.Context,
                 ItemId = request.ItemId,
                 ItemName = request.ItemName,
@@ -321,6 +363,7 @@ namespace MediaBrowser.Api
             var command = new MessageCommand
             {
                 Header = string.IsNullOrEmpty(request.Header) ? "Message from Server" : request.Header,
+                UserId = request.UserId,
                 TimeoutMs = request.TimeoutMs,
                 Text = request.Text
             };
@@ -339,7 +382,7 @@ namespace MediaBrowser.Api
             var command = new PlayRequest
             {
                 ItemIds = request.ItemIds.Split(',').ToArray(),
-
+                UserId = request.UserId,
                 PlayCommand = request.PlayCommand,
                 StartPositionTicks = request.StartPositionTicks
             };

+ 1 - 1
MediaBrowser.Dlna/MediaBrowser.Dlna.csproj

@@ -53,7 +53,7 @@
     </Compile>
     <Compile Include="PlayTo\Argument.cs" />
     <Compile Include="PlayTo\Configuration\DlnaProfile.cs" />
-    <Compile Include="PlayTo\Configuration\PluginConfiguration.cs" />
+    <Compile Include="PlayTo\Configuration\PlayToConfiguration.cs" />
     <Compile Include="PlayTo\Configuration\TranscodeSetting.cs" />
     <Compile Include="PlayTo\CurrentIdEventArgs.cs" />
     <Compile Include="PlayTo\Device.cs">

+ 18 - 3
MediaBrowser.Dlna/PlayTo/Configuration/PluginConfiguration.cs → MediaBrowser.Dlna/PlayTo/Configuration/PlayToConfiguration.cs

@@ -29,7 +29,12 @@
                 FriendlyName = "^TV$",
                 ModelNumber = @"1\.0",
                 ModelName = "Samsung DTV DMR",
-                TranscodeSettings = TranscodeSettings.GetDefaultTranscodingSettings()
+                TranscodeSettings = new[]
+                {
+                    new TranscodeSettings {Container = "mkv", MimeType = "x-mkv"},
+                    new TranscodeSettings {Container = "flac", TargetContainer = "mp3"},
+                    new TranscodeSettings {Container = "m4a", TargetContainer = "mp3"}
+                }
             };
 
             var profile1 = new DlnaProfile
@@ -38,7 +43,12 @@
                 ClientType = "DLNA",
                 FriendlyName = @"(^\[TV\][A-Z]{2}\d{2}(E|F)[A-Z]?\d{3,4}.*)|^\[TV\] Samsung",
                 ModelNumber = @"(1\.0)|(AllShare1\.0)",
-                TranscodeSettings = TranscodeSettings.GetDefaultTranscodingSettings()
+                TranscodeSettings = new[]
+                {
+                    new TranscodeSettings {Container = "mkv", MimeType = "x-mkv"},
+                    new TranscodeSettings {Container = "flac", TargetContainer = "mp3"},
+                    new TranscodeSettings {Container = "m4a", TargetContainer = "mp3"}
+                }
             };
 
             var profile2 = new DlnaProfile
@@ -47,7 +57,12 @@
                 ClientType = "DLNA",
                 FriendlyName = @"(^TV-\d{2}C\d{3}.*)|(^\[TV\][A-Z]{2}\d{2}(D)[A-Z]?\d{3,4}.*)|^\[TV\] Samsung",
                 ModelNumber = @"(1\.0)|(AllShare1\.0)",
-                TranscodeSettings = TranscodeSettings.GetDefaultTranscodingSettings()
+                TranscodeSettings = new[]
+                {
+                    new TranscodeSettings {Container = "mkv", MimeType = "x-mkv"},
+                    new TranscodeSettings {Container = "flac", TargetContainer = "mp3"},
+                    new TranscodeSettings {Container = "m4a", TargetContainer = "mp3"}
+                }
             };
 
             var profile3 = new DlnaProfile

+ 7 - 1
MediaBrowser.Dlna/PlayTo/Configuration/TranscodeSetting.cs

@@ -20,7 +20,13 @@ namespace MediaBrowser.Dlna.PlayTo.Configuration
         /// The target container.
         /// </value>
         public string TargetContainer { get; set; }
-      
+
+        /// <summary>
+        /// Gets or sets the Mimetype to enforce
+        /// </summary>
+        /// <value>
+        /// The MimeType.
+        /// </value>
         public string MimeType { get; set; }
 
         /// <summary>

+ 14 - 1
MediaBrowser.Dlna/PlayTo/PlaylistItem.cs

@@ -16,6 +16,8 @@ namespace MediaBrowser.Dlna.PlayTo
 
         public string FileFormat { get; set; }
 
+        public string MimeType { get; set; }
+
         public int PlayState { get; set; }
 
         public string StreamUrl { get; set; }
@@ -51,10 +53,21 @@ namespace MediaBrowser.Dlna.PlayTo
                 {
                     if (string.IsNullOrWhiteSpace(transcodeSetting.Container))
                         continue;
-                    if (path.EndsWith(transcodeSetting.Container))
+                    if (path.EndsWith(transcodeSetting.Container) && !string.IsNullOrWhiteSpace(transcodeSetting.TargetContainer))
                     {
                         playlistItem.Transcode = true;
                         playlistItem.FileFormat = transcodeSetting.TargetContainer;
+                        
+                        if (string.IsNullOrWhiteSpace(transcodeSetting.MimeType))
+                            playlistItem.MimeType = transcodeSetting.MimeType;
+                        
+                        return playlistItem;
+                    }
+                    if (path.EndsWith(transcodeSetting.Container) && !string.IsNullOrWhiteSpace(transcodeSetting.MimeType))
+                    {
+                        playlistItem.Transcode = false;
+                        playlistItem.FileFormat = transcodeSetting.Container;
+                        playlistItem.MimeType = transcodeSetting.MimeType;
                         return playlistItem;
                     }
                 }

+ 9 - 5
MediaBrowser.Dlna/PlayTo/StreamHelper.cs

@@ -96,9 +96,12 @@ namespace MediaBrowser.Dlna.PlayTo
         /// <returns>The url to send to the device</returns>
         internal static string GetVideoUrl(DeviceProperties deviceProperties, PlaylistItem item, List<MediaStream> streams, string serverAddress)
         {
+            string dlnaCommand = string.Empty;
             if (!item.Transcode)
-                return string.Format("{0}/Videos/{1}/stream.{2}?Static=True", serverAddress, item.ItemId, item.FileFormat);
-
+            {
+                dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, null, null, null, null, null, null, null, null, null, null, item.MimeType);
+                return string.Format("{0}/Videos/{1}/stream.{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand);                
+            }
             var videostream = streams.Where(m => m.Type == MediaStreamType.Video).OrderBy(m => m.IsDefault).FirstOrDefault();
             var audiostream = streams.Where(m => m.Type == MediaStreamType.Audio).OrderBy(m => m.IsDefault).FirstOrDefault();
 
@@ -117,7 +120,7 @@ namespace MediaBrowser.Dlna.PlayTo
                 audioChannels = 2;
             }
 
-            string dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3");
+            dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3", item.MimeType);
             return string.Format("{0}/Videos/{1}/stream.{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand);
         }
 
@@ -162,12 +165,12 @@ namespace MediaBrowser.Dlna.PlayTo
         /// <summary>
         /// Builds the dlna URL.
         /// </summary>
-        private static string BuildDlnaUrl(string deviceID, VideoCodecs? videoCodec, AudioCodecs? audioCodec, int? subtitleIndex, int? audiostreamIndex, int? videoBitrate, int? audiochannels, int? audioBitrate, long? startPositionTicks, string profile, string videoLevel)
+        private static string BuildDlnaUrl(string deviceID, bool isStatic, VideoCodecs? videoCodec, AudioCodecs? audioCodec, int? subtitleIndex, int? audiostreamIndex, int? videoBitrate, int? audiochannels, int? audioBitrate, long? startPositionTicks, string profile, string videoLevel, string mimeType)
         {
             var usCulture = new CultureInfo("en-US");
 
             var dlnaparam = string.Format("Params={0};", deviceID);
-
+            dlnaparam += isStatic ? "true;" : "false;";
             dlnaparam += videoCodec.HasValue ? videoCodec.Value + ";" : ";";
             dlnaparam += audioCodec.HasValue ? audioCodec.Value + ";" : ";";
             dlnaparam += audiostreamIndex.HasValue ? audiostreamIndex.Value.ToString(usCulture) + ";" : ";";
@@ -178,6 +181,7 @@ namespace MediaBrowser.Dlna.PlayTo
             dlnaparam += startPositionTicks.HasValue ? startPositionTicks.Value.ToString(usCulture) + ";" : ";";
             dlnaparam += profile + ";";
             dlnaparam += videoLevel + ";";
+            dlnaparam += mimeType + ";";
 
             return dlnaparam;
         }

+ 6 - 1
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -11,12 +11,17 @@
     <RootNamespace>MediaBrowser.Model</RootNamespace>
     <AssemblyName>MediaBrowser.Model</AssemblyName>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <TargetFrameworkProfile>Profile104</TargetFrameworkProfile>
+    <TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
     <FileAlignment>512</FileAlignment>
     <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
     <RestorePackages>true</RestorePackages>
     <FodyPath>..\packages\Fody.1.19.1.0</FodyPath>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>4.0</OldToolsVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>

+ 3 - 2
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -572,17 +572,18 @@ namespace MediaBrowser.Model.ApiClient
         /// Instructs antoher client to browse to a library item.
         /// </summary>
         /// <param name="sessionId">The session id.</param>
+        /// <param name="userId">The controlling user id.</param>
         /// <param name="itemId">The id of the item to browse to.</param>
         /// <param name="itemName">The name of the item to browse to.</param>
         /// <param name="itemType">The type of the item to browse to.</param>
         /// <param name="context">Optional ui context (movies, music, tv, games, etc). The client is free to ignore this.</param>
         /// <returns>Task.</returns>
-        Task SendBrowseCommandAsync(string sessionId, string itemId, string itemName, string itemType, string context);
+        Task SendBrowseCommandAsync(string sessionId, string userId, string itemId, string itemName, string itemType, string context);
 
         /// <summary>
         /// Sends the playstate command async.
         /// </summary>
-        /// <param name="sessionId">The session id.</param>
+        /// <param name="sessionId">The session id.</param>        
         /// <param name="request">The request.</param>
         /// <returns>Task.</returns>
         Task SendPlaystateCommandAsync(string sessionId, PlaystateRequest request);

+ 4 - 0
MediaBrowser.Model/Session/BrowseRequest.cs

@@ -1,4 +1,6 @@
 
+using System;
+
 namespace MediaBrowser.Model.Session
 {
     /// <summary>
@@ -12,6 +14,8 @@ namespace MediaBrowser.Model.Session
         /// <value>The type of the item.</value>
         public string ItemType { get; set; }
 
+        public Guid UserId { get; set; }
+
         /// <summary>
         /// Gets or sets the item id.
         /// </summary>

+ 4 - 1
MediaBrowser.Model/Session/MessageCommand.cs

@@ -1,8 +1,11 @@
 
+using System;
 namespace MediaBrowser.Model.Session
 {
     public class MessageCommand
-    {
+    {       
+        public Guid UserId { get; set; }
+
         public string Header { get; set; }
         
         public string Text { get; set; }

+ 12 - 0
MediaBrowser.Model/Session/PlayRequest.cs

@@ -1,4 +1,5 @@
 
+using System;
 namespace MediaBrowser.Model.Session
 {
     /// <summary>
@@ -6,6 +7,11 @@ namespace MediaBrowser.Model.Session
     /// </summary>
     public class PlayRequest
     {
+        public PlayRequest()
+        {
+
+        }
+
         /// <summary>
         /// Gets or sets the item ids.
         /// </summary>
@@ -23,6 +29,12 @@ namespace MediaBrowser.Model.Session
         /// </summary>
         /// <value>The play command.</value>
         public PlayCommand PlayCommand { get; set; }
+
+        /// <summary>
+        /// Gets or sets the play command.
+        /// </summary>
+        /// <value>The play command.</value>
+        public Guid UserId { get; set; }
     }
 
     /// <summary>

+ 3 - 0
MediaBrowser.Model/Session/PlaystateCommand.cs

@@ -1,4 +1,5 @@
 
+using System;
 namespace MediaBrowser.Model.Session
 {
     /// <summary>
@@ -34,6 +35,8 @@ namespace MediaBrowser.Model.Session
 
     public class PlaystateRequest
     {
+        public Guid UserId { get; set; }
+
         public PlaystateCommand Command { get; set; }
 
         public long? SeekPositionTicks { get; set; }