diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs index 5d4055abf4..ca5b8b63a4 100644 --- a/MediaBrowser.Api/BaseApiService.cs +++ b/MediaBrowser.Api/BaseApiService.cs @@ -160,6 +160,13 @@ namespace MediaBrowser.Api { var folder = (Folder) libraryManager.GetItemById(new Guid(parentId)); + if (userId.HasValue) + { + var user = userManager.GetUserById(userId.Value); + + return folder.GetRecursiveChildren(user).ToList(); + } + return folder.GetRecursiveChildren(); } if (userId.HasValue) diff --git a/MediaBrowser.Controller/Entities/BasePluginFolder.cs b/MediaBrowser.Controller/Entities/BasePluginFolder.cs index 29d66718c4..67fd8d1428 100644 --- a/MediaBrowser.Controller/Entities/BasePluginFolder.cs +++ b/MediaBrowser.Controller/Entities/BasePluginFolder.cs @@ -11,5 +11,10 @@ namespace MediaBrowser.Controller.Entities { DisplayMediaType = "CollectionFolder"; } + + public string CollectionType + { + get { return Model.Entities.CollectionType.BoxSets; } + } } } diff --git a/MediaBrowser.Controller/Entities/ICollectionFolder.cs b/MediaBrowser.Controller/Entities/ICollectionFolder.cs index 4ea531331e..4c6346f7ee 100644 --- a/MediaBrowser.Controller/Entities/ICollectionFolder.cs +++ b/MediaBrowser.Controller/Entities/ICollectionFolder.cs @@ -6,5 +6,6 @@ namespace MediaBrowser.Controller.Entities /// public interface ICollectionFolder { + string CollectionType { get; } } } diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs index ad641ce163..e05b6f708a 100644 --- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs +++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs @@ -423,7 +423,7 @@ namespace MediaBrowser.Dlna.Didl else if (item is Series || item is Season || item is BoxSet) { classType = "object.container.album.videoAlbum"; - } + } } objectClass.InnerText = classType ?? "object.container.storageFolder"; @@ -441,7 +441,7 @@ namespace MediaBrowser.Dlna.Didl if (!_profile.RequiresPlainVideoItems && item is Movie) { objectClass.InnerText = "object.item.videoItem.movie"; - } + } else { objectClass.InnerText = "object.item.videoItem"; diff --git a/MediaBrowser.Dlna/PlayTo/PlayToController.cs b/MediaBrowser.Dlna/PlayTo/PlayToController.cs index 47fd062aaa..f9f90034c5 100644 --- a/MediaBrowser.Dlna/PlayTo/PlayToController.cs +++ b/MediaBrowser.Dlna/PlayTo/PlayToController.cs @@ -463,7 +463,8 @@ namespace MediaBrowser.Dlna.PlayTo ItemId = item.Id.ToString("N"), MediaSources = mediaSources, Profile = profile, - DeviceId = deviceId + DeviceId = deviceId, + MaxBitrate = profile.MaxBitrate }), Profile = profile @@ -481,7 +482,8 @@ namespace MediaBrowser.Dlna.PlayTo ItemId = item.Id.ToString("N"), MediaSources = mediaSources, Profile = profile, - DeviceId = deviceId + DeviceId = deviceId, + MaxBitrate = profile.MaxBitrate }), Profile = profile diff --git a/MediaBrowser.Model/Entities/CollectionType.cs b/MediaBrowser.Model/Entities/CollectionType.cs index eab5cb3208..1aae2a89c3 100644 --- a/MediaBrowser.Model/Entities/CollectionType.cs +++ b/MediaBrowser.Model/Entities/CollectionType.cs @@ -22,5 +22,7 @@ namespace MediaBrowser.Model.Entities public const string Books = "books"; public const string Photos = "photos"; public const string Games = "games"; + public const string Channels = "channels"; + public const string LiveTv = "livetv"; } } diff --git a/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs b/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs new file mode 100644 index 0000000000..cec7d3855a --- /dev/null +++ b/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs @@ -0,0 +1,127 @@ +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Providers; +using MediaBrowser.Providers.Genres; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Providers.FolderImages +{ + public class DefaultImageProvider : IRemoteImageProvider + { + private readonly IHttpClient _httpClient; + + public DefaultImageProvider(IHttpClient httpClient) + { + _httpClient = httpClient; + } + + public IEnumerable GetSupportedImages(IHasImages item) + { + return new List + { + ImageType.Primary, + ImageType.Thumb + }; + } + + public Task> GetImages(IHasImages item, CancellationToken cancellationToken) + { + var view = item as UserView; + + if (view != null) + { + return GetImages(view.ViewType, cancellationToken); + } + + var folder = (ICollectionFolder)item; + return GetImages(folder.CollectionType, cancellationToken); + } + + private Task> GetImages(string viewType, CancellationToken cancellationToken) + { + var url = GetImageUrl(viewType); + + return Task.FromResult>(new List + { + new RemoteImageInfo + { + ProviderName = Name, + Url = url, + Type = ImageType.Primary + }, + + new RemoteImageInfo + { + ProviderName = Name, + Url = url, + Type = ImageType.Thumb + } + }); + } + + private string GetImageUrl(string viewType) + { + const string urlPrefix = "https://raw.githubusercontent.com/MediaBrowser/MediaBrowser.Resources/master/images/folders/"; + + if (string.Equals(viewType, CollectionType.Books, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "books.jpg"; + } + if (string.Equals(viewType, CollectionType.Games, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "games.jpg"; + } + if (string.Equals(viewType, CollectionType.Music, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "music.jpg"; + } + if (string.Equals(viewType, CollectionType.Photos, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "photos.jpg"; + } + if (string.Equals(viewType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "tv.jpg"; + } + if (string.Equals(viewType, CollectionType.Channels, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "channels.jpg"; + } + if (string.Equals(viewType, CollectionType.LiveTv, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "livetv.jpg"; + } + if (string.Equals(viewType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) + { + return urlPrefix + "movies.jpg"; + } + + return urlPrefix + "generic.jpg"; + } + + public string Name + { + get { return "Default Image Provider"; } + } + + public bool Supports(IHasImages item) + { + return item is UserView || item is CollectionFolder; + } + + public Task GetImageResponse(string url, CancellationToken cancellationToken) + { + return _httpClient.GetResponse(new HttpRequestOptions + { + CancellationToken = cancellationToken, + Url = url, + ResourcePool = GenreImageProvider.ImageDownloadResourcePool + }); + } + } +} diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 3978b36bb7..ab8483e019 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -80,6 +80,7 @@ + diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index 52dd8209ab..6255b1a092 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -122,6 +122,7 @@ "MessageConfirmItemGrouping": "Media Browser clients will automatically choose the optimal version to play based on device and network performance. Are you sure you wish to continue?", "HeaderResume": "Resume", "HeaderMyLibrary": "My Library", + "HeaderLibraryFolders": "Folder View" "HeaderLatestMedia": "Latest Media", "ButtonMore": "More...", "HeaderFavoriteMovies": "Favorite Movies", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index af191ca9a1..5626238c14 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -785,9 +785,9 @@ "LabelHomePageSection1": "Home page section one:", "LabelHomePageSection2": "Home page section two:", "LabelHomePageSection3": "Home page section three:", - "OptionLibraryButtons": "Library buttons", - "OptionLibraryTiles": "Library tiles (large)", - "OptionSmallLibraryTiles": "Library tiles (small)", + "OptionMyLibraryButtons": "My library (buttons)", + "OptionMyLibrary": "My library", + "OptionMyLibrarySmall": "My library (small)", "OptionResumablemedia": "Resume", "OptionLatestMedia": "Latest media", "OptionNone": "None", @@ -828,5 +828,6 @@ "HeaderLibraryViews": "Library Views", "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:", "LabelSelectFolderGroupsHelp": "Folders that are unchecked will be displayed by themselves in their own view.", - "OptionDisplayAdultContent": "Display adult content" + "OptionDisplayAdultContent": "Display adult content", + "OptionLibraryFolders": "Folder view" } \ No newline at end of file