diff --git a/MediaBrowser.Controller/Dto/DtoBuilder.cs b/MediaBrowser.Controller/Dto/DtoBuilder.cs index b2b858b6da..ea994e103a 100644 --- a/MediaBrowser.Controller/Dto/DtoBuilder.cs +++ b/MediaBrowser.Controller/Dto/DtoBuilder.cs @@ -104,33 +104,9 @@ namespace MediaBrowser.Controller.Dto if (fields.Contains(ItemFields.SoundtrackIds)) { - var series = item as Series; - - if (series != null) - { - AttachSoundtrackIds(dto, series, user); - } - - var movie = item as Movie; - - if (movie != null) - { - AttachSoundtrackIds(dto, movie, user); - } - - var album = item as MusicAlbum; - - if (album != null) - { - AttachSoundtrackIds(dto, album, user); - } - - var game = item as Game; - - if (game != null) - { - AttachSoundtrackIds(dto, game, user); - } + dto.SoundtrackIds = item.SoundtrackIds + .Select(i => i.ToString("N")) + .ToArray(); } // Make sure all the tasks we kicked off have completed. @@ -142,132 +118,6 @@ namespace MediaBrowser.Controller.Dto return dto; } - private void AttachSoundtrackIds(BaseItemDto dto, Movie item, User user) - { - var tmdb = item.GetProviderId(MetadataProviders.Tmdb); - - if (string.IsNullOrEmpty(tmdb)) - { - return; - } - - var recursiveChildren = user == null - ? _libraryManager.RootFolder.RecursiveChildren - : user.RootFolder.GetRecursiveChildren(user); - - dto.SoundtrackIds = recursiveChildren - .Where(i => - { - if (!string.IsNullOrEmpty(tmdb) && - string.Equals(tmdb, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase) && - i is MusicAlbum) - { - return true; - } - return false; - }) - .Select(GetClientItemId) - .ToArray(); - } - - private void AttachSoundtrackIds(BaseItemDto dto, Series item, User user) - { - var tvdb = item.GetProviderId(MetadataProviders.Tvdb); - - if (string.IsNullOrEmpty(tvdb)) - { - return; - } - - var recursiveChildren = user == null - ? _libraryManager.RootFolder.RecursiveChildren - : user.RootFolder.GetRecursiveChildren(user); - - dto.SoundtrackIds = recursiveChildren - .Where(i => - { - if (!string.IsNullOrEmpty(tvdb) && - string.Equals(tvdb, i.GetProviderId(MetadataProviders.Tvdb), StringComparison.OrdinalIgnoreCase) && - i is MusicAlbum) - { - return true; - } - return false; - }) - .Select(GetClientItemId) - .ToArray(); - } - - private void AttachSoundtrackIds(BaseItemDto dto, Game item, User user) - { - var gamesdb = item.GetProviderId(MetadataProviders.Gamesdb); - - if (string.IsNullOrEmpty(gamesdb)) - { - return; - } - - var recursiveChildren = user == null - ? _libraryManager.RootFolder.RecursiveChildren - : user.RootFolder.GetRecursiveChildren(user); - - dto.SoundtrackIds = recursiveChildren - .Where(i => - { - if (!string.IsNullOrEmpty(gamesdb) && - string.Equals(gamesdb, i.GetProviderId(MetadataProviders.Gamesdb), StringComparison.OrdinalIgnoreCase) && - i is MusicAlbum) - { - return true; - } - return false; - }) - .Select(GetClientItemId) - .ToArray(); - } - - private void AttachSoundtrackIds(BaseItemDto dto, MusicAlbum item, User user) - { - var tmdb = item.GetProviderId(MetadataProviders.Tmdb); - var tvdb = item.GetProviderId(MetadataProviders.Tvdb); - var gamesdb = item.GetProviderId(MetadataProviders.Gamesdb); - - if (string.IsNullOrEmpty(tmdb) && string.IsNullOrEmpty(tvdb) && string.IsNullOrEmpty(gamesdb)) - { - return; - } - - var recursiveChildren = user == null - ? _libraryManager.RootFolder.RecursiveChildren - : user.RootFolder.GetRecursiveChildren(user); - - dto.SoundtrackIds = recursiveChildren - .Where(i => - { - if (!string.IsNullOrEmpty(tmdb) && - string.Equals(tmdb, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase) && - i is Movie) - { - return true; - } - if (!string.IsNullOrEmpty(tvdb) && - string.Equals(tvdb, i.GetProviderId(MetadataProviders.Tvdb), StringComparison.OrdinalIgnoreCase) && - i is Series) - { - return true; - } - if (!string.IsNullOrEmpty(gamesdb) && - string.Equals(gamesdb, i.GetProviderId(MetadataProviders.Gamesdb), StringComparison.OrdinalIgnoreCase) && - i is Game) - { - return true; - } - return false; - }) - .Select(GetClientItemId) - .ToArray(); - } - /// /// Attaches the user specific info. /// @@ -716,8 +566,20 @@ namespace MediaBrowser.Controller.Dto { SetMusicVideoProperties(dto, musicVideo); } + + var book = item as Book; + + if (book != null) + { + SetBookProperties(dto, book); + } } + private void SetBookProperties(BaseItemDto dto, Book item) + { + dto.SeriesName = item.SeriesName; + } + private void SetMusicVideoProperties(BaseItemDto dto, MusicVideo item) { if (!string.IsNullOrEmpty(item.Album)) diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 3c8c2411ec..e756d22113 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -23,6 +23,11 @@ namespace MediaBrowser.Controller.Entities /// public abstract class BaseItem : IHasProviderIds { + /// + /// MusicAlbums in the library that are the soundtrack for this item + /// + public List SoundtrackIds { get; set; } + protected BaseItem() { Genres = new List(); @@ -38,6 +43,7 @@ namespace MediaBrowser.Controller.Entities Tags = new List(); ThemeSongIds = new List(); ThemeVideoIds = new List(); + SoundtrackIds = new List(); LocalTrailerIds = new List(); LockedFields = new List(); } diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 28e6173789..761cdccbe3 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -81,6 +81,7 @@ + diff --git a/MediaBrowser.Providers/Movies/MovieXmlParser.cs b/MediaBrowser.Providers/Movies/MovieXmlParser.cs index a265419554..7361be04f5 100644 --- a/MediaBrowser.Providers/Movies/MovieXmlParser.cs +++ b/MediaBrowser.Providers/Movies/MovieXmlParser.cs @@ -48,7 +48,7 @@ namespace MediaBrowser.Providers.Movies { case "Chapters": - _chaptersTask = FetchChaptersFromXmlNode(item, reader.ReadSubtree(), _itemRepo, CancellationToken.None); + //_chaptersTask = FetchChaptersFromXmlNode(item, reader.ReadSubtree(), _itemRepo, CancellationToken.None); break; default: diff --git a/MediaBrowser.Providers/Music/SoundtrackPostScanTask.cs b/MediaBrowser.Providers/Music/SoundtrackPostScanTask.cs new file mode 100644 index 0000000000..18868d3eae --- /dev/null +++ b/MediaBrowser.Providers/Music/SoundtrackPostScanTask.cs @@ -0,0 +1,159 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Providers.Music +{ + public class SoundtrackPostScanTask : ILibraryPostScanTask + { + private readonly ILibraryManager _libraryManager; + + public SoundtrackPostScanTask(ILibraryManager libraryManager) + { + _libraryManager = libraryManager; + } + + public Task Run(IProgress progress, CancellationToken cancellationToken) + { + return Task.Run(() => RunInternal(progress, cancellationToken)); + } + + private void RunInternal(IProgress progress, CancellationToken cancellationToken) + { + var allItems = _libraryManager.RootFolder + .RecursiveChildren + .ToList(); + + var musicAlbums = allItems + .OfType() + .ToList(); + + AttachMovieSoundtracks(allItems, musicAlbums, cancellationToken); + + progress.Report(25); + + AttachTvSoundtracks(allItems, musicAlbums, cancellationToken); + + progress.Report(50); + + AttachGameSoundtracks(allItems, musicAlbums, cancellationToken); + + progress.Report(75); + + AttachAlbumLinks(allItems, musicAlbums, cancellationToken); + + progress.Report(100); + } + + private void AttachMovieSoundtracks(IEnumerable allItems, List allAlbums, CancellationToken cancellationToken) + { + foreach (var movie in allItems + .Where(i => (i is Movie) || (i is Trailer))) + { + cancellationToken.ThrowIfCancellationRequested(); + + var tmdbId = movie.GetProviderId(MetadataProviders.Tmdb); + + if (string.IsNullOrEmpty(tmdbId)) + { + movie.SoundtrackIds = new List(); + continue; + } + + movie.SoundtrackIds = allAlbums + .Where(i => string.Equals(tmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase)) + .Select(i => i.Id) + .ToList(); + } + } + + private void AttachTvSoundtracks(IEnumerable allItems, List allAlbums, CancellationToken cancellationToken) + { + foreach (var series in allItems.OfType()) + { + cancellationToken.ThrowIfCancellationRequested(); + + var tvdbId = series.GetProviderId(MetadataProviders.Tvdb); + + if (string.IsNullOrEmpty(tvdbId)) + { + series.SoundtrackIds = new List(); + continue; + } + + series.SoundtrackIds = allAlbums + .Where(i => string.Equals(tvdbId, i.GetProviderId(MetadataProviders.Tvdb), StringComparison.OrdinalIgnoreCase)) + .Select(i => i.Id) + .ToList(); + } + } + + private void AttachGameSoundtracks(IEnumerable allItems, List allAlbums, CancellationToken cancellationToken) + { + foreach (var game in allItems.OfType()) + { + cancellationToken.ThrowIfCancellationRequested(); + + var gamesdb = game.GetProviderId(MetadataProviders.Gamesdb); + + if (string.IsNullOrEmpty(gamesdb)) + { + game.SoundtrackIds = new List(); + continue; + } + + game.SoundtrackIds = allAlbums + .Where(i => string.Equals(gamesdb, i.GetProviderId(MetadataProviders.Gamesdb), StringComparison.OrdinalIgnoreCase)) + .Select(i => i.Id) + .ToList(); + } + } + + private void AttachAlbumLinks(List allItems, IEnumerable allAlbums, CancellationToken cancellationToken) + { + foreach (var album in allAlbums) + { + cancellationToken.ThrowIfCancellationRequested(); + + var tmdb = album.GetProviderId(MetadataProviders.Tmdb); + var tvdb = album.GetProviderId(MetadataProviders.Tvdb); + var gamesdb = album.GetProviderId(MetadataProviders.Gamesdb); + + if (string.IsNullOrEmpty(tmdb) && string.IsNullOrEmpty(tvdb) && string.IsNullOrEmpty(gamesdb)) + { + album.SoundtrackIds = new List(); + continue; + } + + album.SoundtrackIds = allItems. + Where(i => + { + if (!string.IsNullOrEmpty(tmdb) && string.Equals(tmdb, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase) && i is Movie) + { + return true; + } + if (!string.IsNullOrEmpty(tmdb) && string.Equals(tmdb, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase) && i is Trailer) + { + return true; + } + if (!string.IsNullOrEmpty(tvdb) && string.Equals(tvdb, i.GetProviderId(MetadataProviders.Tvdb), StringComparison.OrdinalIgnoreCase) && i is Series) + { + return true; + } + + return !string.IsNullOrEmpty(gamesdb) && string.Equals(gamesdb, i.GetProviderId(MetadataProviders.Gamesdb), StringComparison.OrdinalIgnoreCase) && i is Game; + }) + .Select(i => i.Id) + .ToList(); + } + } + } +} diff --git a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs index b36f7966b6..d90cb94c29 100644 --- a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs @@ -81,8 +81,7 @@ namespace MediaBrowser.Providers.Savers } XmlSaverHelpers.AddCommonNodes(item, builder); - XmlSaverHelpers.AddMediaInfo(episode, builder); - XmlSaverHelpers.AddChapters((Video)item, builder, _itemRepository); + XmlSaverHelpers.AddMediaInfo(episode, builder, _itemRepository); builder.Append(""); diff --git a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs index 154b4ab601..2402bcd7f5 100644 --- a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs @@ -97,9 +97,7 @@ namespace MediaBrowser.Providers.Savers var video = (Video)item; - XmlSaverHelpers.AddMediaInfo(video, builder); - - XmlSaverHelpers.AddChapters(video, builder, _itemRepository); + XmlSaverHelpers.AddMediaInfo(video, builder, _itemRepository); builder.Append(""); diff --git a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs index edeea611a3..0ec4df0918 100644 --- a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs @@ -451,9 +451,11 @@ namespace MediaBrowser.Providers.Savers /// /// The item. /// The builder. - public static void AddMediaInfo(T item, StringBuilder builder) + public static void AddMediaInfo(T item, StringBuilder builder, IItemRepository itemRepository) where T : BaseItem, IHasMediaStreams { + var video = item as Video; + builder.Append(""); foreach (var stream in item.MediaStreams) @@ -526,8 +528,6 @@ namespace MediaBrowser.Providers.Savers builder.Append("" + Convert.ToInt32(timespan.TotalSeconds).ToString(UsCulture) + ""); } - var video = item as Video; - if (video != null && video.Video3DFormat.HasValue) { switch (video.Video3DFormat.Value) @@ -552,6 +552,11 @@ namespace MediaBrowser.Providers.Savers } builder.Append(""); + + if (video != null) + { + AddChapters(video, builder, itemRepository); + } } } } diff --git a/MediaBrowser.Providers/TV/EpisodeXmlParser.cs b/MediaBrowser.Providers/TV/EpisodeXmlParser.cs index 7920273007..837c7f4b9a 100644 --- a/MediaBrowser.Providers/TV/EpisodeXmlParser.cs +++ b/MediaBrowser.Providers/TV/EpisodeXmlParser.cs @@ -49,7 +49,7 @@ namespace MediaBrowser.Providers.TV { case "Chapters": - _chaptersTask = FetchChaptersFromXmlNode(item, reader.ReadSubtree(), _itemRepo, CancellationToken.None); + //_chaptersTask = FetchChaptersFromXmlNode(item, reader.ReadSubtree(), _itemRepo, CancellationToken.None); break; case "Episode":