From f031bb744b00d139a71036678abd6586e6595cb5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 3 May 2014 19:38:23 -0400 Subject: add new web client sidebar --- MediaBrowser.Controller/Channels/IChannel.cs | 5 +++++ MediaBrowser.Controller/Channels/IChannelManager.cs | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'MediaBrowser.Controller/Channels') diff --git a/MediaBrowser.Controller/Channels/IChannel.cs b/MediaBrowser.Controller/Channels/IChannel.cs index 0c4be86306..ca4b7f551a 100644 --- a/MediaBrowser.Controller/Channels/IChannel.cs +++ b/MediaBrowser.Controller/Channels/IChannel.cs @@ -61,6 +61,11 @@ namespace MediaBrowser.Controller.Channels IEnumerable GetSupportedChannelImages(); } + public interface IChannelFactory + { + IEnumerable GetChannels(); + } + public class ChannelInfo { /// diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs index b34e77415f..05f9afcf00 100644 --- a/MediaBrowser.Controller/Channels/IChannelManager.cs +++ b/MediaBrowser.Controller/Channels/IChannelManager.cs @@ -13,7 +13,8 @@ namespace MediaBrowser.Controller.Channels /// Adds the parts. /// /// The channels. - void AddParts(IEnumerable channels); + /// The factories. + void AddParts(IEnumerable channels, IEnumerable factories); /// /// Gets the channels. -- cgit v1.2.3 From 8aadbf35136874ac7a279f8bc0f3a4a02a131313 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 4 May 2014 20:46:52 -0400 Subject: support channel folders --- .../Channels/ChannelAudioItem.cs | 2 + .../Channels/ChannelCategoryItem.cs | 2 + MediaBrowser.Controller/Channels/ChannelInfo.cs | 30 ++++++++++++ .../Channels/ChannelItemInfo.cs | 10 ++++ .../Channels/ChannelVideoItem.cs | 2 + MediaBrowser.Controller/Channels/IChannel.cs | 25 ---------- MediaBrowser.Controller/Channels/IChannelItem.cs | 2 + .../MediaBrowser.Controller.csproj | 1 + .../MediaBrowser.Model.Portable.csproj | 6 +++ .../MediaBrowser.Model.net35.csproj | 6 +++ MediaBrowser.Model/MediaBrowser.Model.csproj | 1 + MediaBrowser.Model/MediaInfo/Constants.cs | 24 ++++++++++ .../Channels/ChannelManager.cs | 53 +++++++++++++--------- .../Library/Resolvers/Movies/MovieResolver.cs | 4 +- .../MediaBrowser.WebDashboard.csproj | 3 ++ 15 files changed, 123 insertions(+), 48 deletions(-) create mode 100644 MediaBrowser.Controller/Channels/ChannelInfo.cs create mode 100644 MediaBrowser.Model/MediaInfo/Constants.cs (limited to 'MediaBrowser.Controller/Channels') 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 -- cgit v1.2.3 From b9b568de13d81f9db1a8502d50940475c1d79c72 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 11 May 2014 19:02:28 -0400 Subject: updated nuget --- .../Channels/ChannelItemInfo.cs | 51 ------------------ .../Channels/ChannelItemResult.cs | 12 +++++ .../Channels/ChannelItemType.cs | 9 ++++ .../Channels/ChannelMediaContentType.cs | 17 ++++++ .../Channels/ChannelMediaInfo.cs | 26 +++++++++ .../Channels/ChannelMediaType.cs | 9 ++++ .../Channels/ChannelSearchInfo.cs | 7 +++ MediaBrowser.Controller/Channels/IChannel.cs | 25 --------- .../Channels/IChannelFactory.cs | 9 ++++ MediaBrowser.Controller/Channels/IChannelItem.cs | 7 --- .../Channels/IChannelMediaItem.cs | 9 ++++ .../Channels/InternalChannelItemQuery.cs | 11 ++++ MediaBrowser.Controller/Dlna/ControlRequest.cs | 14 ----- MediaBrowser.Controller/Dlna/ControlResponse.cs | 18 +++++++ MediaBrowser.Controller/Drawing/IImageProcessor.cs | 20 ------- .../Drawing/ImageProcessorExtensions.cs | 25 +++++++++ MediaBrowser.Controller/Library/IIntroProvider.cs | 16 ------ MediaBrowser.Controller/Library/ILibraryManager.cs | 16 ------ .../Library/IMetadataFileSaver.cs | 14 +++++ MediaBrowser.Controller/Library/IMetadataSaver.cs | 10 ---- MediaBrowser.Controller/Library/IntroInfo.cs | 19 +++++++ .../Library/LibraryManagerExtensions.cs | 22 ++++++++ .../Library/PlaybackProgressEventArgs.cs | 9 ---- .../Library/PlaybackStopEventArgs.cs | 11 ++++ MediaBrowser.Controller/LiveTv/EventArgs.cs | 12 ----- .../LiveTv/LiveTvConflictException.cs | 9 ++++ MediaBrowser.Controller/LiveTv/LiveTvException.cs | 7 --- .../LiveTv/LiveTvServiceStatusInfo.cs | 56 -------------------- MediaBrowser.Controller/LiveTv/LiveTvTunerInfo.cs | 61 ++++++++++++++++++++++ .../LiveTv/RecordingStatusChangedEventArgs.cs | 12 +++++ .../MediaBrowser.Controller.csproj | 19 ++++++- MediaBrowser.Model/Chapters/RemoteChapterResult.cs | 6 +++ MediaBrowser.Model/Providers/RemoteSubtitleInfo.cs | 2 +- .../Subtitles/OpenSubtitleDownloader.cs | 2 +- Nuget/MediaBrowser.Common.Internal.nuspec | 4 +- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 +- 37 files changed, 331 insertions(+), 251 deletions(-) create mode 100644 MediaBrowser.Controller/Channels/ChannelItemResult.cs create mode 100644 MediaBrowser.Controller/Channels/ChannelItemType.cs create mode 100644 MediaBrowser.Controller/Channels/ChannelMediaContentType.cs create mode 100644 MediaBrowser.Controller/Channels/ChannelMediaInfo.cs create mode 100644 MediaBrowser.Controller/Channels/ChannelMediaType.cs create mode 100644 MediaBrowser.Controller/Channels/ChannelSearchInfo.cs create mode 100644 MediaBrowser.Controller/Channels/IChannelFactory.cs create mode 100644 MediaBrowser.Controller/Channels/IChannelMediaItem.cs create mode 100644 MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs create mode 100644 MediaBrowser.Controller/Dlna/ControlResponse.cs create mode 100644 MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs create mode 100644 MediaBrowser.Controller/Library/IMetadataFileSaver.cs create mode 100644 MediaBrowser.Controller/Library/IntroInfo.cs create mode 100644 MediaBrowser.Controller/Library/LibraryManagerExtensions.cs create mode 100644 MediaBrowser.Controller/Library/PlaybackStopEventArgs.cs delete mode 100644 MediaBrowser.Controller/LiveTv/EventArgs.cs create mode 100644 MediaBrowser.Controller/LiveTv/LiveTvConflictException.cs create mode 100644 MediaBrowser.Controller/LiveTv/LiveTvTunerInfo.cs create mode 100644 MediaBrowser.Controller/LiveTv/RecordingStatusChangedEventArgs.cs (limited to 'MediaBrowser.Controller/Channels') diff --git a/MediaBrowser.Controller/Channels/ChannelItemInfo.cs b/MediaBrowser.Controller/Channels/ChannelItemInfo.cs index e4abea4fc7..7bb8d15fc3 100644 --- a/MediaBrowser.Controller/Channels/ChannelItemInfo.cs +++ b/MediaBrowser.Controller/Channels/ChannelItemInfo.cs @@ -52,55 +52,4 @@ namespace MediaBrowser.Controller.Channels ProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase); } } - - public enum ChannelItemType - { - Media = 0, - - Category = 1 - } - - public enum ChannelMediaType - { - Audio = 0, - - Video = 1 - } - - public enum ChannelMediaContentType - { - Clip = 0, - - Podcast = 1, - - Trailer = 2, - - Movie = 3, - - Episode = 4, - - Song = 5 - } - - public class ChannelMediaInfo - { - public string Path { get; set; } - - 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/ChannelItemResult.cs b/MediaBrowser.Controller/Channels/ChannelItemResult.cs new file mode 100644 index 0000000000..c6d33996e7 --- /dev/null +++ b/MediaBrowser.Controller/Channels/ChannelItemResult.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Channels +{ + public class ChannelItemResult + { + public List Items { get; set; } + + public TimeSpan CacheLength { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelItemType.cs b/MediaBrowser.Controller/Channels/ChannelItemType.cs new file mode 100644 index 0000000000..ba9d7f414e --- /dev/null +++ b/MediaBrowser.Controller/Channels/ChannelItemType.cs @@ -0,0 +1,9 @@ +namespace MediaBrowser.Controller.Channels +{ + public enum ChannelItemType + { + Media = 0, + + Category = 1 + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelMediaContentType.cs b/MediaBrowser.Controller/Channels/ChannelMediaContentType.cs new file mode 100644 index 0000000000..2aad8e0d96 --- /dev/null +++ b/MediaBrowser.Controller/Channels/ChannelMediaContentType.cs @@ -0,0 +1,17 @@ +namespace MediaBrowser.Controller.Channels +{ + public enum ChannelMediaContentType + { + Clip = 0, + + Podcast = 1, + + Trailer = 2, + + Movie = 3, + + Episode = 4, + + Song = 5 + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs b/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs new file mode 100644 index 0000000000..8105bf43cd --- /dev/null +++ b/MediaBrowser.Controller/Channels/ChannelMediaInfo.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Channels +{ + public class ChannelMediaInfo + { + public string Path { get; set; } + + 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(); + } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelMediaType.cs b/MediaBrowser.Controller/Channels/ChannelMediaType.cs new file mode 100644 index 0000000000..a03e274988 --- /dev/null +++ b/MediaBrowser.Controller/Channels/ChannelMediaType.cs @@ -0,0 +1,9 @@ +namespace MediaBrowser.Controller.Channels +{ + public enum ChannelMediaType + { + Audio = 0, + + Video = 1 + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/ChannelSearchInfo.cs b/MediaBrowser.Controller/Channels/ChannelSearchInfo.cs new file mode 100644 index 0000000000..bf7461327c --- /dev/null +++ b/MediaBrowser.Controller/Channels/ChannelSearchInfo.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Channels +{ + public class ChannelSearchInfo + { + public string SearchTerm { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/IChannel.cs b/MediaBrowser.Controller/Channels/IChannel.cs index e19d083e28..bd0bd64ea6 100644 --- a/MediaBrowser.Controller/Channels/IChannel.cs +++ b/MediaBrowser.Controller/Channels/IChannel.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; -using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -60,28 +59,4 @@ namespace MediaBrowser.Controller.Channels /// IEnumerable{ImageType}. IEnumerable GetSupportedChannelImages(); } - - public interface IChannelFactory - { - IEnumerable GetChannels(); - } - - public class ChannelSearchInfo - { - public string SearchTerm { get; set; } - } - - public class InternalChannelItemQuery - { - public string CategoryId { get; set; } - - public User User { get; set; } - } - - public class ChannelItemResult - { - public List Items { get; set; } - - public TimeSpan CacheLength { get; set; } - } } diff --git a/MediaBrowser.Controller/Channels/IChannelFactory.cs b/MediaBrowser.Controller/Channels/IChannelFactory.cs new file mode 100644 index 0000000000..e275227ff9 --- /dev/null +++ b/MediaBrowser.Controller/Channels/IChannelFactory.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Channels +{ + public interface IChannelFactory + { + IEnumerable GetChannels(); + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/IChannelItem.cs b/MediaBrowser.Controller/Channels/IChannelItem.cs index b653cead04..fc088b8886 100644 --- a/MediaBrowser.Controller/Channels/IChannelItem.cs +++ b/MediaBrowser.Controller/Channels/IChannelItem.cs @@ -12,11 +12,4 @@ namespace MediaBrowser.Controller.Channels string OriginalImageUrl { get; set; } } - - public interface IChannelMediaItem : IChannelItem - { - bool IsInfiniteStream { get; set; } - - ChannelMediaContentType ContentType { get; set; } - } } diff --git a/MediaBrowser.Controller/Channels/IChannelMediaItem.cs b/MediaBrowser.Controller/Channels/IChannelMediaItem.cs new file mode 100644 index 0000000000..3a2c076e0a --- /dev/null +++ b/MediaBrowser.Controller/Channels/IChannelMediaItem.cs @@ -0,0 +1,9 @@ +namespace MediaBrowser.Controller.Channels +{ + public interface IChannelMediaItem : IChannelItem + { + bool IsInfiniteStream { get; set; } + + ChannelMediaContentType ContentType { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs b/MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs new file mode 100644 index 0000000000..21100ebdd7 --- /dev/null +++ b/MediaBrowser.Controller/Channels/InternalChannelItemQuery.cs @@ -0,0 +1,11 @@ +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Channels +{ + public class InternalChannelItemQuery + { + public string CategoryId { get; set; } + + public User User { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Dlna/ControlRequest.cs b/MediaBrowser.Controller/Dlna/ControlRequest.cs index 1bb5ddf8a9..7020cc0d9f 100644 --- a/MediaBrowser.Controller/Dlna/ControlRequest.cs +++ b/MediaBrowser.Controller/Dlna/ControlRequest.cs @@ -17,18 +17,4 @@ namespace MediaBrowser.Controller.Dlna Headers = new Dictionary(); } } - - public class ControlResponse - { - public IDictionary Headers { get; set; } - - public string Xml { get; set; } - - public bool IsSuccessful { get; set; } - - public ControlResponse() - { - Headers = new Dictionary(); - } - } } diff --git a/MediaBrowser.Controller/Dlna/ControlResponse.cs b/MediaBrowser.Controller/Dlna/ControlResponse.cs new file mode 100644 index 0000000000..8d19a81096 --- /dev/null +++ b/MediaBrowser.Controller/Dlna/ControlResponse.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Dlna +{ + public class ControlResponse + { + public IDictionary Headers { get; set; } + + public string Xml { get; set; } + + public bool IsSuccessful { get; set; } + + public ControlResponse() + { + Headers = new Dictionary(); + } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index b0e44a2000..9c42e05815 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -86,24 +86,4 @@ namespace MediaBrowser.Controller.Drawing /// Task{System.String}. Task GetEnhancedImage(IHasImages item, ImageType imageType, int imageIndex); } - - public static class ImageProcessorExtensions - { - public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType) - { - return processor.GetImageCacheTag(item, imageType, 0); - } - - public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType, int imageIndex) - { - var imageInfo = item.GetImageInfo(imageType, imageIndex); - - if (imageInfo == null) - { - return null; - } - - return processor.GetImageCacheTag(item, imageInfo); - } - } } diff --git a/MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs b/MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs new file mode 100644 index 0000000000..c5601c49f4 --- /dev/null +++ b/MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs @@ -0,0 +1,25 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Drawing +{ + public static class ImageProcessorExtensions + { + public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType) + { + return processor.GetImageCacheTag(item, imageType, 0); + } + + public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType, int imageIndex) + { + var imageInfo = item.GetImageInfo(imageType, imageIndex); + + if (imageInfo == null) + { + return null; + } + + return processor.GetImageCacheTag(item, imageInfo); + } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Library/IIntroProvider.cs b/MediaBrowser.Controller/Library/IIntroProvider.cs index 224ca2271a..a83d3c5eb9 100644 --- a/MediaBrowser.Controller/Library/IIntroProvider.cs +++ b/MediaBrowser.Controller/Library/IIntroProvider.cs @@ -1,5 +1,4 @@ using MediaBrowser.Controller.Entities; -using System; using System.Collections.Generic; namespace MediaBrowser.Controller.Library @@ -23,19 +22,4 @@ namespace MediaBrowser.Controller.Library /// IEnumerable{System.String}. IEnumerable GetAllIntroFiles(); } - - public class IntroInfo - { - /// - /// Gets or sets the path. - /// - /// The path. - public string Path { get; set; } - - /// - /// Gets or sets the item id. - /// - /// The item id. - public Guid? ItemId { get; set; } - } } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 7529f1e0d4..69dea5e745 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -333,20 +333,4 @@ namespace MediaBrowser.Controller.Library /// IEnumerable{BaseItem}. IEnumerable ReplaceVideosWithPrimaryVersions(IEnumerable items); } - - public static class LibraryManagerExtensions - { - public static Task DeleteItem(this ILibraryManager manager, BaseItem item) - { - return manager.DeleteItem(item, new DeleteOptions - { - DeleteFileLocation = true - }); - } - - public static BaseItem GetItemById(this ILibraryManager manager, string id) - { - return manager.GetItemById(new Guid(id)); - } - } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Library/IMetadataFileSaver.cs b/MediaBrowser.Controller/Library/IMetadataFileSaver.cs new file mode 100644 index 0000000000..0883da48f8 --- /dev/null +++ b/MediaBrowser.Controller/Library/IMetadataFileSaver.cs @@ -0,0 +1,14 @@ +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Library +{ + public interface IMetadataFileSaver : IMetadataSaver + { + /// + /// Gets the save path. + /// + /// The item. + /// System.String. + string GetSavePath(IHasMetadata item); + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Library/IMetadataSaver.cs b/MediaBrowser.Controller/Library/IMetadataSaver.cs index cfee9d2064..ce8feb4c6c 100644 --- a/MediaBrowser.Controller/Library/IMetadataSaver.cs +++ b/MediaBrowser.Controller/Library/IMetadataSaver.cs @@ -31,14 +31,4 @@ namespace MediaBrowser.Controller.Library /// Task. void Save(IHasMetadata item, CancellationToken cancellationToken); } - - public interface IMetadataFileSaver : IMetadataSaver - { - /// - /// Gets the save path. - /// - /// The item. - /// System.String. - string GetSavePath(IHasMetadata item); - } } diff --git a/MediaBrowser.Controller/Library/IntroInfo.cs b/MediaBrowser.Controller/Library/IntroInfo.cs new file mode 100644 index 0000000000..d0e61d0f0a --- /dev/null +++ b/MediaBrowser.Controller/Library/IntroInfo.cs @@ -0,0 +1,19 @@ +using System; + +namespace MediaBrowser.Controller.Library +{ + public class IntroInfo + { + /// + /// Gets or sets the path. + /// + /// The path. + public string Path { get; set; } + + /// + /// Gets or sets the item id. + /// + /// The item id. + public Guid? ItemId { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Library/LibraryManagerExtensions.cs b/MediaBrowser.Controller/Library/LibraryManagerExtensions.cs new file mode 100644 index 0000000000..dd1c9c07a9 --- /dev/null +++ b/MediaBrowser.Controller/Library/LibraryManagerExtensions.cs @@ -0,0 +1,22 @@ +using System; +using System.Threading.Tasks; +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Library +{ + public static class LibraryManagerExtensions + { + public static Task DeleteItem(this ILibraryManager manager, BaseItem item) + { + return manager.DeleteItem(item, new DeleteOptions + { + DeleteFileLocation = true + }); + } + + public static BaseItem GetItemById(this ILibraryManager manager, string id) + { + return manager.GetItemById(new Guid(id)); + } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs index 7482607fff..7b7b625bf0 100644 --- a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs +++ b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs @@ -24,13 +24,4 @@ namespace MediaBrowser.Controller.Library Users = new List(); } } - - public class PlaybackStopEventArgs : PlaybackProgressEventArgs - { - /// - /// Gets or sets a value indicating whether [played to completion]. - /// - /// true if [played to completion]; otherwise, false. - public bool PlayedToCompletion { get; set; } - } } diff --git a/MediaBrowser.Controller/Library/PlaybackStopEventArgs.cs b/MediaBrowser.Controller/Library/PlaybackStopEventArgs.cs new file mode 100644 index 0000000000..b0f6799fc0 --- /dev/null +++ b/MediaBrowser.Controller/Library/PlaybackStopEventArgs.cs @@ -0,0 +1,11 @@ +namespace MediaBrowser.Controller.Library +{ + public class PlaybackStopEventArgs : PlaybackProgressEventArgs + { + /// + /// Gets or sets a value indicating whether [played to completion]. + /// + /// true if [played to completion]; otherwise, false. + public bool PlayedToCompletion { get; set; } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/LiveTv/EventArgs.cs b/MediaBrowser.Controller/LiveTv/EventArgs.cs deleted file mode 100644 index 90ea329fe9..0000000000 --- a/MediaBrowser.Controller/LiveTv/EventArgs.cs +++ /dev/null @@ -1,12 +0,0 @@ -using MediaBrowser.Model.LiveTv; -using System; - -namespace MediaBrowser.Controller.LiveTv -{ - public class RecordingStatusChangedEventArgs : EventArgs - { - public string RecordingId { get; set; } - - public RecordingStatus NewStatus { get; set; } - } -} diff --git a/MediaBrowser.Controller/LiveTv/LiveTvConflictException.cs b/MediaBrowser.Controller/LiveTv/LiveTvConflictException.cs new file mode 100644 index 0000000000..682150d35a --- /dev/null +++ b/MediaBrowser.Controller/LiveTv/LiveTvConflictException.cs @@ -0,0 +1,9 @@ +namespace MediaBrowser.Controller.LiveTv +{ + /// + /// Class LiveTvConflictException. + /// + public class LiveTvConflictException : LiveTvException + { + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/LiveTv/LiveTvException.cs b/MediaBrowser.Controller/LiveTv/LiveTvException.cs index 0a68180cac..b0a6f75b15 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvException.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvException.cs @@ -8,11 +8,4 @@ namespace MediaBrowser.Controller.LiveTv public class LiveTvException : Exception { } - - /// - /// Class LiveTvConflictException. - /// - public class LiveTvConflictException : LiveTvException - { - } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvServiceStatusInfo.cs b/MediaBrowser.Controller/LiveTv/LiveTvServiceStatusInfo.cs index da6b8ab17a..0cb064aba3 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvServiceStatusInfo.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvServiceStatusInfo.cs @@ -40,60 +40,4 @@ namespace MediaBrowser.Controller.LiveTv Tuners = new List(); } } - - public class LiveTvTunerInfo - { - /// - /// Gets or sets the type of the source. - /// - /// The type of the source. - public string SourceType { get; set; } - - /// - /// Gets or sets the name. - /// - /// The name. - public string Name { get; set; } - - /// - /// Gets or sets the identifier. - /// - /// The identifier. - public string Id { get; set; } - - /// - /// Gets or sets the status. - /// - /// The status. - public LiveTvTunerStatus Status { get; set; } - - /// - /// Gets or sets the channel identifier. - /// - /// The channel identifier. - public string ChannelId { get; set; } - - /// - /// Gets or sets the recording identifier. - /// - /// The recording identifier. - public string RecordingId { get; set; } - - /// - /// Gets or sets the name of the program. - /// - /// The name of the program. - public string ProgramName { get; set; } - - /// - /// Gets or sets the clients. - /// - /// The clients. - public List Clients { get; set; } - - public LiveTvTunerInfo() - { - Clients = new List(); - } - } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvTunerInfo.cs b/MediaBrowser.Controller/LiveTv/LiveTvTunerInfo.cs new file mode 100644 index 0000000000..cdf2f0ef52 --- /dev/null +++ b/MediaBrowser.Controller/LiveTv/LiveTvTunerInfo.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using MediaBrowser.Model.LiveTv; + +namespace MediaBrowser.Controller.LiveTv +{ + public class LiveTvTunerInfo + { + /// + /// Gets or sets the type of the source. + /// + /// The type of the source. + public string SourceType { get; set; } + + /// + /// Gets or sets the name. + /// + /// The name. + public string Name { get; set; } + + /// + /// Gets or sets the identifier. + /// + /// The identifier. + public string Id { get; set; } + + /// + /// Gets or sets the status. + /// + /// The status. + public LiveTvTunerStatus Status { get; set; } + + /// + /// Gets or sets the channel identifier. + /// + /// The channel identifier. + public string ChannelId { get; set; } + + /// + /// Gets or sets the recording identifier. + /// + /// The recording identifier. + public string RecordingId { get; set; } + + /// + /// Gets or sets the name of the program. + /// + /// The name of the program. + public string ProgramName { get; set; } + + /// + /// Gets or sets the clients. + /// + /// The clients. + public List Clients { get; set; } + + public LiveTvTunerInfo() + { + Clients = new List(); + } + } +} \ No newline at end of file diff --git a/MediaBrowser.Controller/LiveTv/RecordingStatusChangedEventArgs.cs b/MediaBrowser.Controller/LiveTv/RecordingStatusChangedEventArgs.cs new file mode 100644 index 0000000000..90ea329fe9 --- /dev/null +++ b/MediaBrowser.Controller/LiveTv/RecordingStatusChangedEventArgs.cs @@ -0,0 +1,12 @@ +using MediaBrowser.Model.LiveTv; +using System; + +namespace MediaBrowser.Controller.LiveTv +{ + public class RecordingStatusChangedEventArgs : EventArgs + { + public string RecordingId { get; set; } + + public RecordingStatus NewStatus { get; set; } + } +} diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index c7c4c5b5f6..97158c112f 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -71,18 +71,28 @@ + + + + + + + + + + @@ -91,6 +101,7 @@ + @@ -135,12 +146,16 @@ + + + + - + @@ -148,8 +163,10 @@ + + diff --git a/MediaBrowser.Model/Chapters/RemoteChapterResult.cs b/MediaBrowser.Model/Chapters/RemoteChapterResult.cs index 5c58e5e7b7..3f627c8df3 100644 --- a/MediaBrowser.Model/Chapters/RemoteChapterResult.cs +++ b/MediaBrowser.Model/Chapters/RemoteChapterResult.cs @@ -32,5 +32,11 @@ namespace MediaBrowser.Model.Chapters /// /// The chapter count. public int? ChapterCount { get; set; } + + /// + /// Gets or sets the name of the three letter iso language. + /// + /// The name of the three letter iso language. + public string ThreeLetterISOLanguageName { get; set; } } } diff --git a/MediaBrowser.Model/Providers/RemoteSubtitleInfo.cs b/MediaBrowser.Model/Providers/RemoteSubtitleInfo.cs index dab9a57a85..0a4a52cd5f 100644 --- a/MediaBrowser.Model/Providers/RemoteSubtitleInfo.cs +++ b/MediaBrowser.Model/Providers/RemoteSubtitleInfo.cs @@ -4,7 +4,7 @@ namespace MediaBrowser.Model.Providers { public class RemoteSubtitleInfo { - public string Language { get; set; } + public string ThreeLetterISOLanguageName { get; set; } public string Id { get; set; } public string ProviderName { get; set; } public string Name { get; set; } diff --git a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs index 5b951e0c27..297f058672 100644 --- a/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs +++ b/MediaBrowser.Providers/Subtitles/OpenSubtitleDownloader.cs @@ -259,7 +259,7 @@ namespace MediaBrowser.Providers.Subtitles DownloadCount = int.Parse(i.SubDownloadsCnt, _usCulture), Format = i.SubFormat, ProviderName = Name, - Language = i.SubLanguageID, + ThreeLetterISOLanguageName = i.SubLanguageID, Id = i.SubFormat + "-" + i.SubLanguageID + "-" + i.IDSubtitleFile, diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 8890d754f0..1c90bdc874 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.365 + 3.0.366 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 4a3bac116a..72bd0cbc00 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.365 + 3.0.366 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 6d35ea7556..2fa54ab0da 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.365 + 3.0.366 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - + -- cgit v1.2.3