public List <TagDetails> Details() { var tags = All(); var delayProfiles = _delayProfileService.All(); var importLists = _importListFactory.All(); var notifications = _notificationFactory.All(); var restrictions = _restrictionService.All(); var movies = _movieService.AllMovieTags(); var indexers = _indexerService.All(); var details = new List <TagDetails>(); foreach (var tag in tags) { details.Add(new TagDetails { Id = tag.Id, Label = tag.Label, DelayProfileIds = delayProfiles.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), ImportListIds = importLists.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), NotificationIds = notifications.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), RestrictionIds = restrictions.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), MovieIds = movies.Where(c => c.Value.Contains(tag.Id)).Select(c => c.Key).ToList(), IndexerIds = indexers.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList() }); } return(details); }
private void ResolveIndexer(ReleaseInfo release) { if (release.IndexerId == 0 && release.Indexer.IsNotNullOrWhiteSpace()) { var indexer = _indexerFactory.All().FirstOrDefault(v => v.Name == release.Indexer); if (indexer != null) { release.IndexerId = indexer.Id; _logger.Debug("Push Release {0} associated with indexer {1} - {2}.", release.Title, release.IndexerId, release.Indexer); } else { _logger.Debug("Push Release {0} not associated with unknown indexer {1}.", release.Title, release.Indexer); } } else if (release.IndexerId != 0 && release.Indexer.IsNullOrWhiteSpace()) { try { var indexer = _indexerFactory.Get(release.IndexerId); release.Indexer = indexer.Name; _logger.Debug("Push Release {0} associated with indexer {1} - {2}.", release.Title, release.IndexerId, release.Indexer); } catch (ModelNotFoundException) { _logger.Debug("Push Release {0} not associated with unknown indexer {0}.", release.Title, release.IndexerId); release.IndexerId = 0; } } else { _logger.Debug("Push Release {0} not associated with an indexer.", release.Title); } }
public void Delete(int id) { if (_indexerFactory.All().Any(c => c.AppProfileId == id) || All().Count == 1) { throw new ProfileInUseException(id); } _profileRepository.Delete(id); }
public override HealthCheck Check() { var ptpIndexers = _indexerFactory.All().Where(i => i.Settings.GetType() == typeof(PassThePopcornSettings)); var ptpIndexerOldSettings = ptpIndexers .Where(i => (i.Settings as PassThePopcornSettings).APIUser.IsNullOrWhiteSpace()).Select(i => i.Name); if (ptpIndexerOldSettings.Any()) { return(new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format(_localizationService.GetLocalizedString("PtpOldSettingsCheckMessage"), string.Join(", ", ptpIndexerOldSettings)))); } return(new HealthCheck(GetType())); }
public override HealthCheck Check() { var ptpIndexers = _indexerFactory.All().Where(i => i.Settings.GetType() == typeof(PassThePopcornSettings)); var ptpIndexerOldSettings = ptpIndexers .Where(i => (i.Settings as PassThePopcornSettings).APIUser.IsNullOrWhiteSpace()).Select(i => i.Name); if (ptpIndexerOldSettings.Count() > 0) { return(new HealthCheck(GetType(), HealthCheckResult.Warning, $"The following PassThePopcorn indexers have deprecated settings and should be updated: {string.Join(",", ptpIndexerOldSettings)}")); } return(new HealthCheck(GetType())); }
public IActionResult SaveAll(IndexerEditorResource resource) { var indexersToUpdate = _indexerService.AllProviders(false).Select(x => (IndexerDefinition)x.Definition).Where(d => resource.IndexerIds.Contains(d.Id)); foreach (var indexer in indexersToUpdate) { if (resource.Enable.IsNotNullOrWhiteSpace()) { indexer.Enable = bool.Parse(resource.Enable); } if (resource.AppProfileId.HasValue) { indexer.AppProfileId = resource.AppProfileId.Value; } if (resource.Tags != null) { var newTags = resource.Tags; var applyTags = resource.ApplyTags; switch (applyTags) { case ApplyTags.Add: newTags.ForEach(t => indexer.Tags.Add(t)); break; case ApplyTags.Remove: newTags.ForEach(t => indexer.Tags.Remove(t)); break; case ApplyTags.Replace: indexer.Tags = new HashSet <int>(newTags); break; } } } _indexerService.Update(indexersToUpdate); var indexers = _indexerService.All(); foreach (var definition in indexers) { _indexerService.SetProviderCharacteristics(definition); } return(Accepted(_resourceMapper.ToResource(indexers))); }
public override HealthCheck Check() { var jackettAllProviders = _providerFactory.All().Where( i => i.ConfigContract.Equals("TorznabSettings") && ((i.Settings as TorznabSettings).BaseUrl.Contains("/torznab/all/api", StringComparison.InvariantCultureIgnoreCase) || (i.Settings as TorznabSettings).BaseUrl.Contains("/api/v2.0/indexers/all/results/torznab", StringComparison.InvariantCultureIgnoreCase) || (i.Settings as TorznabSettings).ApiPath.Contains("/torznab/all/api", StringComparison.InvariantCultureIgnoreCase) || (i.Settings as TorznabSettings).ApiPath.Contains("/api/v2.0/indexers/all/results/torznab", StringComparison.InvariantCultureIgnoreCase))); if (jackettAllProviders.Empty()) { return(new HealthCheck(GetType())); } return(new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format(_localizationService.GetLocalizedString("IndexerJackettAll"), string.Join(", ", jackettAllProviders.Select(i => i.Name))), "#jackett-all-endpoint-used")); }
public override HealthCheck Check() { var jackettAllProviders = _providerFactory.All().Where( i => i.ConfigContract.Equals("TorznabSettings") && ((i.Settings as TorznabSettings).BaseUrl.Contains("/torznab/all/api") || (i.Settings as TorznabSettings).BaseUrl.Contains("/api/v2.0/indexers/all/results/torznab") || (i.Settings as TorznabSettings).ApiPath.Contains("/torznab/all/api") || (i.Settings as TorznabSettings).ApiPath.Contains("/api/v2.0/indexers/all/results/torznab"))); if (jackettAllProviders.Empty()) { return(new HealthCheck(GetType())); } return(new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format("Indexers using the unsupported Jackett 'all' endpoint: {0}", string.Join(", ", jackettAllProviders.Select(i => i.Name))), "#jackett-all-endpoint-used")); }
public void Clean() { //TODO: We should remove this before merging it into develop _logger.Debug("Updating Anime Categories for newznab indexers"); var indexers = _indexerFactory.All().Where(i => i.Implementation == typeof(Newznab).Name); foreach (var indexer in indexers) { var settings = indexer.Settings as NewznabSettings; if (settings.Url.ContainsIgnoreCase("nzbs.org") && settings.Categories.Contains(NZBS_ORG_ANIME_ID)) { var animeCategories = new List <int>(settings.AnimeCategories); animeCategories.Add(NZBS_ORG_ANIME_ID); settings.AnimeCategories = animeCategories; settings.Categories = settings.Categories.Where(c => c != NZBS_ORG_ANIME_ID); indexer.Settings = settings; _indexerFactory.Update(indexer); } else if (settings.Categories.Contains(NEWZNAB_ANIME_ID)) { var animeCategories = new List <int>(settings.AnimeCategories); animeCategories.Add(NEWZNAB_ANIME_ID); settings.AnimeCategories = animeCategories; settings.Categories = settings.Categories.Where(c => c != NEWZNAB_ANIME_ID); indexer.Settings = settings; _indexerFactory.Update(indexer); } } }
public List <TagDetails> Details() { var tags = All(); var notifications = _notificationFactory.All(); var indexers = _indexerFactory.All(); var indexerProxies = _indexerProxyFactory.All(); var details = new List <TagDetails>(); foreach (var tag in tags) { details.Add(new TagDetails { Id = tag.Id, Label = tag.Label, NotificationIds = notifications.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), IndexerIds = indexers.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList(), IndexerProxyIds = indexerProxies.Where(c => c.Tags.Contains(tag.Id)).Select(c => c.Id).ToList() }); } return(details); }
private void SyncIndexers(List <IApplication> applications, List <IndexerDefinition> indexers, bool removeRemote = false) { foreach (var app in applications) { var indexerMappings = _appIndexerMapService.GetMappingsForApp(app.Definition.Id); //Get Dictionary of Remote Indexers point to Prowlarr and what they are mapped to var remoteMappings = ExecuteAction(a => a.GetIndexerMappings(), app); if (remoteMappings == null) { continue; } //Add mappings if not already in db, these were setup manually in the app or orphaned by a table wipe foreach (var mapping in remoteMappings) { if (!indexerMappings.Any(m => (m.RemoteIndexerId > 0 && m.RemoteIndexerId == mapping.RemoteIndexerId) || (m.RemoteIndexerName.IsNotNullOrWhiteSpace() && m.RemoteIndexerName == mapping.RemoteIndexerName))) { var addMapping = new AppIndexerMap { AppId = app.Definition.Id, RemoteIndexerId = mapping.RemoteIndexerId, RemoteIndexerName = mapping.RemoteIndexerName, IndexerId = mapping.IndexerId }; _appIndexerMapService.Insert(addMapping); indexerMappings.Add(addMapping); } } foreach (var indexer in indexers) { var definition = indexer; if (indexerMappings.Any(x => x.IndexerId == definition.Id)) { if (((ApplicationDefinition)app.Definition).SyncLevel == ApplicationSyncLevel.FullSync) { ExecuteAction(a => a.UpdateIndexer(definition), app); } } else { if (indexer.Enable) { ExecuteAction(a => a.AddIndexer(definition), app); } } } if (removeRemote) { var allIndexers = _indexerFactory.All(); foreach (var mapping in indexerMappings) { if (!allIndexers.Any(x => x.Id == mapping.IndexerId)) { _logger.Info("Indexer with the ID {0} was found within {1} but is no longer defined within Prowlarr, this is being removed.", mapping.IndexerId, app.Name); ExecuteAction(a => a.RemoveIndexer(mapping.IndexerId), app); } } } } }
public CombinedStatistics IndexerStatistics(DateTime start, DateTime end) { var history = _historyService.Between(start, end); var groupedByIndexer = history.GroupBy(h => h.IndexerId); var groupedByUserAgent = history.GroupBy(h => h.Data.GetValueOrDefault("source") ?? ""); var groupedByHost = history.GroupBy(h => h.Data.GetValueOrDefault("host") ?? ""); var indexerStatsList = new List <IndexerStatistics>(); var userAgentStatsList = new List <UserAgentStatistics>(); var hostStatsList = new List <HostStatistics>(); var indexers = _indexerFactory.All(); foreach (var indexer in groupedByIndexer) { var indexerDef = indexers.SingleOrDefault(i => i.Id == indexer.Key); if (indexerDef == null) { continue; } var indexerStats = new IndexerStatistics { IndexerId = indexer.Key, IndexerName = indexerDef.Name }; var sortedEvents = indexer.OrderBy(v => v.Date) .ThenBy(v => v.Id) .ToArray(); int temp = 0; indexerStats.AverageResponseTime = (int)sortedEvents.Where(h => int.TryParse(h.Data.GetValueOrDefault("elapsedTime"), out temp)) .Select(h => temp) .Average(); foreach (var historyEvent in sortedEvents) { var failed = !historyEvent.Successful; switch (historyEvent.EventType) { case HistoryEventType.IndexerQuery: indexerStats.NumberOfQueries++; if (failed) { indexerStats.NumberOfFailedQueries++; } break; case HistoryEventType.IndexerAuth: indexerStats.NumberOfAuthQueries++; if (failed) { indexerStats.NumberOfFailedAuthQueries++; } break; case HistoryEventType.ReleaseGrabbed: indexerStats.NumberOfGrabs++; if (failed) { indexerStats.NumberOfFailedGrabs++; } break; case HistoryEventType.IndexerRss: indexerStats.NumberOfRssQueries++; if (failed) { indexerStats.NumberOfFailedRssQueries++; } break; default: break; } } indexerStatsList.Add(indexerStats); } foreach (var indexer in groupedByUserAgent) { var indexerStats = new UserAgentStatistics { UserAgent = indexer.Key }; var sortedEvents = indexer.OrderBy(v => v.Date) .ThenBy(v => v.Id) .ToArray(); foreach (var historyEvent in sortedEvents) { switch (historyEvent.EventType) { case HistoryEventType.IndexerRss: case HistoryEventType.IndexerQuery: indexerStats.NumberOfQueries++; break; case HistoryEventType.ReleaseGrabbed: indexerStats.NumberOfGrabs++; break; default: break; } } userAgentStatsList.Add(indexerStats); } foreach (var indexer in groupedByHost) { var indexerStats = new HostStatistics { Host = indexer.Key }; var sortedEvents = indexer.OrderBy(v => v.Date) .ThenBy(v => v.Id) .ToArray(); foreach (var historyEvent in sortedEvents) { switch (historyEvent.EventType) { case HistoryEventType.IndexerRss: case HistoryEventType.IndexerQuery: indexerStats.NumberOfQueries++; break; case HistoryEventType.ReleaseGrabbed: indexerStats.NumberOfGrabs++; break; default: break; } } hostStatsList.Add(indexerStats); } return(new CombinedStatistics { IndexerStatistics = indexerStatsList, UserAgentStatistics = userAgentStatsList, HostStatistics = hostStatsList }); }