diff --git a/MediaBrowser.Controller/Channels/ChannelAudioItem.cs b/MediaBrowser.Controller/Channels/ChannelAudioItem.cs
index a0999593f5..72a996b193 100644
--- a/MediaBrowser.Controller/Channels/ChannelAudioItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelAudioItem.cs
@@ -8,6 +8,8 @@ namespace MediaBrowser.Controller.Channels
{
public string ExternalId { get; set; }
+ public string ChannelId { get; set; }
+
public ChannelItemType ChannelItemType { get; set; }
public bool IsInfiniteStream { get; set; }
diff --git a/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs b/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs
index 67f0ec65f6..b20dcf6204 100644
--- a/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelCategoryItem.cs
@@ -7,6 +7,8 @@ namespace MediaBrowser.Controller.Channels
{
public string ExternalId { get; set; }
+ public string ChannelId { get; set; }
+
public ChannelItemType ChannelItemType { get; set; }
public string OriginalImageUrl { get; set; }
diff --git a/MediaBrowser.Controller/Channels/ChannelInfo.cs b/MediaBrowser.Controller/Channels/ChannelInfo.cs
new file mode 100644
index 0000000000..fd3a169a2d
--- /dev/null
+++ b/MediaBrowser.Controller/Channels/ChannelInfo.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+
+namespace MediaBrowser.Controller.Channels
+{
+ public class ChannelInfo
+ {
+ ///
+ /// Gets the home page URL.
+ ///
+ /// The home page URL.
+ public string HomePageUrl { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether this instance can search.
+ ///
+ /// true if this instance can search; otherwise, false.
+ public bool CanSearch { get; set; }
+
+ public List MediaTypes { get; set; }
+
+ public List ContentTypes { get; set; }
+
+ public ChannelInfo()
+ {
+ MediaTypes = new List();
+ ContentTypes = new List();
+ }
+ }
+
+}
diff --git a/MediaBrowser.Controller/Channels/ChannelItemInfo.cs b/MediaBrowser.Controller/Channels/ChannelItemInfo.cs
index 104204eb07..e4abea4fc7 100644
--- a/MediaBrowser.Controller/Channels/ChannelItemInfo.cs
+++ b/MediaBrowser.Controller/Channels/ChannelItemInfo.cs
@@ -88,6 +88,16 @@ namespace MediaBrowser.Controller.Channels
public Dictionary RequiredHttpHeaders { get; set; }
+ public string Container { get; set; }
+ public string AudioCodec { get; set; }
+ public string VideoCodec { get; set; }
+
+ public int? AudioBitrate { get; set; }
+ public int? VideoBitrate { get; set; }
+ public int? Width { get; set; }
+ public int? Height { get; set; }
+ public int? AudioChannels { get; set; }
+
public ChannelMediaInfo()
{
RequiredHttpHeaders = new Dictionary();
diff --git a/MediaBrowser.Controller/Channels/ChannelVideoItem.cs b/MediaBrowser.Controller/Channels/ChannelVideoItem.cs
index 0bf05f9657..0d2bd933be 100644
--- a/MediaBrowser.Controller/Channels/ChannelVideoItem.cs
+++ b/MediaBrowser.Controller/Channels/ChannelVideoItem.cs
@@ -10,6 +10,8 @@ namespace MediaBrowser.Controller.Channels
{
public string ExternalId { get; set; }
+ public string ChannelId { get; set; }
+
public ChannelItemType ChannelItemType { get; set; }
public bool IsInfiniteStream { get; set; }
diff --git a/MediaBrowser.Controller/Channels/IChannel.cs b/MediaBrowser.Controller/Channels/IChannel.cs
index ca4b7f551a..e19d083e28 100644
--- a/MediaBrowser.Controller/Channels/IChannel.cs
+++ b/MediaBrowser.Controller/Channels/IChannel.cs
@@ -66,31 +66,6 @@ namespace MediaBrowser.Controller.Channels
IEnumerable GetChannels();
}
- public class ChannelInfo
- {
- ///
- /// Gets the home page URL.
- ///
- /// The home page URL.
- public string HomePageUrl { get; set; }
-
- ///
- /// Gets or sets a value indicating whether this instance can search.
- ///
- /// true if this instance can search; otherwise, false.
- public bool CanSearch { get; set; }
-
- public List MediaTypes { get; set; }
-
- public List ContentTypes { get; set; }
-
- public ChannelInfo()
- {
- MediaTypes = new List();
- ContentTypes = new List();
- }
- }
-
public class ChannelSearchInfo
{
public string SearchTerm { get; set; }
diff --git a/MediaBrowser.Controller/Channels/IChannelItem.cs b/MediaBrowser.Controller/Channels/IChannelItem.cs
index a05ef8e295..b653cead04 100644
--- a/MediaBrowser.Controller/Channels/IChannelItem.cs
+++ b/MediaBrowser.Controller/Channels/IChannelItem.cs
@@ -4,6 +4,8 @@ namespace MediaBrowser.Controller.Channels
{
public interface IChannelItem : IHasImages
{
+ string ChannelId { get; set; }
+
string ExternalId { get; set; }
ChannelItemType ChannelItemType { get; set; }
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index b54ad2272b..830a4829f4 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -69,6 +69,7 @@
Properties\SharedVersion.cs
+
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index f6c8f6135f..e8a802725a 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -215,6 +215,9 @@
Entities\ChapterInfo.cs
+
+ Entities\CollectionType.cs
+
Entities\DisplayPreferences.cs
@@ -350,6 +353,9 @@
MediaInfo\BlurayDiscInfo.cs
+
+ MediaInfo\Constants.cs
+
MediaInfo\IBlurayExaminer.cs
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index 9845cb6b2a..5fb5fae748 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -202,6 +202,9 @@
Entities\ChapterInfo.cs
+
+ Entities\CollectionType.cs
+
Entities\DisplayPreferences.cs
@@ -337,6 +340,9 @@
MediaInfo\BlurayDiscInfo.cs
+
+ MediaInfo\Constants.cs
+
MediaInfo\IBlurayExaminer.cs
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 710e5f6b47..877eb54447 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -110,6 +110,7 @@
+
diff --git a/MediaBrowser.Model/MediaInfo/Constants.cs b/MediaBrowser.Model/MediaInfo/Constants.cs
new file mode 100644
index 0000000000..bada7bc799
--- /dev/null
+++ b/MediaBrowser.Model/MediaInfo/Constants.cs
@@ -0,0 +1,24 @@
+
+namespace MediaBrowser.Model.MediaInfo
+{
+ public class Container
+ {
+ public string MP4 = "MP4";
+ }
+
+ public class AudioCodec
+ {
+ public string AAC = "AAC";
+ public string MP3 = "MP3";
+ }
+
+ public class VideoCodec
+ {
+ public string H263 = "H263";
+ public string H264 = "H264";
+ public string H265 = "H265";
+ public string MPEG4 = "MPEG4";
+ public string MSMPEG4 = "MSMPEG4";
+ public string VC1 = "VC1";
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
index 662bbdf3e5..f516c08780 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
@@ -220,14 +220,28 @@ namespace MediaBrowser.Server.Implementations.Channels
? null
: _userManager.GetUserById(new Guid(query.UserId));
- var id = new Guid(query.ChannelId);
- var channel = _channelEntities.First(i => i.Id == id);
- var channelProvider = GetChannelProvider(channel);
+ var queryChannelId = query.ChannelId;
+ var channels = string.IsNullOrWhiteSpace(queryChannelId)
+ ? _channelEntities
+ : _channelEntities.Where(i => i.Id == new Guid(queryChannelId));
- var items = await GetChannelItems(channelProvider, user, query.CategoryId, cancellationToken)
- .ConfigureAwait(false);
+ var itemTasks = channels.Select(async channel =>
+ {
+ var channelProvider = GetChannelProvider(channel);
+
+ var items = await GetChannelItems(channelProvider, user, query.CategoryId, cancellationToken)
+ .ConfigureAwait(false);
+
+ var channelId = channel.Id.ToString("N");
+
+ var tasks = items.Select(i => GetChannelItemEntity(i, channelId, cancellationToken));
+
+ return await Task.WhenAll(tasks).ConfigureAwait(false);
+ });
- return await GetReturnItems(items, user, query, cancellationToken).ConfigureAwait(false);
+ var results = await Task.WhenAll(itemTasks).ConfigureAwait(false);
+
+ return await GetReturnItems(results.SelectMany(i => i), user, query, cancellationToken).ConfigureAwait(false);
}
private readonly SemaphoreSlim _resourcePool = new SemaphoreSlim(1, 1);
@@ -316,22 +330,13 @@ namespace MediaBrowser.Server.Implementations.Channels
return Path.Combine(_config.ApplicationPaths.CachePath, channelId, categoryKey, user.Id.ToString("N") + ".json");
}
- private async Task> GetReturnItems(IEnumerable items, User user, ChannelItemQuery query, CancellationToken cancellationToken)
+ private async Task> GetReturnItems(IEnumerable items, User user, ChannelItemQuery query, CancellationToken cancellationToken)
{
- // Get everything
- var fields = Enum.GetNames(typeof(ItemFields))
- .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
- .ToList();
-
- var tasks = items.Select(i => GetChannelItemEntity(i, cancellationToken));
-
- IEnumerable entities = await Task.WhenAll(tasks).ConfigureAwait(false);
+ items = ApplyFilters(items, query.Filters, user);
- entities = ApplyFilters(entities, query.Filters, user);
+ items = _libraryManager.Sort(items, user, query.SortBy, query.SortOrder ?? SortOrder.Ascending);
- entities = _libraryManager.Sort(entities, user, query.SortBy, query.SortOrder ?? SortOrder.Ascending);
-
- var all = entities.ToList();
+ var all = items.ToList();
var totalCount = all.Count;
if (query.StartIndex.HasValue)
@@ -345,6 +350,11 @@ namespace MediaBrowser.Server.Implementations.Channels
await RefreshIfNeeded(all, cancellationToken).ConfigureAwait(false);
+ // Get everything
+ var fields = Enum.GetNames(typeof(ItemFields))
+ .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
+ .ToList();
+
var returnItemArray = all.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
.ToArray();
@@ -358,10 +368,10 @@ namespace MediaBrowser.Server.Implementations.Channels
private string GetIdToHash(string externalId)
{
// Increment this as needed to force new downloads
- return externalId + "3";
+ return externalId + "4";
}
- private async Task GetChannelItemEntity(ChannelItemInfo info, CancellationToken cancellationToken)
+ private async Task GetChannelItemEntity(ChannelItemInfo info, string internalChannnelId, CancellationToken cancellationToken)
{
BaseItem item;
Guid id;
@@ -434,6 +444,7 @@ namespace MediaBrowser.Server.Implementations.Channels
channelItem.OriginalImageUrl = info.ImageUrl;
channelItem.ExternalId = info.Id;
+ channelItem.ChannelId = internalChannnelId;
channelItem.ChannelItemType = info.Type;
var channelMediaItem = item as IChannelMediaItem;
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 558087a252..905e6e6769 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -381,7 +381,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
{
firstMovie.IsMultiPart = true;
- _logger.Info("Multi-part video found: " + firstMovie.Path);
+ _logger.Debug("Multi-part video found: " + firstMovie.Path);
return firstMovie;
}
@@ -411,7 +411,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
{
firstMovie.HasLocalAlternateVersions = true;
- _logger.Info("Multi-version video found: " + firstMovie.Path);
+ _logger.Debug("Multi-version video found: " + firstMovie.Path);
return firstMovie;
}
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index 540e54f3b7..4b9dad90a0 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -229,6 +229,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest