From f4b890f163cd3be5b399ef03be409106ab8ff60b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 14 Jan 2014 15:03:35 -0500 Subject: [PATCH] added new item by name filters --- MediaBrowser.Api/ItemUpdateService.cs | 24 ------------- MediaBrowser.Api/LiveTv/LiveTvService.cs | 14 +++++--- .../Playback/BaseStreamingService.cs | 13 +++---- MediaBrowser.Api/Playback/StreamRequest.cs | 6 ---- .../UserLibrary/ArtistsService.cs | 5 +++ .../UserLibrary/BaseItemsByNameService.cs | 35 +++++++++++++++++++ .../UserLibrary/GameGenresService.cs | 6 ++++ MediaBrowser.Api/UserLibrary/GenresService.cs | 6 ++++ .../UserLibrary/MusicGenresService.cs | 5 +++ .../UserLibrary/PersonsService.cs | 5 +++ .../UserLibrary/StudiosService.cs | 5 +++ MediaBrowser.Api/UserLibrary/YearsService.cs | 14 ++++++++ MediaBrowser.Controller/Dto/IDtoService.cs | 7 ++++ MediaBrowser.Controller/Entities/BaseItem.cs | 8 ++--- MediaBrowser.Controller/Entities/Folder.cs | 2 +- .../{ILibraryItem.cs => IBaseItem.cs} | 2 +- .../Entities/Movies/Movie.cs | 2 +- MediaBrowser.Controller/Entities/Video.cs | 2 +- .../MediaBrowser.Controller.csproj | 2 +- .../ApiClient/ApiClientExtensions.cs | 4 +-- MediaBrowser.Model/LiveTv/ChannelInfoDto.cs | 14 +++++++- .../LiveTv/LiveTvServiceInfo.cs | 21 +++++++++++ MediaBrowser.Providers/RefreshIntrosTask.cs | 2 +- .../Dto/DtoService.cs | 5 ++- .../LiveTv/LiveTvManager.cs | 4 +-- .../Api/DashboardService.cs | 1 - MediaBrowser.WebDashboard/ApiClient.js | 31 ++-------------- .../MediaBrowser.WebDashboard.csproj | 3 -- MediaBrowser.WebDashboard/packages.config | 2 +- 29 files changed, 155 insertions(+), 95 deletions(-) rename MediaBrowser.Controller/Entities/{ILibraryItem.cs => IBaseItem.cs} (94%) diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 7912cba6fe..c530768297 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -14,14 +14,6 @@ using System.Threading.Tasks; namespace MediaBrowser.Api { - [Route("/LiveTv/Channels/{ChannelId}", "POST")] - [Api(("Updates an item"))] - public class UpdateChannel : BaseItemDto, IReturnVoid - { - [ApiMember(Name = "ChannelId", Description = "The id of the channel", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] - public string ChannelId { get; set; } - } - [Route("/Items/{ItemId}", "POST")] [Api(("Updates an item"))] public class UpdateItem : BaseItemDto, IReturnVoid @@ -98,13 +90,6 @@ namespace MediaBrowser.Api Task.WaitAll(task); } - public void Post(UpdateChannel request) - { - var task = UpdateItem(request); - - Task.WaitAll(task); - } - private async Task UpdateItem(UpdateItem request) { var item = _dtoService.GetItemByDtoId(request.ItemId); @@ -144,15 +129,6 @@ namespace MediaBrowser.Api await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); } - private async Task UpdateItem(UpdateChannel request) - { - var item = _liveTv.GetInternalChannel(request.Id); - - UpdateItem(request, item); - - await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); - } - public void Post(UpdateArtist request) { var task = UpdateItem(request); diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 5b123eb974..20b1af8b25 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -13,9 +13,9 @@ using System.Threading.Tasks; namespace MediaBrowser.Api.LiveTv { - [Route("/LiveTv/Services", "GET")] + [Route("/LiveTv/Info", "GET")] [Api(Description = "Gets available live tv services.")] - public class GetServices : IReturn> + public class GetLiveTvInfo : IReturn { } @@ -290,13 +290,19 @@ namespace MediaBrowser.Api.LiveTv } } - public object Get(GetServices request) + public object Get(GetLiveTvInfo request) { var services = _liveTvManager.Services .Select(GetServiceInfo) .ToList(); - return ToOptimizedResult(services); + var info = new LiveTvInfo + { + Services = services, + ActiveServiceName = _liveTvManager.ActiveService == null ? null : _liveTvManager.ActiveService.Name + }; + + return ToOptimizedResult(info); } private LiveTvServiceInfo GetServiceInfo(ILiveTvService service) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index a39e4cf584..7ad15c9eea 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1004,9 +1004,9 @@ namespace MediaBrowser.Api.Playback RequestedUrl = url }; - Guid itemId; + var item = DtoService.GetItemByDtoId(request.Id); - if (string.Equals(request.Type, "Recording", StringComparison.OrdinalIgnoreCase)) + if (item is ILiveTvRecording) { var recording = await LiveTvManager.GetInternalRecording(request.Id, cancellationToken).ConfigureAwait(false); @@ -1042,11 +1042,10 @@ namespace MediaBrowser.Api.Playback } } - itemId = recording.Id; //state.RunTimeTicks = recording.RunTimeTicks; state.SendInputOverStandardInput = recording.RecordingInfo.Status == RecordingStatus.InProgress; } - else if (string.Equals(request.Type, "Channel", StringComparison.OrdinalIgnoreCase)) + else if (item is LiveTvChannel) { var channel = LiveTvManager.GetInternalChannel(request.Id); @@ -1069,13 +1068,10 @@ namespace MediaBrowser.Api.Playback state.IsRemote = true; } - itemId = channel.Id; state.SendInputOverStandardInput = true; } else { - var item = DtoService.GetItemByDtoId(request.Id); - state.MediaPath = item.Path; state.IsRemote = item.LocationType == LocationType.Remote; @@ -1093,14 +1089,13 @@ namespace MediaBrowser.Api.Playback } state.RunTimeTicks = item.RunTimeTicks; - itemId = item.Id; } var videoRequest = request as VideoStreamRequest; var mediaStreams = ItemRepository.GetMediaStreams(new MediaStreamQuery { - ItemId = itemId + ItemId = item.Id }).ToList(); diff --git a/MediaBrowser.Api/Playback/StreamRequest.cs b/MediaBrowser.Api/Playback/StreamRequest.cs index 454cc411cb..1486c0de7a 100644 --- a/MediaBrowser.Api/Playback/StreamRequest.cs +++ b/MediaBrowser.Api/Playback/StreamRequest.cs @@ -65,12 +65,6 @@ namespace MediaBrowser.Api.Playback /// No need to put this in api docs since it's dlna only /// public bool AlbumArt { get; set; } - - /// - /// Gets or sets the type. - /// - /// The type. - public string Type { get; set; } } public class VideoStreamRequest : StreamRequest diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs index 5c1b104870..48fc729131 100644 --- a/MediaBrowser.Api/UserLibrary/ArtistsService.cs +++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs @@ -114,5 +114,10 @@ namespace MediaBrowser.Api.UserLibrary return LibraryManager.GetAllArtists(items) .Select(name => LibraryManager.GetArtist(name)); } + + protected override IEnumerable GetLibraryItems(MusicArtist item, IEnumerable libraryItems) + { + return libraryItems.OfType().Where(i => i.HasArtist(item.Name)).Cast(); + } } } diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs index 15926e9836..dec35100d1 100644 --- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs +++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs @@ -93,6 +93,8 @@ namespace MediaBrowser.Api.UserLibrary var filteredItems = FilterItems(request, extractedItems, user); + filteredItems = FilterByLibraryItems(request, filteredItems, user); + filteredItems = ItemsService.ApplySortOrder(request, filteredItems, user, LibraryManager).Cast(); var ibnItemsArray = filteredItems.ToList(); @@ -127,6 +129,39 @@ namespace MediaBrowser.Api.UserLibrary return result; } + private IEnumerable FilterByLibraryItems(GetItemsByName request, IEnumerable items, User user) + { + var filters = request.GetFilters().ToList(); + + if (filters.Contains(ItemFilter.IsPlayed)) + { + var libraryItems = user.RootFolder.GetRecursiveChildren(user).ToList(); + + items = items.Where(i => GetLibraryItems(i, libraryItems).All(l => + { + var userdata = UserDataRepository.GetUserData(user.Id, l.GetUserDataKey()); + + return userdata != null && userdata.Played; + })); + } + + if (filters.Contains(ItemFilter.IsUnplayed)) + { + var libraryItems = user.RootFolder.GetRecursiveChildren(user).ToList(); + + items = items.Where(i => GetLibraryItems(i, libraryItems).All(l => + { + var userdata = UserDataRepository.GetUserData(user.Id, l.GetUserDataKey()); + + return userdata == null || !userdata.Played; + })); + } + + return items; + } + + protected abstract IEnumerable GetLibraryItems(TItemType item, IEnumerable libraryItems); + /// /// Filters the items. /// diff --git a/MediaBrowser.Api/UserLibrary/GameGenresService.cs b/MediaBrowser.Api/UserLibrary/GameGenresService.cs index 54aeaeed35..77b1f4c542 100644 --- a/MediaBrowser.Api/UserLibrary/GameGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GameGenresService.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; @@ -109,5 +110,10 @@ namespace MediaBrowser.Api.UserLibrary .Distinct(StringComparer.OrdinalIgnoreCase) .Select(name => LibraryManager.GetGameGenre(name)); } + + protected override IEnumerable GetLibraryItems(GameGenre item, IEnumerable libraryItems) + { + return libraryItems.Where(i => (i is Game) && i.Genres.Contains(item.Name, StringComparer.OrdinalIgnoreCase)); + } } } diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs index db3948976d..d1f7fab014 100644 --- a/MediaBrowser.Api/UserLibrary/GenresService.cs +++ b/MediaBrowser.Api/UserLibrary/GenresService.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; @@ -113,5 +114,10 @@ namespace MediaBrowser.Api.UserLibrary .Distinct(StringComparer.OrdinalIgnoreCase) .Select(name => LibraryManager.GetGenre(name)); } + + protected override IEnumerable GetLibraryItems(Genre item, IEnumerable libraryItems) + { + return libraryItems.Where(i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(item.Name, StringComparer.OrdinalIgnoreCase)); + } } } diff --git a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs index 59af94ef5b..945ac5a670 100644 --- a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs +++ b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs @@ -109,5 +109,10 @@ namespace MediaBrowser.Api.UserLibrary .Distinct(StringComparer.OrdinalIgnoreCase) .Select(name => LibraryManager.GetMusicGenre(name)); } + + protected override IEnumerable GetLibraryItems(MusicGenre item, IEnumerable libraryItems) + { + return libraryItems.Where(i => (i is IHasMusicGenres) && i.Genres.Contains(item.Name, StringComparer.OrdinalIgnoreCase)); + } } } diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs index 48e486bb57..03e710ae81 100644 --- a/MediaBrowser.Api/UserLibrary/PersonsService.cs +++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs @@ -163,5 +163,10 @@ namespace MediaBrowser.Api.UserLibrary people.Where(p => personTypes.Contains(p.Type ?? string.Empty, StringComparer.OrdinalIgnoreCase) || personTypes.Contains(p.Role ?? string.Empty, StringComparer.OrdinalIgnoreCase)); } + + protected override IEnumerable GetLibraryItems(Person item, IEnumerable libraryItems) + { + return libraryItems.Where(i => i.People.Any(p => string.Equals(p.Name, item.Name, StringComparison.OrdinalIgnoreCase))); + } } } diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs index 86f9394375..8b1eeec0f8 100644 --- a/MediaBrowser.Api/UserLibrary/StudiosService.cs +++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs @@ -114,5 +114,10 @@ namespace MediaBrowser.Api.UserLibrary .Distinct(StringComparer.OrdinalIgnoreCase) .Select(name => LibraryManager.GetStudio(name)); } + + protected override IEnumerable GetLibraryItems(Studio item, IEnumerable libraryItems) + { + return libraryItems.Where(i => i.Studios.Contains(item.Name, StringComparer.OrdinalIgnoreCase)); + } } } diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs index 8f5178ac5c..8b03fb50b7 100644 --- a/MediaBrowser.Api/UserLibrary/YearsService.cs +++ b/MediaBrowser.Api/UserLibrary/YearsService.cs @@ -114,5 +114,19 @@ namespace MediaBrowser.Api.UserLibrary .Distinct() .Select(year => LibraryManager.GetYear(year)); } + + protected readonly CultureInfo UsCulture = new CultureInfo("en-US"); + + protected override IEnumerable GetLibraryItems(Year item, IEnumerable libraryItems) + { + int year; + + if (!int.TryParse(item.Name, NumberStyles.Integer, UsCulture, out year)) + { + return libraryItems; + } + + return libraryItems.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year); + } } } diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs index 6cd10a2fb7..fd5ccac5b2 100644 --- a/MediaBrowser.Controller/Dto/IDtoService.cs +++ b/MediaBrowser.Controller/Dto/IDtoService.cs @@ -57,6 +57,13 @@ namespace MediaBrowser.Controller.Dto /// BaseItem. BaseItem GetItemByDtoId(string id, Guid? userId = null); + /// + /// Attaches the primary image aspect ratio. + /// + /// The dto. + /// The item. + void AttachPrimaryImageAspectRatio(IItemDto dto, IHasImages item); + /// /// Gets the base item dto. /// diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index dcee4bae76..47b5247c37 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -23,7 +23,7 @@ namespace MediaBrowser.Controller.Entities /// /// Class BaseItem /// - public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData + public abstract class BaseItem : IHasProviderIds, IBaseItem, IHasImages, IHasUserData { protected BaseItem() { @@ -662,7 +662,7 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.ResolvePaths(files, null).Select(video => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.RetrieveItem(video.Id) as Trailer; + var dbItem = LibraryManager.GetItemById(video.Id) as Trailer; if (dbItem != null) { @@ -723,7 +723,7 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.ResolvePaths(files, null).Select(audio => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.RetrieveItem(audio.Id) as Audio.Audio; + var dbItem = LibraryManager.GetItemById(audio.Id) as Audio.Audio; if (dbItem != null) { @@ -781,7 +781,7 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.ResolvePaths