diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 90427de75d..ee562d8b49 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1577,6 +1577,11 @@ namespace MediaBrowser.Controller.Entities foreach (var newImage in images) { + if (newImage == null) + { + throw new ArgumentException("null image found in list"); + } + var existing = existingImages .FirstOrDefault(i => string.Equals(i.Path, newImage.FullName, StringComparison.OrdinalIgnoreCase)); diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 4c1aac7006..b3774cfe02 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Users; using System; using System.Collections.Generic; using System.IO; @@ -8,7 +9,6 @@ using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Users; namespace MediaBrowser.Controller.Entities.Movies { diff --git a/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs index 6fe9f88f04..cad08e6383 100644 --- a/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs @@ -19,11 +19,13 @@ namespace MediaBrowser.LocalMetadata.Savers { private readonly IItemRepository _itemRepository; private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public MovieXmlSaver(IItemRepository itemRepository, IServerConfigurationManager config) + public MovieXmlSaver(IItemRepository itemRepository, IServerConfigurationManager config, ILibraryManager libraryManager) { _itemRepository = itemRepository; _config = config; + _libraryManager = libraryManager; } public string Name @@ -52,6 +54,15 @@ namespace MediaBrowser.LocalMetadata.Savers // Check parent for null to avoid running this against things like video backdrops if (video != null && !(item is Episode) && !video.IsOwnedItem) { + // If it's a plain video, skip if content type is unset (unless editing) + if (video.GetType() == typeof(Video)) + { + if (updateType < ItemUpdateType.MetadataEdit && string.IsNullOrEmpty(_libraryManager.GetContentType(video))) + { + return false; + } + } + return updateType >= ItemUpdateType.MetadataDownload; } diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index ba5b6a122f..6c941e8048 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -32,6 +32,12 @@ namespace MediaBrowser.Model.Configuration /// true if [enable internet providers]; otherwise, false. public bool EnableInternetProviders { get; set; } + /// + /// Gets or sets a value indicating whether this instance is port authorized. + /// + /// true if this instance is port authorized; otherwise, false. + public bool IsPortAuthorized { get; set; } + /// /// Gets or sets the item by name path. /// diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index d88625396e..c12a1161ba 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -1,6 +1,4 @@ -using System.Net; -using System.Text; -using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Channels; @@ -10,7 +8,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Providers; -using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Channels; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -24,9 +21,10 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; +using System.Text; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Server.Implementations.Library; namespace MediaBrowser.Server.Implementations.Channels { @@ -1293,16 +1291,16 @@ namespace MediaBrowser.Server.Implementations.Channels } } - private async Task RefreshIfNeeded(BaseItem program, CancellationToken cancellationToken) + private readonly Task _cachedTask = Task.FromResult(true); + private Task RefreshIfNeeded(BaseItem program, CancellationToken cancellationToken) { - if (_refreshedItems.ContainsKey(program.Id)) + if (!_refreshedItems.ContainsKey(program.Id)) { - return; + _refreshedItems.TryAdd(program.Id, true); + return program.RefreshMetadata(cancellationToken); } - await program.RefreshMetadata(cancellationToken).ConfigureAwait(false); - - _refreshedItems.TryAdd(program.Id, true); + return _cachedTask; } internal IChannel GetChannelProvider(Channel channel) diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index ac742f04a0..96498563e6 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -309,16 +309,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv return Task.FromResult(true); } - private async Task RefreshIfNeeded(LiveTvProgram program, CancellationToken cancellationToken) + private readonly Task _cachedTask = Task.FromResult(true); + private Task RefreshIfNeeded(LiveTvProgram program, CancellationToken cancellationToken) { - if (_refreshedPrograms.ContainsKey(program.Id)) + if (!_refreshedPrograms.ContainsKey(program.Id)) { - return; + _refreshedPrograms.TryAdd(program.Id, true); + return program.RefreshMetadata(cancellationToken); } - _refreshedPrograms.TryAdd(program.Id, true); - - await program.RefreshMetadata(cancellationToken).ConfigureAwait(false); + return _cachedTask; } public async Task GetInternalRecording(string id, CancellationToken cancellationToken) diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index 02fdf9b938..aff6308463 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -294,7 +294,7 @@ "LabelNewProgram": "NEW", "LabelPremiereProgram": "PREMIERE", "LabelHDProgram": "HD", - "HeaderChangeFolderType": "Change Folder Type", + "HeaderChangeFolderType": "Change Content Type", "HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the folder with the new type.", "HeaderAlert": "Alert", "MessagePleaseRestart": "Please restart to finish updating.", @@ -627,7 +627,7 @@ "MessageInvitationSentToUser": "An email has been sent to {0}, inviting them to accept your sharing invitation.", "MessageInvitationSentToNewUser": "An email has been sent to {0} inviting them to sign up with Media Browser.", "HeaderConnectionFailure": "Connection Failure", - "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please try again later.", + "MessageUnableToConnectToServer": "We're unable to connect to the selected server right now. Please ensure it is running and try again.", "ButtonSelectServer": "Select server", "MessagePluginConfigurationRequiresLocalAccess": "To configure this plugin please sign in to your local server directly.", "MessageLoggedOutParentalControl": "Access is currently restricted. Please try again later.", diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index e07c9adb77..2d00f3c767 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -241,10 +241,12 @@ "VisitMediaBrowserWebsite": "Visit the Media Browser Web Site", "VisitMediaBrowserWebsiteLong": "Visit the Media Browser Web site to catch the latest news and keep up with the developer blog.", "OptionHideUser": "Hide this user from login screens", + "OptionHideUserFromLoginHelp": "Useful for private or hidden administrator accounts. The user will need to sign in manually by entering their username and password.", "OptionDisableUser": "Disable this user", "OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.", "HeaderAdvancedControl": "Advanced Control", "LabelName": "Name:", + "ButtonHelp": "Help", "OptionAllowUserToManageServer": "Allow this user to manage the server", "HeaderFeatureAccess": "Feature Access", "OptionAllowMediaPlayback": "Allow media playback", diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index 41f0a28060..bbdb89ac39 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -750,7 +750,14 @@ namespace MediaBrowser.Server.Startup.Common /// protected override void FindParts() { - if (IsFirstRun) + // TODO: Remove after next release + if (!IsFirstRun && !ServerConfigurationManager.Configuration.IsPortAuthorized) + { + ServerConfigurationManager.Configuration.IsPortAuthorized = true; + ConfigurationManager.SaveConfiguration(); + } + + if (!ServerConfigurationManager.Configuration.IsPortAuthorized) { RegisterServerWithAdministratorAccess(); } @@ -824,6 +831,9 @@ namespace MediaBrowser.Server.Startup.Common if (!HttpServer.UrlPrefixes.SequenceEqual(HttpServerUrlPrefixes, StringComparer.OrdinalIgnoreCase)) { + ServerConfigurationManager.Configuration.IsPortAuthorized = false; + ServerConfigurationManager.SaveConfiguration(); + NotifyPendingRestart(); } } diff --git a/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs index 583255891f..9bd9ac65ed 100644 --- a/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.XbmcMetadata.Savers return false; } - return item is MusicAlbum && updateType >= ItemUpdateType.ImageUpdate; + return item is MusicAlbum && updateType >= MinimumUpdateType; } protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) diff --git a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs index 1ef0304fe2..c592ec4b7e 100644 --- a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs @@ -36,7 +36,7 @@ namespace MediaBrowser.XbmcMetadata.Savers return false; } - return item is MusicArtist && updateType >= ItemUpdateType.ImageUpdate; + return item is MusicArtist && updateType >= MinimumUpdateType; } protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs index 0f1d53ea63..da5126676e 100644 --- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs @@ -119,6 +119,19 @@ namespace MediaBrowser.XbmcMetadata.Savers protected IUserDataManager UserDataManager { get; private set; } protected ILogger Logger { get; private set; } + protected ItemUpdateType MinimumUpdateType + { + get + { + if (ConfigurationManager.GetNfoConfiguration().SaveImagePathsInNfo) + { + return ItemUpdateType.ImageUpdate; + } + + return ItemUpdateType.MetadataDownload; + } + } + public string Name { get diff --git a/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs index 090d41015d..6fd396e40f 100644 --- a/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs @@ -35,7 +35,7 @@ namespace MediaBrowser.XbmcMetadata.Savers return false; } - return item is Episode && updateType >= ItemUpdateType.ImageUpdate; + return item is Episode && updateType >= MinimumUpdateType; } protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) diff --git a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs index bfb2b916ec..d049843f35 100644 --- a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs @@ -55,7 +55,15 @@ namespace MediaBrowser.XbmcMetadata.Savers // Check parent for null to avoid running this against things like video backdrops if (video != null && !(item is Episode) && !video.IsOwnedItem) { - return updateType >= ItemUpdateType.ImageUpdate; + // If it's a plain video, skip if content type is unset (unless editing) + if (video.GetType() == typeof (Video)) + { + if (updateType < ItemUpdateType.MetadataEdit && string.IsNullOrEmpty(LibraryManager.GetContentType(video))) + { + return false; + } + } + return updateType >= MinimumUpdateType; } return false; @@ -95,8 +103,6 @@ namespace MediaBrowser.XbmcMetadata.Savers } } - private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); - protected override List GetTagsUsed() { var list = new List diff --git a/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs index 99a53fd9e2..49ace77020 100644 --- a/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs @@ -39,7 +39,7 @@ namespace MediaBrowser.XbmcMetadata.Savers return false; } - return updateType >= ItemUpdateType.ImageUpdate || (updateType >= ItemUpdateType.MetadataImport && File.Exists(GetSavePath(item))); + return updateType >= MinimumUpdateType || (updateType >= ItemUpdateType.MetadataImport && File.Exists(GetSavePath(item))); } protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) diff --git a/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs index 0498919aee..099e8dbd7f 100644 --- a/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs @@ -35,7 +35,7 @@ namespace MediaBrowser.XbmcMetadata.Savers return false; } - return item is Series && updateType >= ItemUpdateType.ImageUpdate; + return item is Series && updateType >= MinimumUpdateType; } protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer)