aboutsummaryrefslogtreecommitdiff
path: root/Emby.Dlna
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Dlna')
-rw-r--r--Emby.Dlna/ContentDirectory/ContentDirectory.cs8
-rw-r--r--Emby.Dlna/ContentDirectory/ControlHandler.cs455
-rw-r--r--Emby.Dlna/Didl/DidlBuilder.cs36
-rw-r--r--Emby.Dlna/DlnaManager.cs10
-rw-r--r--Emby.Dlna/PlayTo/Device.cs45
-rw-r--r--Emby.Dlna/PlayTo/PlayToController.cs2
-rw-r--r--Emby.Dlna/Profiles/DefaultProfile.cs3
-rw-r--r--Emby.Dlna/Server/DescriptionXmlBuilder.cs2
-rw-r--r--Emby.Dlna/Service/BaseControlHandler.cs28
9 files changed, 463 insertions, 126 deletions
diff --git a/Emby.Dlna/ContentDirectory/ContentDirectory.cs b/Emby.Dlna/ContentDirectory/ContentDirectory.cs
index 4a36a16eb6..92d388e3b2 100644
--- a/Emby.Dlna/ContentDirectory/ContentDirectory.cs
+++ b/Emby.Dlna/ContentDirectory/ContentDirectory.cs
@@ -12,6 +12,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Xml;
@@ -31,6 +32,7 @@ namespace Emby.Dlna.ContentDirectory
private readonly IUserViewManager _userViewManager;
private readonly Func<IMediaEncoder> _mediaEncoder;
protected readonly IXmlReaderSettingsFactory XmlReaderSettingsFactory;
+ private readonly ITVSeriesManager _tvSeriesManager;
public ContentDirectory(IDlnaManager dlna,
IUserDataManager userDataManager,
@@ -39,7 +41,7 @@ namespace Emby.Dlna.ContentDirectory
IServerConfigurationManager config,
IUserManager userManager,
ILogger logger,
- IHttpClient httpClient, ILocalizationManager localization, IChannelManager channelManager, IMediaSourceManager mediaSourceManager, IUserViewManager userViewManager, Func<IMediaEncoder> mediaEncoder, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
+ IHttpClient httpClient, ILocalizationManager localization, IChannelManager channelManager, IMediaSourceManager mediaSourceManager, IUserViewManager userViewManager, Func<IMediaEncoder> mediaEncoder, IXmlReaderSettingsFactory xmlReaderSettingsFactory, ITVSeriesManager tvSeriesManager)
: base(logger, httpClient)
{
_dlna = dlna;
@@ -54,6 +56,7 @@ namespace Emby.Dlna.ContentDirectory
_userViewManager = userViewManager;
_mediaEncoder = mediaEncoder;
XmlReaderSettingsFactory = xmlReaderSettingsFactory;
+ _tvSeriesManager = tvSeriesManager;
}
private int SystemUpdateId
@@ -97,7 +100,8 @@ namespace Emby.Dlna.ContentDirectory
_mediaSourceManager,
_userViewManager,
_mediaEncoder(),
- XmlReaderSettingsFactory)
+ XmlReaderSettingsFactory,
+ _tvSeriesManager)
.ProcessControlRequest(request);
}
diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs
index 9345a1df71..96b282d04b 100644
--- a/Emby.Dlna/ContentDirectory/ControlHandler.cs
+++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs
@@ -27,8 +27,10 @@ using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Controller.Playlists;
+using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Xml;
+using MediaBrowser.Model.Extensions;
namespace Emby.Dlna.ContentDirectory
{
@@ -40,6 +42,7 @@ namespace Emby.Dlna.ContentDirectory
private readonly IServerConfigurationManager _config;
private readonly User _user;
private readonly IUserViewManager _userViewManager;
+ private readonly ITVSeriesManager _tvSeriesManager;
private const string NS_DC = "http://purl.org/dc/elements/1.1/";
private const string NS_DIDL = "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/";
@@ -53,7 +56,7 @@ namespace Emby.Dlna.ContentDirectory
private readonly DeviceProfile _profile;
- public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, string accessToken, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization, IChannelManager channelManager, IMediaSourceManager mediaSourceManager, IUserViewManager userViewManager, IMediaEncoder mediaEncoder, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
+ public ControlHandler(ILogger logger, ILibraryManager libraryManager, DeviceProfile profile, string serverAddress, string accessToken, IImageProcessor imageProcessor, IUserDataManager userDataManager, User user, int systemUpdateId, IServerConfigurationManager config, ILocalizationManager localization, IChannelManager channelManager, IMediaSourceManager mediaSourceManager, IUserViewManager userViewManager, IMediaEncoder mediaEncoder, IXmlReaderSettingsFactory xmlReaderSettingsFactory, ITVSeriesManager tvSeriesManager)
: base(config, logger, xmlReaderSettingsFactory)
{
_libraryManager = libraryManager;
@@ -62,6 +65,7 @@ namespace Emby.Dlna.ContentDirectory
_systemUpdateId = systemUpdateId;
_channelManager = channelManager;
_userViewManager = userViewManager;
+ _tvSeriesManager = tvSeriesManager;
_profile = profile;
_config = config;
@@ -454,14 +458,14 @@ namespace Emby.Dlna.ContentDirectory
{
Limit = limit,
StartIndex = startIndex,
- SortBy = sortOrders.ToArray(),
+ SortBy = sortOrders.ToArray(sortOrders.Count),
SortOrder = sort.SortOrder,
User = user,
Recursive = true,
IsMissing = false,
ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name },
IsFolder = isFolder,
- MediaTypes = mediaTypes.ToArray(),
+ MediaTypes = mediaTypes.ToArray(mediaTypes.Count),
DtoOptions = GetDtoOptions()
});
}
@@ -488,6 +492,14 @@ namespace Emby.Dlna.ContentDirectory
{
return GetMusicFolders(item, user, stubType, sort, startIndex, limit);
}
+ if (collectionFolder != null && string.Equals(CollectionType.Movies, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase))
+ {
+ return GetMovieFolders(item, user, stubType, sort, startIndex, limit);
+ }
+ if (collectionFolder != null && string.Equals(CollectionType.TvShows, collectionFolder.CollectionType, StringComparison.OrdinalIgnoreCase))
+ {
+ return GetTvFolders(item, user, stubType, sort, startIndex, limit);
+ }
if (stubType.HasValue)
{
@@ -497,12 +509,12 @@ namespace Emby.Dlna.ContentDirectory
{
ItemId = item.Id
- }).ToArray();
+ });
var result = new QueryResult<ServerItem>
{
- Items = items.Select(i => new ServerItem(i)).ToArray(),
- TotalRecordCount = items.Length
+ Items = items.Select(i => new ServerItem(i)).ToArray(items.Count),
+ TotalRecordCount = items.Count
};
return ApplyPaging(result, startIndex, limit);
@@ -524,8 +536,8 @@ namespace Emby.Dlna.ContentDirectory
Limit = limit,
StartIndex = startIndex,
User = user,
- IsMissing = false,
- PresetViews = new[] { CollectionType.Movies, CollectionType.TvShows },
+ IsVirtualItem = false,
+ PresetViews = new string[] { },
ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name },
IsPlaceHolder = false,
DtoOptions = GetDtoOptions()
@@ -651,11 +663,236 @@ namespace Emby.Dlna.ContentDirectory
return new QueryResult<ServerItem>
{
- Items = list.ToArray(),
+ Items = list.ToArray(list.Count),
+ TotalRecordCount = list.Count
+ };
+ }
+
+ private QueryResult<ServerItem> GetMovieFolders(BaseItem item, User user, StubType? stubType, SortCriteria sort, int? startIndex, int? limit)
+ {
+ var query = new InternalItemsQuery(user)
+ {
+ StartIndex = startIndex,
+ Limit = limit
+ };
+ SetSorting(query, sort, false);
+
+ if (stubType.HasValue && stubType.Value == StubType.ContinueWatching)
+ {
+ return GetMovieContinueWatching(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Latest)
+ {
+ return GetMovieLatest(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Movies)
+ {
+ return GetMovieMovies(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Collections)
+ {
+ return GetMovieCollections(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Favorites)
+ {
+ return GetMovieFavorites(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Genres)
+ {
+ return GetGenres(item, user, query);
+ }
+
+ var list = new List<ServerItem>();
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.ContinueWatching
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Latest
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Movies
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Collections
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Favorites
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Genres
+ });
+
+ return new QueryResult<ServerItem>
+ {
+ Items = list.ToArray(list.Count),
+ TotalRecordCount = list.Count
+ };
+ }
+
+ private QueryResult<ServerItem> GetTvFolders(BaseItem item, User user, StubType? stubType, SortCriteria sort, int? startIndex, int? limit)
+ {
+ var query = new InternalItemsQuery(user)
+ {
+ StartIndex = startIndex,
+ Limit = limit
+ };
+ SetSorting(query, sort, false);
+
+ if (stubType.HasValue && stubType.Value == StubType.ContinueWatching)
+ {
+ return GetMovieContinueWatching(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.NextUp)
+ {
+ return GetNextUp(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Latest)
+ {
+ return GetTvLatest(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Series)
+ {
+ return GetSeries(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.FavoriteSeries)
+ {
+ return GetFavoriteSeries(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.FavoriteEpisodes)
+ {
+ return GetFavoriteEpisodes(item, user, query);
+ }
+
+ if (stubType.HasValue && stubType.Value == StubType.Genres)
+ {
+ return GetGenres(item, user, query);
+ }
+
+ var list = new List<ServerItem>();
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.ContinueWatching
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.NextUp
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Latest
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Series
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.FavoriteSeries
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.FavoriteEpisodes
+ });
+
+ list.Add(new ServerItem(item)
+ {
+ StubType = StubType.Genres
+ });
+
+ return new QueryResult<ServerItem>
+ {
+ Items = list.ToArray(list.Count),
TotalRecordCount = list.Count
};
}
+ private QueryResult<ServerItem> GetMovieContinueWatching(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.Recursive = true;
+ query.Parent = parent;
+ query.SetUser(user);
+
+ query.OrderBy = new List<Tuple<string, SortOrder>>
+ {
+ new Tuple<string, SortOrder> (ItemSortBy.DatePlayed, SortOrder.Descending),
+ new Tuple<string, SortOrder> (ItemSortBy.SortName, SortOrder.Ascending)
+ };
+
+ query.IsResumable = true;
+ query.Limit = 10;
+
+ var result = _libraryManager.GetItemsResult(query);
+
+ return ToResult(result);
+ }
+
+ private QueryResult<ServerItem> GetSeries(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.Recursive = true;
+ query.Parent = parent;
+ query.SetUser(user);
+
+ query.IncludeItemTypes = new[] { typeof(Series).Name };
+
+ var result = _libraryManager.GetItemsResult(query);
+
+ return ToResult(result);
+ }
+
+ private QueryResult<ServerItem> GetMovieMovies(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.Recursive = true;
+ query.Parent = parent;
+ query.SetUser(user);
+
+ query.IncludeItemTypes = new[] { typeof(Movie).Name };
+
+ var result = _libraryManager.GetItemsResult(query);
+
+ return ToResult(result);
+ }
+
+ private QueryResult<ServerItem> GetMovieCollections(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.Recursive = true;
+ //query.Parent = parent;
+ query.SetUser(user);
+
+ query.IncludeItemTypes = new[] { typeof(BoxSet).Name };
+
+ var result = _libraryManager.GetItemsResult(query);
+
+ return ToResult(result);
+ }
+
private QueryResult<ServerItem> GetMusicAlbums(BaseItem parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
@@ -695,6 +932,45 @@ namespace Emby.Dlna.ContentDirectory
return ToResult(result);
}
+ private QueryResult<ServerItem> GetFavoriteSeries(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.Recursive = true;
+ query.Parent = parent;
+ query.SetUser(user);
+ query.IsFavorite = true;
+ query.IncludeItemTypes = new[] { typeof(Series).Name };
+
+ var result = _libraryManager.GetItemsResult(query);
+
+ return ToResult(result);
+ }
+
+ private QueryResult<ServerItem> GetFavoriteEpisodes(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.Recursive = true;
+ query.Parent = parent;
+ query.SetUser(user);
+ query.IsFavorite = true;
+ query.IncludeItemTypes = new[] { typeof(Episode).Name };
+
+ var result = _libraryManager.GetItemsResult(query);
+
+ return ToResult(result);
+ }
+
+ private QueryResult<ServerItem> GetMovieFavorites(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.Recursive = true;
+ query.Parent = parent;
+ query.SetUser(user);
+ query.IsFavorite = true;
+ query.IncludeItemTypes = new[] { typeof(Movie).Name };
+
+ var result = _libraryManager.GetItemsResult(query);
+
+ return ToResult(result);
+ }
+
private QueryResult<ServerItem> GetFavoriteAlbums(BaseItem parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
@@ -708,6 +984,24 @@ namespace Emby.Dlna.ContentDirectory
return ToResult(result);
}
+ private QueryResult<ServerItem> GetGenres(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ var genresResult = _libraryManager.GetGenres(new InternalItemsQuery(user)
+ {
+ AncestorIds = new[] { parent.Id.ToString("N") },
+ StartIndex = query.StartIndex,
+ Limit = query.Limit
+ });
+
+ var result = new QueryResult<BaseItem>
+ {
+ TotalRecordCount = genresResult.TotalRecordCount,
+ Items = genresResult.Items.Select(i => i.Item1).ToArray(genresResult.Items.Length)
+ };
+
+ return ToResult(result);
+ }
+
private QueryResult<ServerItem> GetMusicGenres(BaseItem parent, User user, InternalItemsQuery query)
{
var genresResult = _libraryManager.GetMusicGenres(new InternalItemsQuery(user)
@@ -720,7 +1014,7 @@ namespace Emby.Dlna.ContentDirectory
var result = new QueryResult<BaseItem>
{
TotalRecordCount = genresResult.TotalRecordCount,
- Items = genresResult.Items.Select(i => i.Item1).ToArray()
+ Items = genresResult.Items.Select(i => i.Item1).ToArray(genresResult.Items.Length)
};
return ToResult(result);
@@ -738,7 +1032,7 @@ namespace Emby.Dlna.ContentDirectory
var result = new QueryResult<BaseItem>
{
TotalRecordCount = artists.TotalRecordCount,
- Items = artists.Items.Select(i => i.Item1).ToArray()
+ Items = artists.Items.Select(i => i.Item1).ToArray(artists.Items.Length)
};
return ToResult(result);
@@ -756,7 +1050,7 @@ namespace Emby.Dlna.ContentDirectory
var result = new QueryResult<BaseItem>
{
TotalRecordCount = artists.TotalRecordCount,
- Items = artists.Items.Select(i => i.Item1).ToArray()
+ Items = artists.Items.Select(i => i.Item1).ToArray(artists.Items.Length)
};
return ToResult(result);
@@ -775,7 +1069,7 @@ namespace Emby.Dlna.ContentDirectory
var result = new QueryResult<BaseItem>
{
TotalRecordCount = artists.TotalRecordCount,
- Items = artists.Items.Select(i => i.Item1).ToArray()
+ Items = artists.Items.Select(i => i.Item1).ToArray(artists.Items.Length)
};
return ToResult(result);
@@ -810,6 +1104,55 @@ namespace Emby.Dlna.ContentDirectory
return ToResult(items);
}
+ private QueryResult<ServerItem> GetNextUp(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.SortBy = new string[] { };
+
+ var result = _tvSeriesManager.GetNextUp(new NextUpQuery
+ {
+ Limit = query.Limit,
+ StartIndex = query.StartIndex,
+ UserId = query.User.Id.ToString("N")
+
+ }, new List<Folder> { (Folder)parent }, query.DtoOptions);
+
+ return ToResult(result);
+ }
+
+ private QueryResult<ServerItem> GetTvLatest(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.SortBy = new string[] { };
+
+ var items = _userViewManager.GetLatestItems(new LatestItemsQuery
+ {
+ UserId = user.Id.ToString("N"),
+ Limit = 50,
+ IncludeItemTypes = new[] { typeof(Episode).Name },
+ ParentId = parent == null ? null : parent.Id.ToString("N"),
+ GroupItems = false
+
+ }, query.DtoOptions).Select(i => i.Item1 ?? i.Item2.FirstOrDefault()).Where(i => i != null).ToList();
+
+ return ToResult(items);
+ }
+
+ private QueryResult<ServerItem> GetMovieLatest(BaseItem parent, User user, InternalItemsQuery query)
+ {
+ query.SortBy = new string[] { };
+
+ var items = _userViewManager.GetLatestItems(new LatestItemsQuery
+ {
+ UserId = user.Id.ToString("N"),
+ Limit = 50,
+ IncludeItemTypes = new[] { typeof(Movie).Name },
+ ParentId = parent == null ? null : parent.Id.ToString("N"),
+ GroupItems = true
+
+ }, query.DtoOptions).Select(i => i.Item1 ?? i.Item2.FirstOrDefault()).Where(i => i != null).ToList();
+
+ return ToResult(items);
+ }
+
private QueryResult<ServerItem> GetMusicArtistItems(BaseItem item, Guid? parentId, User user, SortCriteria sort, int? startIndex, int? limit)
{
var query = new InternalItemsQuery(user)
@@ -854,7 +1197,7 @@ namespace Emby.Dlna.ContentDirectory
{
var serverItems = result
.Select(i => new ServerItem(i))
- .ToArray();
+ .ToArray(result.Count);
return new QueryResult<ServerItem>
{
@@ -868,7 +1211,7 @@ namespace Emby.Dlna.ContentDirectory
var serverItems = result
.Items
.Select(i => new ServerItem(i))
- .ToArray();
+ .ToArray(result.Items.Length);
return new QueryResult<ServerItem>
{
@@ -885,7 +1228,7 @@ namespace Emby.Dlna.ContentDirectory
sortOrders.Add(ItemSortBy.SortName);
}
- query.SortBy = sortOrders.ToArray();
+ query.SortBy = sortOrders.ToArray(sortOrders.Count);
query.SortOrder = sort.SortOrder;
}
@@ -901,8 +1244,7 @@ namespace Emby.Dlna.ContentDirectory
DtoOptions = GetDtoOptions()
});
- var serverItems = itemsResult.Items.Select(i => new ServerItem(i))
- .ToArray();
+ var serverItems = itemsResult.Items.Select(i => new ServerItem(i)).ToArray(itemsResult.Items.Length);
return new QueryResult<ServerItem>
{
@@ -942,65 +1284,16 @@ namespace Emby.Dlna.ContentDirectory
id = parts[23];
}
- if (id.StartsWith("folder_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.Folder;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("people_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.People;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("latest_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.Latest;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("playlists_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.Playlists;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("Albums_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.Albums;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("AlbumArtists_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.AlbumArtists;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("Artists_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.Artists;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("Genres_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.Genres;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("Songs_", StringComparison.OrdinalIgnoreCase))
+ var enumNames = Enum.GetNames(typeof(StubType));
+ foreach (var name in enumNames)
{
- stubType = StubType.Songs;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("FavoriteAlbums_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.FavoriteAlbums;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("FavoriteArtists_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.FavoriteArtists;
- id = id.Split(new[] { '_' }, 2)[1];
- }
- else if (id.StartsWith("FavoriteSongs_", StringComparison.OrdinalIgnoreCase))
- {
- stubType = StubType.FavoriteSongs;
- id = id.Split(new[] { '_' }, 2)[1];
+ if (id.StartsWith(name + "_", StringComparison.OrdinalIgnoreCase))
+ {
+ stubType = (StubType)Enum.Parse(typeof(StubType), name, true);
+ id = id.Split(new[] { '_' }, 2)[1];
+
+ break;
+ }
}
if (Guid.TryParse(id, out itemId))
@@ -1048,6 +1341,14 @@ namespace Emby.Dlna.ContentDirectory
Genres = 8,
FavoriteSongs = 9,
FavoriteArtists = 10,
- FavoriteAlbums = 11
+ FavoriteAlbums = 11,
+ ContinueWatching = 12,
+ Movies = 13,
+ Collections = 14,
+ Favorites = 15,
+ NextUp = 16,
+ Series = 17,
+ FavoriteSeries = 18,
+ FavoriteEpisodes = 19
}
}
diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs
index d2a160cf78..71a0493948 100644
--- a/Emby.Dlna/Didl/DidlBuilder.cs
+++ b/Emby.Dlna/Didl/DidlBuilder.cs
@@ -193,7 +193,7 @@ namespace Emby.Dlna.Didl
{
if (streamInfo == null)
{
- var sources = _mediaSourceManager.GetStaticMediaSources(video, true, _user).ToList();
+ var sources = _mediaSourceManager.GetStaticMediaSources(video, true, _user);
streamInfo = new StreamBuilder(_mediaEncoder, GetStreamBuilderLogger(options)).BuildVideoItem(new VideoOptions
{
@@ -439,6 +439,38 @@ namespace Emby.Dlna.Didl
{
return _localization.GetLocalizedString("ViewTypeMusicFavoriteSongs");
}
+ if (itemStubType.HasValue && itemStubType.Value == StubType.ContinueWatching)
+ {
+ return _localization.GetLocalizedString("ViewTypeMovieResume");
+ }
+ if (itemStubType.HasValue && itemStubType.Value == StubType.Movies)
+ {
+ return _localization.GetLocalizedString("ViewTypeMovieMovies");
+ }
+ if (itemStubType.HasValue && itemStubType.Value == StubType.Collections)
+ {
+ return _localization.GetLocalizedString("ViewTypeMovieCollections");
+ }
+ if (itemStubType.HasValue && itemStubType.Value == StubType.Favorites)
+ {
+ return _localization.GetLocalizedString("ViewTypeMovieFavorites");
+ }
+ if (itemStubType.HasValue && itemStubType.Value == StubType.NextUp)
+ {
+ return _localization.GetLocalizedString("ViewTypeTvNextUp");
+ }
+ if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSeries)
+ {
+ return _localization.GetLocalizedString("ViewTypeTvFavoriteSeries");
+ }
+ if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteEpisodes)
+ {
+ return _localization.GetLocalizedString("ViewTypeTvFavoriteEpisodes");
+ }
+ if (itemStubType.HasValue && itemStubType.Value == StubType.Series)
+ {
+ return _localization.GetLocalizedString("ViewTypeTvShowSeries");
+ }
var episode = item as Episode;
var season = context as Season;
@@ -476,7 +508,7 @@ namespace Emby.Dlna.Didl
if (streamInfo == null)
{
- var sources = _mediaSourceManager.GetStaticMediaSources(audio, true, _user).ToList();
+ var sources = _mediaSourceManager.GetStaticMediaSources(audio, true, _user);
streamInfo = new StreamBuilder(_mediaEncoder, GetStreamBuilderLogger(options)).BuildAudioItem(new AudioOptions
{
diff --git a/Emby.Dlna/DlnaManager.cs b/Emby.Dlna/DlnaManager.cs
index 82975ce22b..847f636198 100644
--- a/Emby.Dlna/DlnaManager.cs
+++ b/Emby.Dlna/DlnaManager.cs
@@ -18,6 +18,7 @@ using System.Text;
using System.Text.RegularExpressions;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Reflection;
+using MediaBrowser.Model.Extensions;
namespace Emby.Dlna
{
@@ -106,7 +107,6 @@ namespace Emby.Dlna
}
else
{
- _logger.Debug("No matching device profile found. The default will need to be used.");
LogUnmatchedProfile(deviceInfo);
}
@@ -220,12 +220,8 @@ namespace Emby.Dlna
}
else
{
- var msg = new StringBuilder();
- foreach (var header in headers)
- {
- msg.AppendLine(header.Key + ": " + header.Value);
- }
- _logger.LogMultiline("No matching device profile found. The default will need to be used.", LogSeverity.Info, msg);
+ var headerString = string.Join(", ", headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray(headers.Count));
+ _logger.Debug("No matching device profile found. {0}", headerString);
}
return profile;
diff --git a/Emby.Dlna/PlayTo/Device.cs b/Emby.Dlna/PlayTo/Device.cs
index e222980102..213e7367f0 100644
--- a/Emby.Dlna/PlayTo/Device.cs
+++ b/Emby.Dlna/PlayTo/Device.cs
@@ -15,6 +15,7 @@ using System.Threading.Tasks;
using System.Xml.Linq;
using Emby.Dlna.Server;
using MediaBrowser.Model.Threading;
+using MediaBrowser.Model.Extensions;
namespace Emby.Dlna.PlayTo
{
@@ -112,7 +113,7 @@ namespace Emby.Dlna.PlayTo
private int GetInactiveTimerIntervalMs()
{
- return 30000;
+ return Timeout.Infinite;
}
public void Start()
@@ -160,18 +161,15 @@ namespace Emby.Dlna.PlayTo
if (_disposed)
return;
- if (!_timerActive)
+ lock (_timerLock)
{
- lock (_timerLock)
+ if (!_timerActive)
{
- if (!_timerActive)
- {
- _logger.Debug("RestartTimer");
- _timer.Change(10, GetPlaybackTimerIntervalMs());
- }
-
- _timerActive = true;
+ _logger.Debug("RestartTimer");
+ _timer.Change(10, GetPlaybackTimerIntervalMs());
}
+
+ _timerActive = true;
}
}
@@ -183,23 +181,20 @@ namespace Emby.Dlna.PlayTo
if (_disposed)
return;
- if (_timerActive)
+ lock (_timerLock)
{
- lock (_timerLock)
+ if (_timerActive)
{
- if (_timerActive)
- {
- _logger.Debug("RestartTimerInactive");
- var interval = GetInactiveTimerIntervalMs();
+ _logger.Debug("RestartTimerInactive");
+ var interval = GetInactiveTimerIntervalMs();
- if (_timer != null)
- {
- _timer.Change(interval, interval);
- }
+ if (_timer != null)
+ {
+ _timer.Change(interval, interval);
}
-
- _timerActive = false;
}
+
+ _timerActive = false;
}
}
@@ -492,6 +487,10 @@ namespace Emby.Dlna.PlayTo
RestartTimer();
}
}
+ else
+ {
+ RestartTimerInactive();
+ }
}
catch (HttpException ex)
{
@@ -890,7 +889,7 @@ namespace Emby.Dlna.PlayTo
if (room != null && !string.IsNullOrWhiteSpace(room.Value))
friendlyNames.Add(room.Value);
- deviceProperties.Name = string.Join(" ", friendlyNames.ToArray());
+ deviceProperties.Name = string.Join(" ", friendlyNames.ToArray(friendlyNames.Count));
var model = document.Descendants(uPnpNamespaces.ud.GetName("modelName")).FirstOrDefault();
if (model != null)
diff --git a/Emby.Dlna/PlayTo/PlayToController.cs b/Emby.Dlna/PlayTo/PlayToController.cs
index 15d73e824b..7164cf5989 100644
--- a/Emby.Dlna/PlayTo/PlayToController.cs
+++ b/Emby.Dlna/PlayTo/PlayToController.cs
@@ -503,7 +503,7 @@ namespace Emby.Dlna.PlayTo
var hasMediaSources = item as IHasMediaSources;
var mediaSources = hasMediaSources != null
- ? (_mediaSourceManager.GetStaticMediaSources(hasMediaSources, true, user)).ToList()
+ ? (_mediaSourceManager.GetStaticMediaSources(hasMediaSources, true, user))
: new List<MediaSourceInfo>();
var playlistItem = GetPlaylistItem(item, mediaSources, profile, _session.DeviceId, mediaSourceId, audioStreamIndex, subtitleStreamIndex);
diff --git a/Emby.Dlna/Profiles/DefaultProfile.cs b/Emby.Dlna/Profiles/DefaultProfile.cs
index 06ce936408..46639ee424 100644
--- a/Emby.Dlna/Profiles/DefaultProfile.cs
+++ b/Emby.Dlna/Profiles/DefaultProfile.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Model.Dlna;
using System.Linq;
using System.Xml.Serialization;
+using MediaBrowser.Model.Extensions;
namespace Emby.Dlna.Profiles
{
@@ -172,7 +173,7 @@ namespace Emby.Dlna.Profiles
Value = value
});
- XmlRootAttributes = list.ToArray();
+ XmlRootAttributes = list.ToArray(list.Count);
}
}
}
diff --git a/Emby.Dlna/Server/DescriptionXmlBuilder.cs b/Emby.Dlna/Server/DescriptionXmlBuilder.cs
index 2a4a5792fa..bba4adc5f4 100644
--- a/Emby.Dlna/Server/DescriptionXmlBuilder.cs
+++ b/Emby.Dlna/Server/DescriptionXmlBuilder.cs
@@ -226,7 +226,7 @@ namespace Emby.Dlna.Server
}
}
- var characters = characterList.ToArray();
+ var characters = characterList.ToArray(characterList.Count);
var serverName = new string(characters);
diff --git a/Emby.Dlna/Service/BaseControlHandler.cs b/Emby.Dlna/Service/BaseControlHandler.cs
index 3092589c12..7cd10bd019 100644
--- a/Emby.Dlna/Service/BaseControlHandler.cs
+++ b/Emby.Dlna/Service/BaseControlHandler.cs
@@ -11,6 +11,7 @@ using System.Xml;
using Emby.Dlna.Didl;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Model.Xml;
+using MediaBrowser.Model.Extensions;
namespace Emby.Dlna.Service
{
@@ -235,26 +236,29 @@ namespace Emby.Dlna.Service
private void LogRequest(ControlRequest request)
{
- var builder = new StringBuilder();
+ if (!Config.GetDlnaConfiguration().EnableDebugLog)
+ {
+ return;
+ }
- var headers = string.Join(", ", request.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());
- builder.AppendFormat("Headers: {0}", headers);
- builder.AppendLine();
- //builder.Append(request.InputXml);
+ var originalHeaders = request.Headers;
+ var headers = string.Join(", ", originalHeaders.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray(originalHeaders.Count));
- Logger.LogMultiline("Control request", LogSeverity.Debug, builder);
+ Logger.Debug("Control request. Headers: {0}", headers);
}
private void LogResponse(ControlResponse response)
{
- var builder = new StringBuilder();
+ if (!Config.GetDlnaConfiguration().EnableDebugLog)
+ {
+ return;
+ }
- var headers = string.Join(", ", response.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());
- builder.AppendFormat("Headers: {0}", headers);
- builder.AppendLine();
- builder.Append(response.Xml);
+ var originalHeaders = response.Headers;
+ var headers = string.Join(", ", originalHeaders.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray(originalHeaders.Count));
+ //builder.Append(response.Xml);
- Logger.LogMultiline("Control response", LogSeverity.Debug, builder);
+ Logger.Debug("Control response. Headers: {0}", headers);
}
}
}