diff --git a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs index 71001a657d..d4f8241989 100644 --- a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs +++ b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs @@ -4,8 +4,10 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Querying; using ServiceStack.ServiceHost; using System; using System.Collections.Generic; @@ -26,8 +28,11 @@ namespace MediaBrowser.Api.DefaultTheme { [ApiMember(Name = "UserId", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET")] public Guid UserId { get; set; } + + [ApiMember(Name = "FamilyRating", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] + public string FamilyRating { get; set; } } - + public class DefaultThemeService : BaseApiService { private readonly IUserManager _userManager; @@ -35,12 +40,15 @@ namespace MediaBrowser.Api.DefaultTheme private readonly ILogger _logger; private readonly ILibraryManager _libraryManager; - public DefaultThemeService(IUserManager userManager, IDtoService dtoService, ILogger logger, ILibraryManager libraryManager) + private readonly ILocalizationManager _localization; + + public DefaultThemeService(IUserManager userManager, IDtoService dtoService, ILogger logger, ILibraryManager libraryManager, ILocalizationManager localization) { _userManager = userManager; _dtoService = dtoService; _logger = logger; _libraryManager = libraryManager; + _localization = localization; } public object Get(GetTvView request) @@ -62,19 +70,16 @@ namespace MediaBrowser.Api.DefaultTheme var view = new TvView(); - view.BackdropItems = seriesWithBackdrops + var fields = Enum.GetNames(typeof(ItemFields)) + .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) + .ToList(); + + var spotlightItemTasks = seriesWithBackdrops .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) .Take(30) - .ToArray(); + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); - view.SpotlightItems = seriesWithBackdrops - .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) - .Take(30) - .ToArray(); + view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false); view.ShowsItems = series .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) @@ -104,31 +109,43 @@ namespace MediaBrowser.Api.DefaultTheme .Where(i => i is Movie || i is Trailer || i is BoxSet) .ToList(); + var actorsTask = GetActors(items); + // Exclude trailers from backdrops because they're not always 1080p var itemsWithBackdrops = items.Where(i => i.BackdropImagePaths.Count > 0 && !(i is Trailer)) .ToList(); - var movies = items.OfType().ToList(); + var baselineRating = _localization.GetRatingLevel(request.FamilyRating ?? "PG"); + + var view = new MoviesView(); + + var movies = items.OfType() + .ToList(); + + var hdMovies = movies.Where(i => i.IsHd).ToList(); + + var familyMovies = movies.Where(i => IsFamilyMovie(i, baselineRating)).ToList(); + + view.HDMoviePercentage = 100 * hdMovies.Count; + view.HDMoviePercentage /= movies.Count; + view.FamilyMoviePercentage = 100 * familyMovies.Count; + view.FamilyMoviePercentage /= movies.Count; + var moviesWithImages = movies .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) .ToList(); - var view = new MoviesView(); + var fields = Enum.GetNames(typeof(ItemFields)) + .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) + .ToList(); - view.BackdropItems = itemsWithBackdrops + var spotlightItemTasks = itemsWithBackdrops .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) .Take(30) - .ToArray(); + .Select(i => _dtoService.GetBaseItemDto(i, fields, user)); - view.SpotlightItems = itemsWithBackdrops - .OrderBy(i => Guid.NewGuid()) - .Select(i => GetItemStub(i, ImageType.Backdrop)) - .Where(i => i != null) - .Take(30) - .ToArray(); + view.SpotlightItems = await Task.WhenAll(spotlightItemTasks).ConfigureAwait(false); view.MovieItems = moviesWithImages .OrderBy(i => Guid.NewGuid()) @@ -155,8 +172,6 @@ namespace MediaBrowser.Api.DefaultTheme .Take(3) .ToArray(); - view.PeopleItems = await GetActors(items).ConfigureAwait(false); - view.ThreeDItems = moviesWithImages .Where(i => i.Is3D) .OrderBy(i => Guid.NewGuid()) @@ -165,17 +180,51 @@ namespace MediaBrowser.Api.DefaultTheme .Take(3) .ToArray(); - view.HDItems = moviesWithImages - .Where(i => i.IsHd) + view.HDItems = hdMovies + .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) .OrderBy(i => Guid.NewGuid()) .Select(i => GetItemStub(i, ImageType.Primary)) .Where(i => i != null) .Take(3) .ToArray(); + view.FamilyMovies = familyMovies + .Where(i => !string.IsNullOrEmpty(i.PrimaryImagePath)) + .OrderBy(i => Guid.NewGuid()) + .Select(i => GetItemStub(i, ImageType.Primary)) + .Where(i => i != null) + .Take(3) + .ToArray(); + + view.PeopleItems = await actorsTask.ConfigureAwait(false); + return view; } + private bool IsFamilyMovie(BaseItem item, int? baselineRating) + { + var ratingString = item.CustomRating; + + if (string.IsNullOrEmpty(ratingString)) + { + ratingString = item.OfficialRating; + } + + if (string.IsNullOrEmpty(ratingString)) + { + return false; + } + + var rating = _localization.GetRatingLevel(ratingString); + + if (!baselineRating.HasValue || !rating.HasValue) + { + return false; + } + + return rating.Value <= baselineRating.Value; + } + private async Task GetActors(IEnumerable mediaItems) { var actorStubs = new List(); @@ -183,6 +232,7 @@ namespace MediaBrowser.Api.DefaultTheme var actors = mediaItems.SelectMany(i => i.People) .Select(i => i.Name) .Distinct(StringComparer.OrdinalIgnoreCase) + .OrderBy(i => Guid.NewGuid()) .ToList(); foreach (var actor in actors) diff --git a/MediaBrowser.Api/DefaultTheme/MoviesView.cs b/MediaBrowser.Api/DefaultTheme/MoviesView.cs index 0802473d2b..6bf1bfdd93 100644 --- a/MediaBrowser.Api/DefaultTheme/MoviesView.cs +++ b/MediaBrowser.Api/DefaultTheme/MoviesView.cs @@ -1,10 +1,10 @@ - +using MediaBrowser.Model.Dto; + namespace MediaBrowser.Api.DefaultTheme { public class MoviesView { - public ItemStub[] SpotlightItems { get; set; } - public ItemStub[] BackdropItems { get; set; } + public BaseItemDto[] SpotlightItems { get; set; } public ItemStub[] MovieItems { get; set; } public ItemStub[] PeopleItems { get; set; } @@ -12,5 +12,11 @@ namespace MediaBrowser.Api.DefaultTheme public ItemStub[] TrailerItems { get; set; } public ItemStub[] HDItems { get; set; } public ItemStub[] ThreeDItems { get; set; } + + public ItemStub[] FamilyMovies { get; set; } + + public double FamilyMoviePercentage { get; set; } + + public double HDMoviePercentage { get; set; } } } diff --git a/MediaBrowser.Api/DefaultTheme/TvView.cs b/MediaBrowser.Api/DefaultTheme/TvView.cs index b7379699da..ba7d120f12 100644 --- a/MediaBrowser.Api/DefaultTheme/TvView.cs +++ b/MediaBrowser.Api/DefaultTheme/TvView.cs @@ -1,10 +1,10 @@ - +using MediaBrowser.Model.Dto; + namespace MediaBrowser.Api.DefaultTheme { public class TvView { - public ItemStub[] SpotlightItems { get; set; } - public ItemStub[] BackdropItems { get; set; } + public BaseItemDto[] SpotlightItems { get; set; } public ItemStub[] ShowsItems { get; set; } public ItemStub[] ActorItems { get; set; } } diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index df5c32b991..0428570cc5 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -207,13 +207,15 @@ namespace MediaBrowser.Api item.ForcedSortName = request.SortName; } - item.DisplayMediaType = request.DisplayMediaType; - item.CommunityRating = request.CommunityRating; - item.HomePageUrl = request.HomePageUrl; item.Budget = request.Budget; item.Revenue = request.Revenue; + item.CriticRating = request.CriticRating; item.CriticRatingSummary = request.CriticRatingSummary; + + item.DisplayMediaType = request.DisplayMediaType; + item.CommunityRating = request.CommunityRating; + item.HomePageUrl = request.HomePageUrl; item.IndexNumber = request.IndexNumber; item.ParentIndexNumber = request.ParentIndexNumber; item.Overview = request.Overview; diff --git a/MediaBrowser.Api/SimilarItemsHelper.cs b/MediaBrowser.Api/SimilarItemsHelper.cs index 5d10afd2cf..9877860454 100644 --- a/MediaBrowser.Api/SimilarItemsHelper.cs +++ b/MediaBrowser.Api/SimilarItemsHelper.cs @@ -139,7 +139,6 @@ namespace MediaBrowser.Api .Select(i => new Tuple(i, getSimilarityScore(item, i))) .Where(i => i.Item2 > 2) .OrderByDescending(i => i.Item2) - .ThenByDescending(i => i.Item1.CriticRating ?? 0) .Select(i => i.Item1); } diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 1cf8fda20b..80246a5d84 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -121,7 +121,7 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "AlbumArtistStartsWithOrGreater", Description = "Optional filter by items whose album artist is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string AlbumArtistStartsWithOrGreater { get; set; } - + /// /// Gets or sets the air days. /// @@ -161,8 +161,14 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "AdjacentTo", Description = "Optional. Return items that are siblings of a supplied item.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")] public string AdjacentTo { get; set; } - [ApiMember(Name = "MinIndexNumber", Description = "Optional filter index number.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] + [ApiMember(Name = "MinIndexNumber", Description = "Optional filter by minimum index number.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")] public int? MinIndexNumber { get; set; } + + [ApiMember(Name = "HasParentalRating", Description = "Optional filter by items that have or do not have a parental rating", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] + public bool? HasParentalRating { get; set; } + + [ApiMember(Name = "IsHD", Description = "Optional filter by items that are HD or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] + public bool? IsHD { get; set; } } /// @@ -481,7 +487,12 @@ namespace MediaBrowser.Api.UserLibrary { items = items.Where(i => { - var rating = i.CustomRating ?? i.OfficialRating; + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) + { + rating = i.OfficialRating; + } if (string.IsNullOrEmpty(rating)) { @@ -504,7 +515,12 @@ namespace MediaBrowser.Api.UserLibrary { items = items.Where(i => { - var rating = i.CustomRating ?? i.OfficialRating; + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) + { + rating = i.OfficialRating; + } if (string.IsNullOrEmpty(rating)) { @@ -669,6 +685,31 @@ namespace MediaBrowser.Api.UserLibrary }); } + if (request.HasParentalRating.HasValue) + { + items = items.Where(i => + { + var rating = i.CustomRating; + + if (string.IsNullOrEmpty(rating)) + { + rating = i.OfficialRating; + } + + if (request.HasParentalRating.Value) + { + return !string.IsNullOrEmpty(rating); + } + + return string.IsNullOrEmpty(rating); + }); + } + + if (request.IsHD.HasValue) + { + items = items.OfType /// The artists. - public string[] Artists { get; set; } + public List Artists { get; set; } /// /// Gets or sets the album. diff --git a/MediaBrowser.Model/Querying/ItemQuery.cs b/MediaBrowser.Model/Querying/ItemQuery.cs index fe9848513d..5a61d1c80b 100644 --- a/MediaBrowser.Model/Querying/ItemQuery.cs +++ b/MediaBrowser.Model/Querying/ItemQuery.cs @@ -177,6 +177,10 @@ namespace MediaBrowser.Model.Querying public string MaxOfficialRating { get; set; } public int? MinIndexNumber { get; set; } + + public bool? HasParentalRating { get; set; } + + public bool? IsHD { get; set; } /// /// Initializes a new instance of the class. diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index e4468dfe47..751712c71e 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -12,7 +12,6 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; -using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -550,6 +549,7 @@ namespace MediaBrowser.Providers.Movies movie.Overview = movie.Overview != null ? movie.Overview.Replace("\n\n", "\n") : null; } movie.HomePageUrl = movieData.homepage; + movie.Budget = movieData.budget; movie.Revenue = movieData.revenue; diff --git a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs index c4a3318913..b41b74ee76 100644 --- a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs +++ b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs @@ -73,17 +73,6 @@ namespace MediaBrowser.Providers.Movies } } - protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) - { - // These values are now saved in movie.xml, so don't refresh if they're present - if (MovieDbProvider.HasAltMeta(item) && item.CriticRating.HasValue && !string.IsNullOrEmpty(item.CriticRatingSummary)) - { - return false; - } - - return base.NeedsRefreshInternal(item, providerInfo); - } - /// /// Supports the specified item. /// @@ -151,23 +140,20 @@ namespace MediaBrowser.Providers.Movies // Seeing some bogus RT data on omdb for series, so filter it out here // RT doesn't even have tv series - if (!(item is Series)) + int tomatoMeter; + + if (!string.IsNullOrEmpty(result.tomatoMeter) + && int.TryParse(result.tomatoMeter, NumberStyles.Integer, UsCulture, out tomatoMeter) + && tomatoMeter >= 0) + { + item.CriticRating = tomatoMeter; + } + + if (!string.IsNullOrEmpty(result.tomatoConsensus) + && !string.Equals(result.tomatoConsensus, "n/a", StringComparison.OrdinalIgnoreCase) + && !string.Equals(result.tomatoConsensus, "No consensus yet.", StringComparison.OrdinalIgnoreCase)) { - int tomatoMeter; - - if (!string.IsNullOrEmpty(result.tomatoMeter) - && int.TryParse(result.tomatoMeter, NumberStyles.Integer, UsCulture, out tomatoMeter) - && tomatoMeter >= 0) - { - item.CriticRating = tomatoMeter; - } - - if (!string.IsNullOrEmpty(result.tomatoConsensus) - && !string.Equals(result.tomatoConsensus, "n/a", StringComparison.OrdinalIgnoreCase) - && !string.Equals(result.tomatoConsensus, "No consensus yet.", StringComparison.OrdinalIgnoreCase)) - { - item.CriticRatingSummary = result.tomatoConsensus; - } + item.CriticRatingSummary = result.tomatoConsensus; } int voteCount; diff --git a/MediaBrowser.Providers/Music/MusicAlbumDynamicInfoProvider.cs b/MediaBrowser.Providers/Music/MusicAlbumDynamicInfoProvider.cs index 3d4c401e7a..521d29d893 100644 --- a/MediaBrowser.Providers/Music/MusicAlbumDynamicInfoProvider.cs +++ b/MediaBrowser.Providers/Music/MusicAlbumDynamicInfoProvider.cs @@ -67,7 +67,7 @@ namespace MediaBrowser.Providers.Music album.Artists = songs.SelectMany(i => i.Artists) .Distinct(StringComparer.OrdinalIgnoreCase) - .ToArray(); + .ToList(); // Don't save to the db return FalseTaskResult; diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 5f383f1a0e..948e9a14a3 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -137,7 +137,8 @@ namespace MediaBrowser.Server.Implementations.Dto if (user == null) { - counts = item.ItemCounts; + //counts = item.ItemCounts; + return; } else { @@ -376,7 +377,7 @@ namespace MediaBrowser.Server.Implementations.Dto } dto.Album = item.Album; - dto.Artists = string.IsNullOrEmpty(item.Artist) ? new string[] { } : new[] { item.Artist }; + dto.Artists = string.IsNullOrEmpty(item.Artist) ? new List() : new List { item.Artist }; } private void SetGameProperties(BaseItemDto dto, Game item) @@ -804,6 +805,7 @@ namespace MediaBrowser.Server.Implementations.Dto dto.Language = item.Language; dto.MediaType = item.MediaType; dto.LocationType = item.LocationType; + dto.CriticRating = item.CriticRating; if (fields.Contains(ItemFields.CriticRatingSummary)) @@ -938,7 +940,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (audio != null) { dto.Album = audio.Album; - dto.Artists = audio.Artists.ToArray(); + dto.Artists = audio.Artists; var albumParent = audio.FindParent(); diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index d017a5f7e9..602f81c334 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -581,6 +581,11 @@ namespace MediaBrowser.Server.Implementations.Library (UserRootFolder)ResolvePath(new DirectoryInfo(userRootPath))); } + public Person GetPersonSync(string name) + { + return GetItemByName(ConfigurationManager.ApplicationPaths.PeoplePath, name); + } + /// /// Gets a Person /// @@ -752,6 +757,37 @@ namespace MediaBrowser.Server.Implementations.Library /// private readonly ConcurrentDictionary _itemsByName = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + private T GetItemByName(string path, string name) + where T : BaseItem, new() + { + if (string.IsNullOrEmpty(path)) + { + throw new ArgumentNullException(); + } + + if (string.IsNullOrEmpty(name)) + { + throw new ArgumentNullException(); + } + + var validFilename = FileSystem.GetValidFilename(name); + + var key = Path.Combine(path, validFilename); + + BaseItem obj; + + if (!_itemsByName.TryGetValue(key, out obj)) + { + var tuple = CreateItemByName(key, name); + + obj = tuple.Item2; + + _itemsByName.AddOrUpdate(key, obj, (keyName, oldValue) => obj); + } + + return obj as T; + } + /// /// Generically retrieves an IBN item /// @@ -777,13 +813,15 @@ namespace MediaBrowser.Server.Implementations.Library throw new ArgumentNullException(); } - var key = Path.Combine(path, FileSystem.GetValidFilename(name)); + var validFilename = FileSystem.GetValidFilename(name); + + var key = Path.Combine(path, validFilename); BaseItem obj; if (!_itemsByName.TryGetValue(key, out obj)) { - var tuple = CreateItemByName(path, name, cancellationToken); + var tuple = CreateItemByName(key, name); obj = tuple.Item2; @@ -815,16 +853,11 @@ namespace MediaBrowser.Server.Implementations.Library /// /// The path. /// The name. - /// The cancellation token. /// Task{``0}. /// Path not created: + path - private Tuple CreateItemByName(string path, string name, CancellationToken cancellationToken) + private Tuple CreateItemByName(string path, string name) where T : BaseItem, new() { - cancellationToken.ThrowIfCancellationRequested(); - - path = Path.Combine(path, FileSystem.GetValidFilename(name)); - var fileInfo = new DirectoryInfo(path); var isNew = false; @@ -842,8 +875,6 @@ namespace MediaBrowser.Server.Implementations.Library isNew = true; } - cancellationToken.ThrowIfCancellationRequested(); - var type = typeof(T); var id = path.GetMBId(type); @@ -866,7 +897,7 @@ namespace MediaBrowser.Server.Implementations.Library // Set this now so we don't cause additional file system access during provider executions item.ResetResolveArgs(fileInfo); - return new Tuple(isNew, item); + return new Tuple(isNew, item); } /// @@ -878,16 +909,12 @@ namespace MediaBrowser.Server.Implementations.Library /// Task. public async Task ValidatePeople(CancellationToken cancellationToken, IProgress progress) { - const int maxTasks = 10; + const int maxTasks = 5; var tasks = new List(); - var includedPersonTypes = new[] { PersonType.Actor, PersonType.Director, PersonType.GuestStar, PersonType.Writer, PersonType.Producer } - .ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); - var people = RootFolder.RecursiveChildren - .Where(c => c.People != null) - .SelectMany(c => c.People.Where(p => includedPersonTypes.ContainsKey(p.Type ?? string.Empty) || includedPersonTypes.ContainsKey(p.Role ?? string.Empty))) + .SelectMany(c => c.People) .DistinctBy(p => p.Name, StringComparer.OrdinalIgnoreCase) .ToList(); @@ -1050,6 +1077,10 @@ namespace MediaBrowser.Server.Implementations.Library await RunPostScanTasks(progress, cancellationToken).ConfigureAwait(false); progress.Report(100); + + // Bad practice, i know. But we keep a lot in memory, unfortunately. + GC.Collect(2, GCCollectionMode.Forced, true); + GC.Collect(2, GCCollectionMode.Forced, true); } /// diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs index 485784397b..3c6cc654fc 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/AudioResolver.cs @@ -30,10 +30,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio { if (EntityResolutionHelper.IsAudioFile(args.Path)) { - return new Controller.Entities.Audio.Audio - { - DisplayMediaType = "Song" - }; + return new Controller.Entities.Audio.Audio(); } } diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs index e35352407a..73c26dd644 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs @@ -46,11 +46,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio return null; } - return IsMusicAlbum(args) ? new MusicAlbum - { - DisplayMediaType = "Album" - - } : null; + return IsMusicAlbum(args) ? new MusicAlbum() : null; } diff --git a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs index 8109208e77..54d816cb04 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/ArtistsValidator.cs @@ -108,7 +108,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators } // Populate counts of items - SetItemCounts(artist, null, allItems.OfType()); + //SetItemCounts(artist, null, allItems.OfType()); foreach (var lib in userLibraries) { @@ -155,10 +155,6 @@ namespace MediaBrowser.Server.Implementations.Library.Validators { artist.UserItemCounts[userId.Value] = counts; } - else - { - artist.ItemCounts = counts; - } } /// diff --git a/MediaBrowser.Server.Implementations/Library/Validators/CountHelpers.cs b/MediaBrowser.Server.Implementations/Library/Validators/CountHelpers.cs index ea4d887ea1..084d720ae1 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/CountHelpers.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/CountHelpers.cs @@ -18,46 +18,46 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// /// The item. /// The counts. - internal static void AddToDictionary(BaseItem item, Dictionary counts) + internal static void AddToDictionary(BaseItem item, Dictionary counts) { if (item is Movie) { - IncrementCount(counts, "Movie"); + IncrementCount(counts, CountType.Movie); } else if (item is Trailer) { - IncrementCount(counts, "Trailer"); + IncrementCount(counts, CountType.Trailer); } else if (item is Series) { - IncrementCount(counts, "Series"); + IncrementCount(counts, CountType.Series); } else if (item is Game) { - IncrementCount(counts, "Game"); + IncrementCount(counts, CountType.Game); } else if (item is Audio) { - IncrementCount(counts, "Audio"); + IncrementCount(counts, CountType.Song); } else if (item is MusicAlbum) { - IncrementCount(counts, "MusicAlbum"); + IncrementCount(counts, CountType.MusicAlbum); } else if (item is Episode) { - IncrementCount(counts, "Episode"); + IncrementCount(counts, CountType.Episode); } else if (item is MusicVideo) { - IncrementCount(counts, "MusicVideo"); + IncrementCount(counts, CountType.MusicVideo); } else if (item is AdultVideo) { - IncrementCount(counts, "AdultVideo"); + IncrementCount(counts, CountType.AdultVideo); } - IncrementCount(counts, "Total"); + IncrementCount(counts, CountType.Total); } /// @@ -65,7 +65,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// /// The counts. /// The key. - internal static void IncrementCount(Dictionary counts, string key) + internal static void IncrementCount(Dictionary counts, CountType key) { int count; @@ -85,20 +85,20 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// /// The counts. /// ItemByNameCounts. - internal static ItemByNameCounts GetCounts(Dictionary counts) + internal static ItemByNameCounts GetCounts(Dictionary counts) { return new ItemByNameCounts { - AdultVideoCount = GetCount(counts, "AdultVideo"), - AlbumCount = GetCount(counts, "MusicAlbum"), - EpisodeCount = GetCount(counts, "Episode"), - GameCount = GetCount(counts, "Game"), - MovieCount = GetCount(counts, "Movie"), - MusicVideoCount = GetCount(counts, "MusicVideo"), - SeriesCount = GetCount(counts, "Series"), - SongCount = GetCount(counts, "Audio"), - TrailerCount = GetCount(counts, "Trailer"), - TotalCount = GetCount(counts, "Total") + AdultVideoCount = GetCount(counts, CountType.AdultVideo), + AlbumCount = GetCount(counts, CountType.MusicAlbum), + EpisodeCount = GetCount(counts, CountType.Episode), + GameCount = GetCount(counts, CountType.Game), + MovieCount = GetCount(counts, CountType.Movie), + MusicVideoCount = GetCount(counts, CountType.MusicVideo), + SeriesCount = GetCount(counts, CountType.Series), + SongCount = GetCount(counts, CountType.Song), + TrailerCount = GetCount(counts, CountType.Trailer), + TotalCount = GetCount(counts, CountType.Total) }; } @@ -108,7 +108,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// The counts. /// The key. /// System.Int32. - internal static int GetCount(Dictionary counts, string key) + internal static int GetCount(Dictionary counts, CountType key) { int count; @@ -127,24 +127,24 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// The media. /// The names. /// The master dictionary. - internal static void SetItemCounts(Guid? userId, BaseItem media, List names, Dictionary>> masterDictionary) + internal static void SetItemCounts(Guid userId, BaseItem media, List names, Dictionary>> masterDictionary) { foreach (var name in names) { - Dictionary> libraryCounts; + Dictionary> libraryCounts; if (!masterDictionary.TryGetValue(name, out libraryCounts)) { - libraryCounts = new Dictionary>(); + libraryCounts = new Dictionary>(); masterDictionary.Add(name, libraryCounts); } - var userLibId = userId ?? Guid.Empty; - Dictionary userDictionary; + var userLibId = userId/* ?? Guid.Empty*/; + Dictionary userDictionary; if (!libraryCounts.TryGetValue(userLibId, out userDictionary)) { - userDictionary = new Dictionary(); + userDictionary = new Dictionary(); libraryCounts.Add(userLibId, userDictionary); } @@ -152,4 +152,18 @@ namespace MediaBrowser.Server.Implementations.Library.Validators } } } + + internal enum CountType + { + AdultVideo, + MusicAlbum, + Episode, + Game, + Movie, + MusicVideo, + Series, + Song, + Trailer, + Total + } } diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs index f8aeadda1d..eba7193e08 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs @@ -49,10 +49,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators var allLibraryItems = allItems; - var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); + var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); // Populate counts of items - SetItemCounts(null, allLibraryItems, masterDictionary); + //SetItemCounts(null, allLibraryItems, masterDictionary); progress.Report(2); @@ -72,10 +72,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(10); - var names = masterDictionary.Keys.ToList(); + var count = masterDictionary.Count; numComplete = 0; - foreach (var name in names) + foreach (var name in masterDictionary.Keys) { try { @@ -88,7 +88,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators numComplete++; double percent = numComplete; - percent /= names.Count; + percent /= count; percent *= 90; progress.Report(percent + 10); @@ -97,26 +97,19 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(100); } - private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) + private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) { var itemByName = await _libraryManager.GetGameGenre(name, cancellationToken, true, true).ConfigureAwait(false); - foreach (var libraryId in counts.Keys.ToList()) + foreach (var libraryId in counts.Keys) { var itemCounts = CountHelpers.GetCounts(counts[libraryId]); - if (libraryId == Guid.Empty) - { - itemByName.ItemCounts = itemCounts; - } - else - { - itemByName.UserItemCounts[libraryId] = itemCounts; - } + itemByName.UserItemCounts[libraryId] = itemCounts; } } - private void SetItemCounts(Guid? userId, IEnumerable allItems, Dictionary>> masterDictionary) + private void SetItemCounts(Guid userId, IEnumerable allItems, Dictionary>> masterDictionary) { foreach (var media in allItems) { diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs index 852984a5c2..c605961f7f 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs @@ -52,10 +52,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators var allLibraryItems = allItems; - var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); + var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); // Populate counts of items - SetItemCounts(null, allLibraryItems, masterDictionary); + //SetItemCounts(null, allLibraryItems, masterDictionary); progress.Report(2); @@ -75,10 +75,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(10); - var names = masterDictionary.Keys.ToList(); + var count = masterDictionary.Count; numComplete = 0; - foreach (var name in names) + foreach (var name in masterDictionary.Keys) { try { @@ -91,7 +91,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators numComplete++; double percent = numComplete; - percent /= names.Count; + percent /= count; percent *= 90; progress.Report(percent + 10); @@ -100,26 +100,19 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(100); } - private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) + private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) { var itemByName = await _libraryManager.GetGenre(name, cancellationToken, true, true).ConfigureAwait(false); - foreach (var libraryId in counts.Keys.ToList()) + foreach (var libraryId in counts.Keys) { var itemCounts = CountHelpers.GetCounts(counts[libraryId]); - if (libraryId == Guid.Empty) - { - itemByName.ItemCounts = itemCounts; - } - else - { - itemByName.UserItemCounts[libraryId] = itemCounts; - } + itemByName.UserItemCounts[libraryId] = itemCounts; } } - private void SetItemCounts(Guid? userId, IEnumerable allItems, Dictionary>> masterDictionary) + private void SetItemCounts(Guid userId, IEnumerable allItems, Dictionary>> masterDictionary) { foreach (var media in allItems) { diff --git a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs index 53e4435277..9063027ec9 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs @@ -52,10 +52,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators var allLibraryItems = allItems; - var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); + var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); // Populate counts of items - SetItemCounts(null, allLibraryItems, masterDictionary); + //SetItemCounts(null, allLibraryItems, masterDictionary); progress.Report(2); @@ -75,10 +75,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(10); - var names = masterDictionary.Keys.ToList(); + var count = masterDictionary.Count; numComplete = 0; - foreach (var name in names) + foreach (var name in masterDictionary.Keys) { try { @@ -91,7 +91,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators numComplete++; double percent = numComplete; - percent /= names.Count; + percent /= count; percent *= 90; progress.Report(percent + 10); @@ -100,26 +100,19 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(100); } - private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) + private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) { var itemByName = await _libraryManager.GetMusicGenre(name, cancellationToken, true, true).ConfigureAwait(false); - foreach (var libraryId in counts.Keys.ToList()) + foreach (var libraryId in counts.Keys) { var itemCounts = CountHelpers.GetCounts(counts[libraryId]); - if (libraryId == Guid.Empty) - { - itemByName.ItemCounts = itemCounts; - } - else - { - itemByName.UserItemCounts[libraryId] = itemCounts; - } + itemByName.UserItemCounts[libraryId] = itemCounts; } } - private void SetItemCounts(Guid? userId, IEnumerable allItems, Dictionary>> masterDictionary) + private void SetItemCounts(Guid userId, IEnumerable allItems, Dictionary>> masterDictionary) { foreach (var media in allItems) { diff --git a/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs b/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs index 7d77280300..708f8bfa4c 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/PeoplePostScanTask.cs @@ -39,7 +39,13 @@ namespace MediaBrowser.Server.Implementations.Library.Validators /// The progress. /// The cancellation token. /// Task. - public async Task Run(IProgress progress, CancellationToken cancellationToken) + public Task Run(IProgress progress, CancellationToken cancellationToken) + { + return RunInternal(progress, cancellationToken); + //return Task.Run(() => RunInternal(progress, cancellationToken)); + } + + private async Task RunInternal(IProgress progress, CancellationToken cancellationToken) { var allItems = _libraryManager.RootFolder.RecursiveChildren.ToList(); @@ -49,10 +55,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators var allLibraryItems = allItems; - var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); + var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); // Populate counts of items - SetItemCounts(null, allLibraryItems, masterDictionary); + //SetItemCounts(null, allLibraryItems, masterDictionary); progress.Report(2); @@ -74,16 +80,25 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(10); - var names = masterDictionary.Keys.ToList(); + var count = masterDictionary.Count; numComplete = 0; - foreach (var name in names) + foreach (var name in masterDictionary.Keys) { cancellationToken.ThrowIfCancellationRequested(); - + try { - await UpdateItemByNameCounts(name, masterDictionary[name]).ConfigureAwait(false); + var counts = masterDictionary[name]; + + var itemByName = await _libraryManager.GetPerson(name).ConfigureAwait(false); + + foreach (var libraryId in counts.Keys) + { + var itemCounts = CountHelpers.GetCounts(counts[libraryId]); + + itemByName.UserItemCounts[libraryId] = itemCounts; + } } catch (Exception ex) { @@ -92,7 +107,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators numComplete++; double percent = numComplete; - percent /= names.Count; + percent /= count; percent *= 90; progress.Report(percent + 10); @@ -101,26 +116,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(100); } - private async Task UpdateItemByNameCounts(string name, Dictionary> counts) - { - var itemByName = await _libraryManager.GetPerson(name).ConfigureAwait(false); - - foreach (var libraryId in counts.Keys.ToList()) - { - var itemCounts = CountHelpers.GetCounts(counts[libraryId]); - - if (libraryId == Guid.Empty) - { - itemByName.ItemCounts = itemCounts; - } - else - { - itemByName.UserItemCounts[libraryId] = itemCounts; - } - } - } - - private void SetItemCounts(Guid? userId, IEnumerable allItems, Dictionary>> masterDictionary) + private void SetItemCounts(Guid userId, IEnumerable allItems, Dictionary>> masterDictionary) { foreach (var media in allItems) { diff --git a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs index 1814e7c4f0..202cd94149 100644 --- a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs +++ b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs @@ -49,10 +49,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators var allLibraryItems = allItems; - var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); + var masterDictionary = new Dictionary>>(StringComparer.OrdinalIgnoreCase); // Populate counts of items - SetItemCounts(null, allLibraryItems, masterDictionary); + //SetItemCounts(null, allLibraryItems, masterDictionary); progress.Report(2); @@ -72,10 +72,10 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(10); - var names = masterDictionary.Keys.ToList(); + var count = masterDictionary.Count; numComplete = 0; - foreach (var name in names) + foreach (var name in masterDictionary.Keys) { try { @@ -88,7 +88,7 @@ namespace MediaBrowser.Server.Implementations.Library.Validators numComplete++; double percent = numComplete; - percent /= names.Count; + percent /= count; percent *= 90; progress.Report(percent + 10); @@ -97,26 +97,19 @@ namespace MediaBrowser.Server.Implementations.Library.Validators progress.Report(100); } - private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) + private async Task UpdateItemByNameCounts(string name, CancellationToken cancellationToken, Dictionary> counts) { var itemByName = await _libraryManager.GetStudio(name, cancellationToken, true, true).ConfigureAwait(false); - foreach (var libraryId in counts.Keys.ToList()) + foreach (var libraryId in counts.Keys) { var itemCounts = CountHelpers.GetCounts(counts[libraryId]); - if (libraryId == Guid.Empty) - { - itemByName.ItemCounts = itemCounts; - } - else - { - itemByName.UserItemCounts[libraryId] = itemCounts; - } + itemByName.UserItemCounts[libraryId] = itemCounts; } } - private void SetItemCounts(Guid? userId, IEnumerable allItems, Dictionary>> masterDictionary) + private void SetItemCounts(Guid userId, IEnumerable allItems, Dictionary>> masterDictionary) { foreach (var media in allItems) { diff --git a/MediaBrowser.Server.Implementations/Sorting/BudgetComparer.cs b/MediaBrowser.Server.Implementations/Sorting/BudgetComparer.cs index 39bdc63630..d2dac65499 100644 --- a/MediaBrowser.Server.Implementations/Sorting/BudgetComparer.cs +++ b/MediaBrowser.Server.Implementations/Sorting/BudgetComparer.cs @@ -14,7 +14,12 @@ namespace MediaBrowser.Server.Implementations.Sorting /// System.Int32. public int Compare(BaseItem x, BaseItem y) { - return (x.Budget ?? 0).CompareTo(y.Budget ?? 0); + return GetValue(x).CompareTo(GetValue(y)); + } + + private double GetValue(BaseItem x) + { + return x.Budget ?? 0; } /// diff --git a/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs b/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs index 358e06f3b4..9484130cbc 100644 --- a/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs +++ b/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs @@ -17,7 +17,12 @@ namespace MediaBrowser.Server.Implementations.Sorting /// System.Int32. public int Compare(BaseItem x, BaseItem y) { - return (x.CriticRating ?? 0).CompareTo(y.CriticRating ?? 0); + return GetValue(x).CompareTo(GetValue(y)); + } + + private float GetValue(BaseItem x) + { + return x.CriticRating ?? 0; } /// diff --git a/MediaBrowser.Server.Implementations/Sorting/RevenueComparer.cs b/MediaBrowser.Server.Implementations/Sorting/RevenueComparer.cs index 8764c97d0e..e9d7912a16 100644 --- a/MediaBrowser.Server.Implementations/Sorting/RevenueComparer.cs +++ b/MediaBrowser.Server.Implementations/Sorting/RevenueComparer.cs @@ -14,7 +14,12 @@ namespace MediaBrowser.Server.Implementations.Sorting /// System.Int32. public int Compare(BaseItem x, BaseItem y) { - return (x.Revenue ?? 0).CompareTo(y.Revenue ?? 0); + return GetValue(x).CompareTo(GetValue(y)); + } + + private double GetValue(BaseItem x) + { + return x.Revenue ?? 0; } /// diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index c3adbfdf72..ec6babdd10 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -168,9 +168,9 @@ False ..\packages\ServiceStack.Text.3.9.58\lib\net35\ServiceStack.Text.dll - + False - ..\packages\SimpleInjector.2.3.2\lib\net40-client\SimpleInjector.dll + ..\packages\SimpleInjector.2.3.5\lib\net40-client\SimpleInjector.dll diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config index 8ec4bce272..c657eb00c1 100644 --- a/MediaBrowser.ServerApplication/packages.config +++ b/MediaBrowser.ServerApplication/packages.config @@ -11,6 +11,6 @@ - + \ No newline at end of file diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 2309bc87f4..901e441932 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.192 + 3.0.198 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 f773f15ef8..87a6a38563 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.192 + 3.0.198 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 134d6eb10c..4f8cd13571 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.192 + 3.0.198 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 - +