aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Dlna
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-04-19 13:43:12 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-04-19 13:43:12 -0400
commit13509c1d8d877b5a033d0bb45d347ba8564e8102 (patch)
tree914ea876395390c1f95de0c2351daa5b9b44127c /MediaBrowser.Dlna
parent5170042eb5efee7be005dcc5aca863b66c23a6f2 (diff)
dlna fixes
Diffstat (limited to 'MediaBrowser.Dlna')
-rw-r--r--MediaBrowser.Dlna/PlayTo/Device.cs38
-rw-r--r--MediaBrowser.Dlna/PlayTo/DlnaController.cs4
-rw-r--r--MediaBrowser.Dlna/PlayTo/TransportStateEventArgs.cs2
-rw-r--r--MediaBrowser.Dlna/Server/ControlHandler.cs17
-rw-r--r--MediaBrowser.Dlna/Server/ServiceActionListBuilder.cs171
-rw-r--r--MediaBrowser.Dlna/Server/SsdpHandler.cs4
6 files changed, 210 insertions, 26 deletions
diff --git a/MediaBrowser.Dlna/PlayTo/Device.cs b/MediaBrowser.Dlna/PlayTo/Device.cs
index fc62f9780..9a0934a79 100644
--- a/MediaBrowser.Dlna/PlayTo/Device.cs
+++ b/MediaBrowser.Dlna/PlayTo/Device.cs
@@ -66,8 +66,8 @@ namespace MediaBrowser.Dlna.PlayTo
}
}
- private string _transportState = String.Empty;
- public string TransportState
+ private TRANSPORTSTATE _transportState = TRANSPORTSTATE.STOPPED;
+ public TRANSPORTSTATE TransportState
{
get
{
@@ -80,8 +80,7 @@ namespace MediaBrowser.Dlna.PlayTo
_transportState = value;
- if (value == TRANSPORTSTATE.PLAYING || value == TRANSPORTSTATE.STOPPED)
- NotifyPlaybackChanged(value == TRANSPORTSTATE.STOPPED);
+ NotifyPlaybackChanged(value);
}
}
@@ -374,7 +373,7 @@ namespace MediaBrowser.Dlna.PlayTo
.ConfigureAwait(false);
await Task.Delay(50).ConfigureAwait(false);
- TransportState = "PAUSED_PLAYBACK";
+ TransportState = TRANSPORTSTATE.PAUSED_PLAYBACK;
return true;
}
@@ -492,7 +491,14 @@ namespace MediaBrowser.Dlna.PlayTo
var transportStateValue = transportState == null ? null : transportState.Value;
if (transportStateValue != null)
- TransportState = transportStateValue;
+ {
+ TRANSPORTSTATE state;
+
+ if (Enum.TryParse(transportStateValue, true, out state))
+ {
+ TransportState = state;
+ }
+ }
UpdateTime = DateTime.UtcNow;
}
@@ -857,13 +863,13 @@ namespace MediaBrowser.Dlna.PlayTo
public event EventHandler<TransportStateEventArgs> PlaybackChanged;
public event EventHandler<CurrentIdEventArgs> CurrentIdChanged;
- private void NotifyPlaybackChanged(bool value)
+ private void NotifyPlaybackChanged(TRANSPORTSTATE state)
{
if (PlaybackChanged != null)
{
PlaybackChanged.Invoke(this, new TransportStateEventArgs
{
- Stopped = IsStopped
+ State = state
});
}
}
@@ -895,14 +901,14 @@ namespace MediaBrowser.Dlna.PlayTo
return String.Format("{0} - {1}", Properties.Name, Properties.BaseUrl);
}
- private class TRANSPORTSTATE
- {
- public const string STOPPED = "STOPPED";
- public const string PLAYING = "PLAYING";
- public const string TRANSITIONING = "TRANSITIONING";
- public const string PAUSED_PLAYBACK = "PAUSED_PLAYBACK";
- public const string PAUSED = "PAUSED";
- }
+ }
+ public enum TRANSPORTSTATE
+ {
+ STOPPED,
+ PLAYING,
+ TRANSITIONING,
+ PAUSED_PLAYBACK,
+ PAUSED
}
}
diff --git a/MediaBrowser.Dlna/PlayTo/DlnaController.cs b/MediaBrowser.Dlna/PlayTo/DlnaController.cs
index 183a20447..09aeeab67 100644
--- a/MediaBrowser.Dlna/PlayTo/DlnaController.cs
+++ b/MediaBrowser.Dlna/PlayTo/DlnaController.cs
@@ -88,10 +88,10 @@ namespace MediaBrowser.Dlna.PlayTo
if (_currentItem == null)
return;
- if (e.Stopped == false)
+ if (e.State == TRANSPORTSTATE.STOPPED)
await ReportProgress().ConfigureAwait(false);
- else if (e.Stopped && _playbackStarted)
+ else if (e.State == TRANSPORTSTATE.STOPPED && _playbackStarted)
{
_playbackStarted = false;
diff --git a/MediaBrowser.Dlna/PlayTo/TransportStateEventArgs.cs b/MediaBrowser.Dlna/PlayTo/TransportStateEventArgs.cs
index 98844e3a6..3e9aad8ae 100644
--- a/MediaBrowser.Dlna/PlayTo/TransportStateEventArgs.cs
+++ b/MediaBrowser.Dlna/PlayTo/TransportStateEventArgs.cs
@@ -4,6 +4,6 @@ namespace MediaBrowser.Dlna.PlayTo
{
public class TransportStateEventArgs : EventArgs
{
- public bool Stopped { get; set; }
+ public TRANSPORTSTATE State { get; set; }
}
}
diff --git a/MediaBrowser.Dlna/Server/ControlHandler.cs b/MediaBrowser.Dlna/Server/ControlHandler.cs
index ba325a66b..e49bf3b40 100644
--- a/MediaBrowser.Dlna/Server/ControlHandler.cs
+++ b/MediaBrowser.Dlna/Server/ControlHandler.cs
@@ -185,7 +185,7 @@ namespace MediaBrowser.Dlna.Server
{
var id = sparams["ObjectID"];
- var item = _libraryManager.GetItemById(new Guid(id));
+ var item = GetItemFromObjectId(id, user);
var newbookmark = int.Parse(sparams["PosSecond"], _usCulture);
@@ -265,9 +265,7 @@ namespace MediaBrowser.Dlna.Server
didl.SetAttribute("xmlns:sec", NS_SEC);
result.AppendChild(didl);
- var folder = string.IsNullOrWhiteSpace(id) || string.Equals(id, "0", StringComparison.OrdinalIgnoreCase)
- ? user.RootFolder
- : (Folder)_libraryManager.GetItemById(new Guid(id));
+ var folder = (Folder)GetItemFromObjectId(id, user);
var children = GetChildrenSorted(folder, user).ToList();
@@ -328,6 +326,17 @@ namespace MediaBrowser.Dlna.Server
return _libraryManager.Sort(children, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending);
}
+ private BaseItem GetItemFromObjectId(string id, User user)
+ {
+ return string.IsNullOrWhiteSpace(id) || string.Equals(id, "0", StringComparison.OrdinalIgnoreCase)
+
+ // Samsung sometimes uses 1 as root
+ || string.Equals(id, "1", StringComparison.OrdinalIgnoreCase)
+
+ ? user.RootFolder
+ : _libraryManager.GetItemById(new Guid(id));
+ }
+
private void Browse_AddFolder(XmlDocument result, Folder f, int childCount)
{
var container = result.CreateElement(string.Empty, "container", NS_DIDL);
diff --git a/MediaBrowser.Dlna/Server/ServiceActionListBuilder.cs b/MediaBrowser.Dlna/Server/ServiceActionListBuilder.cs
index 90685cc7d..71f841b04 100644
--- a/MediaBrowser.Dlna/Server/ServiceActionListBuilder.cs
+++ b/MediaBrowser.Dlna/Server/ServiceActionListBuilder.cs
@@ -12,9 +12,11 @@ namespace MediaBrowser.Dlna.Server
GetGetSystemUpdateIDAction(),
GetSearchCapabilitiesAction(),
GetSortCapabilitiesAction(),
+ GetSearchAction(),
GetBrowseAction(),
GetX_GetFeatureListAction(),
- GetXSetBookmarkAction()
+ GetXSetBookmarkAction(),
+ GetBrowseByLetterAction()
};
return list;
@@ -88,6 +90,86 @@ namespace MediaBrowser.Dlna.Server
return action;
}
+ private ServiceAction GetSearchAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "Search"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ContainerID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ObjectID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SearchCriteria",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_SearchCriteria"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Filter",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Filter"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "StartingIndex",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Index"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RequestedCount",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SortCriteria",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_SortCriteria"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Result",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Result"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "NumberReturned",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "TotalMatches",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "UpdateID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_UpdateID"
+ });
+
+ return action;
+ }
+
private ServiceAction GetBrowseAction()
{
var action = new ServiceAction
@@ -168,6 +250,93 @@ namespace MediaBrowser.Dlna.Server
return action;
}
+ private ServiceAction GetBrowseByLetterAction()
+ {
+ var action = new ServiceAction
+ {
+ Name = "X_BrowseByLetter"
+ };
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "ObjectID",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_ObjectID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "BrowseFlag",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_BrowseFlag"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Filter",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Filter"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "StartingLetter",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_BrowseLetter"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "RequestedCount",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "SortCriteria",
+ Direction = "in",
+ RelatedStateVariable = "A_ARG_TYPE_SortCriteria"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "Result",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Result"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "NumberReturned",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "TotalMatches",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Count"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "UpdateID",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_UpdateID"
+ });
+
+ action.ArgumentList.Add(new Argument
+ {
+ Name = "StartingIndex",
+ Direction = "out",
+ RelatedStateVariable = "A_ARG_TYPE_Index"
+ });
+
+ return action;
+ }
+
private ServiceAction GetXSetBookmarkAction()
{
var action = new ServiceAction
diff --git a/MediaBrowser.Dlna/Server/SsdpHandler.cs b/MediaBrowser.Dlna/Server/SsdpHandler.cs
index 0c3e6c735..d820b26ab 100644
--- a/MediaBrowser.Dlna/Server/SsdpHandler.cs
+++ b/MediaBrowser.Dlna/Server/SsdpHandler.cs
@@ -135,7 +135,7 @@ namespace MediaBrowser.Dlna.Server
private void RespondToSearch(IPEndPoint endpoint, string req)
{
- if (req == "ssdp:all")
+ if (string.Equals(req, "ssdp:all", StringComparison.OrdinalIgnoreCase))
{
req = null;
}
@@ -171,7 +171,7 @@ namespace MediaBrowser.Dlna.Server
SendDatagram(endpoint, dev.Address, msg, false);
- _logger.Info("{1} - Responded to a {0} request", dev.Type, endpoint);
+ _logger.Info("{1} - Responded to a {0} request to {2}", dev.Type, endpoint, dev.Address.ToString());
}
private void SendDatagram(IPEndPoint endpoint, IPAddress localAddress, string msg, bool sticky)