diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index f6b1194bd..f8ecf003b 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -797,7 +797,7 @@ namespace MediaBrowser.Controller.Entities } }); - await ((Folder)child).ValidateChildren(innerProgress, cancellationToken, recursive).ConfigureAwait(false); + await ((Folder)child).ValidateChildren(innerProgress, cancellationToken, recursive, forceRefreshMetadata).ConfigureAwait(false); } else { diff --git a/MediaBrowser.Controller/Library/IMetadataSaver.cs b/MediaBrowser.Controller/Library/IMetadataSaver.cs index 86e2738af..15671af4d 100644 --- a/MediaBrowser.Controller/Library/IMetadataSaver.cs +++ b/MediaBrowser.Controller/Library/IMetadataSaver.cs @@ -9,11 +9,12 @@ namespace MediaBrowser.Controller.Library public interface IMetadataSaver { /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - bool Supports(BaseItem item); + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + bool IsEnabledFor(BaseItem item, ItemUpdateType updateType); /// /// Gets the save path. diff --git a/MediaBrowser.Controller/Library/ItemUpdateType.cs b/MediaBrowser.Controller/Library/ItemUpdateType.cs index 56ae2cbbd..31a00d7b4 100644 --- a/MediaBrowser.Controller/Library/ItemUpdateType.cs +++ b/MediaBrowser.Controller/Library/ItemUpdateType.cs @@ -8,6 +8,7 @@ namespace MediaBrowser.Controller.Library Unspecified = 1, MetadataImport = 2, ImageUpdate = 4, + MetadataDownload = 8, MetadataEdit = 16 } } diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index 1c7e667a2..a4a022af0 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -706,7 +706,7 @@ namespace MediaBrowser.Controller.Providers if (!string.IsNullOrWhiteSpace(tag)) { - item.AddTagline(tag); + item.AddTag(tag); } break; } diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index e415c6859..4f0876497 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -77,7 +77,7 @@ namespace MediaBrowser.Controller.Providers public virtual ItemUpdateType ItemUpdateType { - get { return RequiresInternet ? ItemUpdateType.MetadataEdit : ItemUpdateType.MetadataImport; } + get { return RequiresInternet ? ItemUpdateType.MetadataDownload : ItemUpdateType.MetadataImport; } } /// diff --git a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs index b5c11acb1..8cc1e9a3d 100644 --- a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs +++ b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs @@ -71,7 +71,7 @@ namespace MediaBrowser.Providers.Movies { get { - return ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataEdit; + return ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataDownload; } } diff --git a/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs b/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs index 76e4c45d0..3848f68bf 100644 --- a/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs @@ -21,20 +21,18 @@ namespace MediaBrowser.Providers.Savers } /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; - } - - if (item is MusicAlbum) - { - return _config.Configuration.SaveLocalMeta; + return item is MusicAlbum; } return false; diff --git a/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs b/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs index a84575b19..6da2bf901 100644 --- a/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs @@ -21,23 +21,34 @@ namespace MediaBrowser.Providers.Savers } /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; + if (item is MusicArtist) + { + return true; + } } - if (item is MusicArtist) + // If new metadata has been downloaded or metadata was manually edited, proceed + if ((updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return _config.Configuration.SaveLocalMeta; + if (item is Artist) + { + return true; + } } - return item is Artist; + return false; } /// diff --git a/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs b/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs index 9fa38d4e5..5f8d207f2 100644 --- a/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs @@ -19,23 +19,21 @@ namespace MediaBrowser.Providers.Savers } /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; + return item is BoxSet; } - if (!_config.Configuration.SaveLocalMeta) - { - return false; - } - - return item is BoxSet; + return false; } /// diff --git a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs index d17325c85..778c59c20 100644 --- a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; -using MediaBrowser.Model.Entities; using MediaBrowser.Providers.TV; using System; using System.Globalization; @@ -16,20 +15,23 @@ namespace MediaBrowser.Providers.Savers public class EpisodeXmlSaver : IMetadataSaver { private readonly IServerConfigurationManager _config; - + /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (!_config.Configuration.SaveLocalMeta || item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; + return item is Episode; } - return item is Episode; + return false; } private readonly CultureInfo _usCulture = new CultureInfo("en-US"); diff --git a/MediaBrowser.Providers/Savers/FolderXmlSaver.cs b/MediaBrowser.Providers/Savers/FolderXmlSaver.cs index 19193d57c..885cff674 100644 --- a/MediaBrowser.Providers/Savers/FolderXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/FolderXmlSaver.cs @@ -21,34 +21,40 @@ namespace MediaBrowser.Providers.Savers } /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (item.LocationType != LocationType.FileSystem) - { - return false; - } - if (!(item is Folder)) { return false; } - // For these we can proceed even if save local metadata is off - if (item is AggregateFolder || item is UserRootFolder || item is CollectionFolder) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return true; - } - - if (!_config.Configuration.SaveLocalMeta) - { - return false; + if (!(item is Series) && !(item is BoxSet) && !(item is MusicArtist) && !(item is MusicAlbum) && + !(item is Season)) + { + return true; + } } - return !(item is Series) && !(item is BoxSet) && !(item is MusicArtist) && !(item is MusicAlbum) && !(item is Season); + // If new metadata has been downloaded or metadata was manually edited, proceed + if ((updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) + { + if (item is AggregateFolder || item is UserRootFolder || item is CollectionFolder) + { + return true; + } + } + + return false; } /// diff --git a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs index c180c2267..e4850e1cb 100644 --- a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs @@ -24,26 +24,29 @@ namespace MediaBrowser.Providers.Savers } /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (!_config.Configuration.SaveLocalMeta || item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; + var trailer = item as Trailer; + + // Don't support local trailers + if (trailer != null) + { + return !trailer.IsLocalTrailer; + } + + return item is Movie || item is MusicVideo; } - var trailer = item as Trailer; - - if (trailer != null) - { - return !trailer.IsLocalTrailer; - } - - // Don't support local trailers - return item is Movie || item is MusicVideo; + return false; } /// diff --git a/MediaBrowser.Providers/Savers/PersonXmlSaver.cs b/MediaBrowser.Providers/Savers/PersonXmlSaver.cs index 349b5e1a9..53bb32fef 100644 --- a/MediaBrowser.Providers/Savers/PersonXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/PersonXmlSaver.cs @@ -15,18 +15,21 @@ namespace MediaBrowser.Providers.Savers public class PersonXmlSaver : IMetadataSaver { /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded or metadata was manually edited, proceed + if ((updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; + return item is Person; } - return item is Person; + return false; } /// diff --git a/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs b/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs index d0e19dcc5..429275537 100644 --- a/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs @@ -19,23 +19,21 @@ namespace MediaBrowser.Providers.Savers } /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; + return item is Season; } - if (!_config.Configuration.SaveLocalMeta) - { - return false; - } - - return item is Season; + return false; } /// diff --git a/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs b/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs index 535540d00..2affbd91f 100644 --- a/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs @@ -1,14 +1,14 @@ -using System; -using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; +using MediaBrowser.Providers.TV; +using System; using System.IO; using System.Security; using System.Text; using System.Threading; -using MediaBrowser.Providers.TV; namespace MediaBrowser.Providers.Savers { @@ -22,18 +22,21 @@ namespace MediaBrowser.Providers.Savers } /// - /// Supportses the specified item. + /// Determines whether [is enabled for] [the specified item]. /// /// The item. - /// true if XXXX, false otherwise - public bool Supports(BaseItem item) + /// Type of the update. + /// true if [is enabled for] [the specified item]; otherwise, false. + public bool IsEnabledFor(BaseItem item, ItemUpdateType updateType) { - if (!_config.Configuration.SaveLocalMeta || item.LocationType != LocationType.FileSystem) + // If new metadata has been downloaded and save local is on, OR metadata was manually edited, proceed + if ((_config.Configuration.SaveLocalMeta && (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload) + || (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) { - return false; + return item is Series; } - return item is Series; + return false; } /// diff --git a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs index a3d44a032..ddc7c8e7d 100644 --- a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs @@ -65,7 +65,7 @@ namespace MediaBrowser.Providers.TV { get { - return ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataEdit; + return ItemUpdateType.ImageUpdate | ItemUpdateType.MetadataDownload; } } @@ -358,14 +358,6 @@ namespace MediaBrowser.Providers.TV } } } - if (ConfigurationManager.Configuration.SaveLocalMeta) - { - //if (!Directory.Exists(episode.MetaLocation)) Directory.CreateDirectory(episode.MetaLocation); - //var ms = new MemoryStream(); - //doc.Save(ms); - - //await _providerManager.SaveToLibraryFilesystem(episode, Path.Combine(episode.MetaLocation, Path.GetFileNameWithoutExtension(episode.Path) + ".xml"), ms, cancellationToken).ConfigureAwait(false); - } return status; } diff --git a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs index e66f21154..fc37912ef 100644 --- a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs @@ -258,6 +258,7 @@ namespace MediaBrowser.Providers.TV seriesDoc.Load(seriesXmlPath); FetchMainInfo(series, seriesDoc); + if (!series.LockedFields.Contains(MetadataFields.Cast)) { var actorsDoc = new XmlDocument(); @@ -424,18 +425,6 @@ namespace MediaBrowser.Providers.TV /// Task. private void FetchActors(Series series, XmlDocument actorsDoc, XmlDocument seriesDoc) { - XmlNode actorsNode = null; - if (ConfigurationManager.Configuration.SaveLocalMeta) - { - //add to the main seriesDoc for saving - var seriesNode = seriesDoc.SelectSingleNode("//Series"); - if (seriesNode != null) - { - actorsNode = seriesDoc.CreateNode(XmlNodeType.Element, "Persons", null); - seriesNode.AppendChild(actorsNode); - } - } - var xmlNodeList = actorsDoc.SelectNodes("Actors/Actor"); if (xmlNodeList != null) @@ -450,20 +439,6 @@ namespace MediaBrowser.Providers.TV { // Sometimes tvdb actors have leading spaces series.AddPerson(new PersonInfo { Type = PersonType.Actor, Name = actorName.Trim(), Role = actorRole }); - - if (ConfigurationManager.Configuration.SaveLocalMeta && actorsNode != null) - { - //create in main seriesDoc - var personNode = seriesDoc.CreateNode(XmlNodeType.Element, "Person", null); - foreach (XmlNode subNode in p.ChildNodes) - personNode.AppendChild(seriesDoc.ImportNode(subNode, true)); - //need to add the type - var typeNode = seriesDoc.CreateNode(XmlNodeType.Element, "Type", null); - typeNode.InnerText = PersonType.Actor; - personNode.AppendChild(typeNode); - actorsNode.AppendChild(personNode); - } - } } } diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 53d25af41..762be2e9e 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -347,7 +347,7 @@ namespace MediaBrowser.Server.Implementations.Library try { - await UpdateItem(season, ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + await UpdateItem(season, ItemUpdateType.MetadataDownload, cancellationToken).ConfigureAwait(false); } catch (Exception ex) { @@ -1311,10 +1311,9 @@ namespace MediaBrowser.Server.Implementations.Library UpdateItemInLibraryCache(item); - // If metadata was downloaded or edited, save external metadata - if ((updateReason & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit) + if (item.LocationType == LocationType.FileSystem) { - await SaveMetadata(item).ConfigureAwait(false); + await SaveMetadata(item, updateReason).ConfigureAwait(false); } if (ItemUpdated != null) @@ -1365,10 +1364,11 @@ namespace MediaBrowser.Server.Implementations.Library /// Saves the metadata. /// /// The item. + /// Type of the update. /// Task. - private async Task SaveMetadata(BaseItem item) + private async Task SaveMetadata(BaseItem item, ItemUpdateType updateType) { - foreach (var saver in _savers.Where(i => i.Supports(item))) + foreach (var saver in _savers.Where(i => i.IsEnabledFor(item, updateType))) { var path = saver.GetSavePath(item); diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index e805b5856..1cf126ee1 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.131 + 3.0.132 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 cc9496611..b5ed06529 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.131 + 3.0.132 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 9612e481c..935e03156 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.131 + 3.0.132 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 - +