Fix Search and Add Indexers

This commit is contained in:
Qstick
2020-10-21 12:23:58 -04:00
parent cfb1a80c58
commit 5f7d063c14
12 changed files with 83 additions and 117 deletions

View File

@@ -10,12 +10,12 @@ import History from './History';
function createMapStateToProps() { function createMapStateToProps() {
return createSelector( return createSelector(
(state) => state.history, (state) => state.history,
(state) => state.movies, (state) => state.indexers,
(history, movies) => { (history, indexers) => {
return { return {
isMoviesFetching: movies.isFetching, isMoviesFetching: indexers.isFetching,
isMoviesPopulated: movies.isPopulated, isMoviesPopulated: indexers.isPopulated,
moviesError: movies.error, moviesError: indexers.error,
...history ...history
}; };
} }

View File

@@ -5,8 +5,6 @@ import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellCo
import TableRowCell from 'Components/Table/Cells/TableRowCell'; import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow'; import TableRow from 'Components/Table/TableRow';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import MovieLanguage from 'Indexer/MovieLanguage';
import MovieQuality from 'Indexer/MovieQuality';
import MovieTitleLink from 'Indexer/MovieTitleLink'; import MovieTitleLink from 'Indexer/MovieTitleLink';
import HistoryDetailsModal from './Details/HistoryDetailsModal'; import HistoryDetailsModal from './Details/HistoryDetailsModal';
import HistoryEventTypeCell from './HistoryEventTypeCell'; import HistoryEventTypeCell from './HistoryEventTypeCell';
@@ -52,9 +50,6 @@ class HistoryRow extends Component {
render() { render() {
const { const {
movie, movie,
quality,
languages,
qualityCutoffNotMet,
eventType, eventType,
sourceTitle, sourceTitle,
date, date,
@@ -93,34 +88,13 @@ class HistoryRow extends Component {
); );
} }
if (name === 'movies.sortTitle') { if (name === 'indexer') {
return ( return (
<TableRowCell key={name}> <TableRowCell
<MovieTitleLink key={name}
titleSlug={movie.titleSlug} className={styles.indexer}
title={movie.title} >
/> {movie.name}
</TableRowCell>
);
}
if (name === 'languages') {
return (
<TableRowCell key={name}>
<MovieLanguage
languages={languages}
/>
</TableRowCell>
);
}
if (name === 'quality') {
return (
<TableRowCell key={name}>
<MovieQuality
quality={quality}
isCutoffMet={qualityCutoffNotMet}
/>
</TableRowCell> </TableRowCell>
); );
} }
@@ -134,39 +108,6 @@ class HistoryRow extends Component {
); );
} }
if (name === 'downloadClient') {
return (
<TableRowCell
key={name}
className={styles.downloadClient}
>
{data.downloadClient}
</TableRowCell>
);
}
if (name === 'indexer') {
return (
<TableRowCell
key={name}
className={styles.indexer}
>
{data.indexer}
</TableRowCell>
);
}
if (name === 'releaseGroup') {
return (
<TableRowCell
key={name}
className={styles.releaseGroup}
>
{data.releaseGroup}
</TableRowCell>
);
}
if (name === 'details') { if (name === 'details') {
return ( return (
<TableRowCell <TableRowCell
@@ -205,9 +146,6 @@ class HistoryRow extends Component {
HistoryRow.propTypes = { HistoryRow.propTypes = {
movieId: PropTypes.number, movieId: PropTypes.number,
movie: PropTypes.object.isRequired, movie: PropTypes.object.isRequired,
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
quality: PropTypes.object.isRequired,
qualityCutoffNotMet: PropTypes.bool.isRequired,
eventType: PropTypes.string.isRequired, eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired, sourceTitle: PropTypes.string.isRequired,
date: PropTypes.string.isRequired, date: PropTypes.string.isRequired,

View File

@@ -35,50 +35,17 @@ export const defaultState = {
isModifiable: false isModifiable: false
}, },
{ {
name: 'movies.sortTitle', name: 'indexer',
label: translate('Movie'), label: 'Indexer',
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{
name: 'languages',
label: translate('Languages'),
isSortable: true,
isVisible: true
},
{
name: 'quality',
label: translate('Quality'),
isSortable: true,
isVisible: true
},
{
name: 'customFormats',
label: translate('Formats'),
isSortable: false,
isVisible: true
},
{ {
name: 'date', name: 'date',
label: translate('Date'), label: translate('Date'),
isSortable: true, isSortable: true,
isVisible: true isVisible: true
}, },
{
name: 'downloadClient',
label: translate('DownloadClient'),
isVisible: false
},
{
name: 'indexer',
label: translate('Indexer'),
isVisible: false
},
{
name: 'releaseGroup',
label: translate('ReleaseGroup'),
isVisible: false
},
{ {
name: 'details', name: 'details',
columnLabel: translate('Details'), columnLabel: translate('Details'),

View File

@@ -16,7 +16,6 @@ namespace NzbDrone.Core.Datastore.Migration
.WithColumn("IndexerId").AsInt32() .WithColumn("IndexerId").AsInt32()
.WithColumn("SourceTitle").AsString() .WithColumn("SourceTitle").AsString()
.WithColumn("Date").AsDateTime() .WithColumn("Date").AsDateTime()
.WithColumn("Quality").AsString()
.WithColumn("Data").AsString() .WithColumn("Data").AsString()
.WithColumn("EventType").AsInt32().Nullable() .WithColumn("EventType").AsInt32().Nullable()
.WithColumn("DownloadId").AsString().Nullable().Indexed(); .WithColumn("DownloadId").AsString().Nullable().Indexed();

View File

@@ -23,6 +23,7 @@ namespace NzbDrone.Core.History
public enum HistoryEventType public enum HistoryEventType
{ {
Unknown = 0, Unknown = 0,
ReleaseGrabbed = 1 ReleaseGrabbed = 1,
IndexerQuery = 2
} }
} }

View File

@@ -3,6 +3,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.Indexers;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.ThingiProvider.Events;
namespace NzbDrone.Core.History namespace NzbDrone.Core.History
{ {
@@ -19,7 +22,9 @@ namespace NzbDrone.Core.History
List<History> Since(DateTime date, HistoryEventType? eventType); List<History> Since(DateTime date, HistoryEventType? eventType);
} }
public class HistoryService : IHistoryService public class HistoryService : IHistoryService,
IHandle<ProviderDeletedEvent<IIndexer>>,
IHandle<IndexerQueryEvent>
{ {
private readonly IHistoryRepository _historyRepository; private readonly IHistoryRepository _historyRepository;
private readonly Logger _logger; private readonly Logger _logger;
@@ -74,5 +79,23 @@ namespace NzbDrone.Core.History
{ {
return _historyRepository.Since(date, eventType); return _historyRepository.Since(date, eventType);
} }
public void Handle(IndexerQueryEvent message)
{
var history = new History
{
Date = DateTime.UtcNow,
IndexerId = message.IndexerId,
EventType = HistoryEventType.IndexerQuery,
SourceTitle = message.Query
};
_historyRepository.Insert(history);
}
public void Handle(ProviderDeletedEvent<IIndexer> message)
{
_historyRepository.DeleteForIndexers(new List<int> { message.ProviderId });
}
} }
} }

View File

@@ -8,6 +8,7 @@ using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Common.TPL; using NzbDrone.Common.TPL;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
namespace NzbDrone.Core.IndexerSearch namespace NzbDrone.Core.IndexerSearch
@@ -20,12 +21,15 @@ namespace NzbDrone.Core.IndexerSearch
public class NzbSearchService : ISearchForNzb public class NzbSearchService : ISearchForNzb
{ {
private readonly IEventAggregator _eventAggregator;
private readonly IIndexerFactory _indexerFactory; private readonly IIndexerFactory _indexerFactory;
private readonly Logger _logger; private readonly Logger _logger;
public NzbSearchService(IIndexerFactory indexerFactory, public NzbSearchService(IEventAggregator eventAggregator,
IIndexerFactory indexerFactory,
Logger logger) Logger logger)
{ {
_eventAggregator = eventAggregator;
_indexerFactory = indexerFactory; _indexerFactory = indexerFactory;
_logger = logger; _logger = logger;
} }
@@ -87,6 +91,8 @@ namespace NzbDrone.Core.IndexerSearch
{ {
var indexerReports = searchAction(indexerLocal); var indexerReports = searchAction(indexerLocal);
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase.QueryTitles.Join(", ")));
lock (reports) lock (reports)
{ {
reports.AddRange(indexerReports); reports.AddRange(indexerReports);

View File

@@ -45,6 +45,7 @@ namespace NzbDrone.Core.Indexers
definition.Protocol = provider.Protocol; definition.Protocol = provider.Protocol;
definition.Privacy = provider.Privacy; definition.Privacy = provider.Privacy;
definition.SupportsRss = provider.SupportsRss; definition.SupportsRss = provider.SupportsRss;
definition.SupportsSearch = provider.SupportsSearch;
definition.Capabilities = provider.Capabilities; definition.Capabilities = provider.Capabilities;
} }

View File

@@ -0,0 +1,16 @@
using NzbDrone.Common.Messaging;
namespace NzbDrone.Core.Indexers
{
public class IndexerQueryEvent : IEvent
{
public int IndexerId { get; set; }
public string Query { get; set; }
public IndexerQueryEvent(int indexerId, string query)
{
IndexerId = indexerId;
Query = query;
}
}
}

View File

@@ -1,4 +1,4 @@
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.ThingiProvider; using NzbDrone.Core.ThingiProvider;

View File

@@ -1,7 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Net; using System.Net;
using Nancy.ModelBinding;
using NLog; using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Exceptions; using NzbDrone.Core.Exceptions;
using NzbDrone.Core.IndexerSearch; using NzbDrone.Core.IndexerSearch;
using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Parser.Model;
@@ -24,17 +27,19 @@ namespace Prowlarr.Api.V1.Search
private List<SearchResource> GetAll() private List<SearchResource> GetAll()
{ {
if (Request.Query.query.HasValue) var request = this.Bind<SearchRequest>();
if (request.Query.IsNotNullOrWhiteSpace())
{ {
var indexerIds = Request.Query.indexerIds.HasValue ? (List<int>)Request.Query.indexerIds.split(',') : new List<int>(); var indexerIds = request.IndexerIds ?? new List<int>();
if (indexerIds.Count > 0) if (indexerIds.Count > 0)
{ {
return GetSearchReleases(Request.Query.query, indexerIds); return GetSearchReleases(request.Query, indexerIds);
} }
else else
{ {
return GetSearchReleases(Request.Query.query, null); return GetSearchReleases(request.Query, null);
} }
} }

View File

@@ -0,0 +1,10 @@
using System.Collections.Generic;
namespace Prowlarr.Api.V1.Search
{
public class SearchRequest
{
public List<int> IndexerIds { get; set; }
public string Query { get; set; }
}
}