From d78c378452df2ce75c7208fe7ba919ab54455448 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 24 Apr 2013 12:03:10 -0400 Subject: added theme song support --- MediaBrowser.Controller/Entities/BaseItem.cs | 85 ++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) (limited to 'MediaBrowser.Controller') diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 7bcd3db912..c478151b49 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -35,6 +35,7 @@ namespace MediaBrowser.Controller.Entities /// The trailer folder name /// public const string TrailerFolderName = "trailers"; + public const string ThemeSongsFolderName = "theme-music"; /// /// Gets or sets the name. @@ -656,6 +657,28 @@ namespace MediaBrowser.Controller.Entities } } + private List _themeSongs; + private bool _themeSongsInitialized; + private object _themeSongsSyncLock = new object(); + [IgnoreDataMember] + public List ThemeSongs + { + get + { + LazyInitializer.EnsureInitialized(ref _themeSongs, ref _themeSongsInitialized, ref _themeSongsSyncLock, LoadThemeSongs); + return _themeSongs; + } + private set + { + _themeSongs = value; + + if (value == null) + { + _themeSongsInitialized = false; + } + } + } + /// /// Loads local trailers from the file system /// @@ -714,6 +737,64 @@ namespace MediaBrowser.Controller.Entities }).ToList(); } + /// + /// Loads the theme songs. + /// + /// List{Audio.Audio}. + private List LoadThemeSongs() + { + ItemResolveArgs resolveArgs; + + try + { + resolveArgs = ResolveArgs; + } + catch (IOException ex) + { + Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path); + return new List(); + } + + if (!resolveArgs.IsDirectory) + { + return new List(); + } + + var folder = resolveArgs.GetFileSystemEntryByName(ThemeSongsFolderName); + + // Path doesn't exist. No biggie + if (folder == null) + { + return new List(); + } + + IEnumerable files; + + try + { + files = FileSystem.GetFiles(folder.Value.Path); + } + catch (IOException ex) + { + Logger.ErrorException("Error loading theme songs for {0}", ex, Name); + return new List(); + } + + 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; + + if (dbItem != null) + { + dbItem.ResolveArgs = audio.ResolveArgs; + audio = dbItem; + } + + return audio; + }).ToList(); + } + /// /// Overrides the base implementation to refresh metadata for local trailers /// @@ -732,6 +813,7 @@ namespace MediaBrowser.Controller.Entities // Lazy load these again LocalTrailers = null; + ThemeSongs = null; // Refresh for the item var itemRefreshTask = ProviderManager.ExecuteMetadataProviders(this, cancellationToken, forceRefresh, allowSlowProviders); @@ -741,10 +823,13 @@ namespace MediaBrowser.Controller.Entities // Refresh metadata for local trailers var trailerTasks = LocalTrailers.Select(i => i.RefreshMetadata(cancellationToken, forceSave, forceRefresh, allowSlowProviders)); + var themeSongTasks = ThemeSongs.Select(i => i.RefreshMetadata(cancellationToken, forceSave, forceRefresh, allowSlowProviders)); + cancellationToken.ThrowIfCancellationRequested(); // Await the trailer tasks await Task.WhenAll(trailerTasks).ConfigureAwait(false); + await Task.WhenAll(themeSongTasks).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); -- cgit v1.2.3