This commit is contained in:
Luke Pulverenti 2014-03-13 05:02:58 -04:00
commit 219e0ef19b
12 changed files with 126 additions and 17 deletions

View file

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

View file

@ -53,7 +53,7 @@
</Compile> </Compile>
<Compile Include="PlayTo\Argument.cs" /> <Compile Include="PlayTo\Argument.cs" />
<Compile Include="PlayTo\Configuration\DlnaProfile.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\Configuration\TranscodeSetting.cs" />
<Compile Include="PlayTo\CurrentIdEventArgs.cs" /> <Compile Include="PlayTo\CurrentIdEventArgs.cs" />
<Compile Include="PlayTo\Device.cs"> <Compile Include="PlayTo\Device.cs">

View file

@ -29,7 +29,12 @@
FriendlyName = "^TV$", FriendlyName = "^TV$",
ModelNumber = @"1\.0", ModelNumber = @"1\.0",
ModelName = "Samsung DTV DMR", 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 var profile1 = new DlnaProfile
@ -38,7 +43,12 @@
ClientType = "DLNA", ClientType = "DLNA",
FriendlyName = @"(^\[TV\][A-Z]{2}\d{2}(E|F)[A-Z]?\d{3,4}.*)|^\[TV\] Samsung", FriendlyName = @"(^\[TV\][A-Z]{2}\d{2}(E|F)[A-Z]?\d{3,4}.*)|^\[TV\] Samsung",
ModelNumber = @"(1\.0)|(AllShare1\.0)", 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 var profile2 = new DlnaProfile
@ -47,7 +57,12 @@
ClientType = "DLNA", ClientType = "DLNA",
FriendlyName = @"(^TV-\d{2}C\d{3}.*)|(^\[TV\][A-Z]{2}\d{2}(D)[A-Z]?\d{3,4}.*)|^\[TV\] Samsung", 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)", 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 var profile3 = new DlnaProfile

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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