Пример #1
0
        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);
        }
Пример #2
0
 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);
     }
 }
Пример #3
0
        public void Delete(int id)
        {
            if (_indexerFactory.All().Any(c => c.AppProfileId == id) || All().Count == 1)
            {
                throw new ProfileInUseException(id);
            }

            _profileRepository.Delete(id);
        }
Пример #4
0
        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()));
        }
Пример #5
0
        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()));
        }
Пример #6
0
        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)));
        }
Пример #7
0
        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"));
        }
Пример #9
0
        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);
                }
            }
        }
Пример #10
0
        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);
        }
Пример #11
0
        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
            });
        }