diff options
4 files changed, 34 insertions, 42 deletions
diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Configuration/PluginConfiguration.cs b/MediaBrowser.Providers/Plugins/Tmdb/Configuration/PluginConfiguration.cs index 0ebeebf1e2..b3a67189bb 100644 --- a/MediaBrowser.Providers/Plugins/Tmdb/Configuration/PluginConfiguration.cs +++ b/MediaBrowser.Providers/Plugins/Tmdb/Configuration/PluginConfiguration.cs @@ -58,12 +58,12 @@ namespace MediaBrowser.Providers.Plugins.Tmdb /// <summary> /// Gets or sets the ids (the "N" formatted GUIDs from <c>VirtualFolderInfo.ItemId</c>) of the - /// libraries for which the unaired/missing episode provider is disabled. Whether episodes are - /// imported at all, and how, is still controlled by the global toggles above; this list only - /// opts individual libraries out. Libraries not listed here are enabled, so the global toggles - /// apply to every library unless it is explicitly opted out. + /// libraries for which the unaired/missing episode provider is enabled. Whether episodes are + /// imported at all, and how, is still controlled by the global toggles above; those toggles only + /// apply to the libraries listed here. Libraries not listed, including newly added ones, are + /// never processed, so an empty list disables the feature entirely. /// </summary> - public string[] DisabledMissingEpisodeLibraries { get; set; } = []; + public string[] EnabledMissingEpisodeLibraries { get; set; } = []; /// <summary> /// Gets or sets how often, in days, the scheduled task re-checks TMDb for newly announced diff --git a/MediaBrowser.Providers/Plugins/Tmdb/Configuration/config.html b/MediaBrowser.Providers/Plugins/Tmdb/Configuration/config.html index b010749936..582753759f 100644 --- a/MediaBrowser.Providers/Plugins/Tmdb/Configuration/config.html +++ b/MediaBrowser.Providers/Plugins/Tmdb/Configuration/config.html @@ -56,7 +56,7 @@ </div> <div class="verticalSection"> <h2>Libraries</h2> - <div class="fieldDescription" style="margin-bottom:1em;">Choose which TV libraries the unaired/missing episode options above apply to. The settings above are global; this only controls which libraries they run for. New libraries are enabled by default.</div> + <div class="fieldDescription" style="margin-bottom:1em;">Choose which TV libraries the unaired/missing episode options above apply to. The settings above are global; this only controls which libraries they run for. Libraries are opted in individually, so newly added libraries are not processed until they are enabled here.</div> <div id="missingEpisodeLibraries"></div> </div> <div class="verticalSection"> @@ -119,7 +119,7 @@ Dashboard.showLoadingMsg(); var clientConfig, pluginConfig; - var populateMissingEpisodeLibraries = function (disabledLibraries) { + var populateMissingEpisodeLibraries = function (enabledLibraries) { var container = document.querySelector('#missingEpisodeLibraries'); ApiClient.getVirtualFolders().then(function (folders) { // Series only live in TV libraries (and mixed-content libraries, which report @@ -134,7 +134,7 @@ } container.innerHTML = tvLibraries.map(function (folder) { - var checked = disabledLibraries.indexOf(folder.ItemId) === -1 ? ' checked' : ''; + var checked = enabledLibraries.indexOf(folder.ItemId) === -1 ? '' : ' checked'; return '<label class="checkboxContainer">' + '<input is="emby-checkbox" type="checkbox" class="missingEpisodeLibrary" data-library-id="' + folder.ItemId + '"' + checked + ' />' + '<span>' + folder.Name + '</span>' @@ -216,7 +216,7 @@ document.querySelector('#hideMissingCastMembers').checked = config.HideMissingCastMembers; document.querySelector('#hideMissingCrewMembers').checked = config.HideMissingCrewMembers; - populateMissingEpisodeLibraries(config.DisabledMissingEpisodeLibraries || []); + populateMissingEpisodeLibraries(config.EnabledMissingEpisodeLibraries || []); var maxCastMembers = document.querySelector('#maxCastMembers'); maxCastMembers.value = config.MaxCastMembers; @@ -258,9 +258,12 @@ config.ImportSpecials = document.querySelector('#importSpecials').checked; config.MissingEpisodeRefreshIntervalDays = parseInt(document.querySelector('#missingEpisodeRefreshIntervalDays').value, 10); config.UpcomingEpisodeGracePeriodDays = parseInt(document.querySelector('#upcomingEpisodeGracePeriodDays').value, 10); - config.DisabledMissingEpisodeLibraries = Array.prototype.map.call( - document.querySelectorAll('.missingEpisodeLibrary:not(:checked)'), - function (checkbox) { return checkbox.getAttribute('data-library-id'); }); + var libraryCheckboxes = document.querySelectorAll('.missingEpisodeLibrary'); + if (libraryCheckboxes.length > 0) { + config.EnabledMissingEpisodeLibraries = Array.prototype.filter + .call(libraryCheckboxes, function (checkbox) { return checkbox.checked; }) + .map(function (checkbox) { return checkbox.getAttribute('data-library-id'); }); + } config.MaxCastMembers = document.querySelector('#maxCastMembers').value; config.MaxCrewMembers = document.querySelector('#maxCrewMembers').value; config.HideMissingCastMembers = document.querySelector('#hideMissingCastMembers').checked; diff --git a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbMissingEpisodeProvider.cs b/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbMissingEpisodeProvider.cs index a0a5e8fdf8..b44361e4e7 100644 --- a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbMissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbMissingEpisodeProvider.cs @@ -75,8 +75,8 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV var importMissing = (configuration?.ImportMissingEpisodes).GetValueOrDefault(); // The provider is inactive for this series when both global imports are off, or the series' - // library has been opted out. In either case remove every virtual episode (unaired and missing - // alike) it previously created, so disabling the feature cleans up on the next library scan. + // library has not been opted in. In either case remove every virtual episode (unaired and + // missing alike) it previously created, so disabling the feature cleans up on the next scan. if ((!importUnaired && !importMissing) || !IsEnabledForLibrary(item)) { if (!PruneAllVirtualEpisodes(item)) @@ -352,22 +352,16 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV private bool IsEnabledForLibrary(BaseItem item) { - var disabledLibraries = Plugin.Instance?.Configuration.DisabledMissingEpisodeLibraries; - if (disabledLibraries is null || disabledLibraries.Length == 0) + var enabledLibraries = Plugin.Instance?.Configuration.EnabledMissingEpisodeLibraries; + if (enabledLibraries is null || enabledLibraries.Length == 0) { - return true; - } - - // A series can live under more than one collection folder; treat it as disabled only when - // every containing library is opted out. - var collectionFolders = _libraryManager.GetCollectionFolders(item); - if (collectionFolders.Count == 0) - { - return true; + return false; } - return collectionFolders.Any(folder => - !disabledLibraries.Contains(folder.Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase)); + // A series can live under more than one collection folder; opting in any one of them is + // enough. An item that belongs to no collection folder cannot be opted in at all. + return _libraryManager.GetCollectionFolders(item).Any(folder => + enabledLibraries.Contains(folder.Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase)); } private (HashSet<(int Season, int Episode)> Keys, Dictionary<(int Season, int Episode), Episode> Updatable) GetExistingEpisodes(Series series, bool pruneAgedOut, DateTime today, int gracePeriodDays, bool importSpecials, out bool pruned) diff --git a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbUpcomingEpisodesTask.cs b/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbUpcomingEpisodesTask.cs index bb8c9bdcf2..e2846c74a3 100644 --- a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbUpcomingEpisodesTask.cs +++ b/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbUpcomingEpisodesTask.cs @@ -85,14 +85,15 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV // The feature is fully disabled: remove every virtual episode (and now-empty virtual season) // this provider previously created, across all libraries, then stop. - if (!configuration.ImportUnairedEpisodes && !configuration.ImportMissingEpisodes) + if ((!configuration.ImportUnairedEpisodes && !configuration.ImportMissingEpisodes) + || configuration.EnabledMissingEpisodeLibraries.Length == 0) { RemoveAllVirtualItems(progress, cancellationToken); return; } // Process non-ended series (they may have gained episodes) plus any series in a library that - // has been opted out (regardless of status) so the provider can prune the virtual episodes it + // is not opted in (regardless of status) so the provider can prune the virtual episodes it // previously created there. Ended series in enabled libraries cannot change, so they're skipped. var series = _libraryManager.GetItemList(new InternalItemsQuery { @@ -142,22 +143,16 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV private bool IsEnabledForLibrary(BaseItem item) { - var disabledLibraries = Plugin.Instance?.Configuration.DisabledMissingEpisodeLibraries; - if (disabledLibraries is null || disabledLibraries.Length == 0) + var enabledLibraries = Plugin.Instance?.Configuration.EnabledMissingEpisodeLibraries; + if (enabledLibraries is null || enabledLibraries.Length == 0) { - return true; + return false; } - // A series can live under more than one collection folder; treat it as disabled only when - // every containing library is opted out. - var collectionFolders = _libraryManager.GetCollectionFolders(item); - if (collectionFolders.Count == 0) - { - return true; - } - - return collectionFolders.Any(folder => - !disabledLibraries.Contains(folder.Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase)); + // A series can live under more than one collection folder; opting in any one of them is + // enough. An item that belongs to no collection folder cannot be opted in at all. + return _libraryManager.GetCollectionFolders(item).Any(folder => + enabledLibraries.Contains(folder.Id.ToString("N", CultureInfo.InvariantCulture), StringComparer.OrdinalIgnoreCase)); } /// <summary> |
