mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-09-17 17:14:18 +02:00
Fix Search and Add Indexers
This commit is contained in:
@@ -10,12 +10,12 @@ import History from './History';
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
(state) => state.history,
|
||||
(state) => state.movies,
|
||||
(history, movies) => {
|
||||
(state) => state.indexers,
|
||||
(history, indexers) => {
|
||||
return {
|
||||
isMoviesFetching: movies.isFetching,
|
||||
isMoviesPopulated: movies.isPopulated,
|
||||
moviesError: movies.error,
|
||||
isMoviesFetching: indexers.isFetching,
|
||||
isMoviesPopulated: indexers.isPopulated,
|
||||
moviesError: indexers.error,
|
||||
...history
|
||||
};
|
||||
}
|
||||
|
@@ -5,8 +5,6 @@ import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellCo
|
||||
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||
import TableRow from 'Components/Table/TableRow';
|
||||
import { icons } from 'Helpers/Props';
|
||||
import MovieLanguage from 'Indexer/MovieLanguage';
|
||||
import MovieQuality from 'Indexer/MovieQuality';
|
||||
import MovieTitleLink from 'Indexer/MovieTitleLink';
|
||||
import HistoryDetailsModal from './Details/HistoryDetailsModal';
|
||||
import HistoryEventTypeCell from './HistoryEventTypeCell';
|
||||
@@ -52,9 +50,6 @@ class HistoryRow extends Component {
|
||||
render() {
|
||||
const {
|
||||
movie,
|
||||
quality,
|
||||
languages,
|
||||
qualityCutoffNotMet,
|
||||
eventType,
|
||||
sourceTitle,
|
||||
date,
|
||||
@@ -93,34 +88,13 @@ class HistoryRow extends Component {
|
||||
);
|
||||
}
|
||||
|
||||
if (name === 'movies.sortTitle') {
|
||||
if (name === 'indexer') {
|
||||
return (
|
||||
<TableRowCell key={name}>
|
||||
<MovieTitleLink
|
||||
titleSlug={movie.titleSlug}
|
||||
title={movie.title}
|
||||
/>
|
||||
</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
|
||||
key={name}
|
||||
className={styles.indexer}
|
||||
>
|
||||
{movie.name}
|
||||
</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') {
|
||||
return (
|
||||
<TableRowCell
|
||||
@@ -205,9 +146,6 @@ class HistoryRow extends Component {
|
||||
HistoryRow.propTypes = {
|
||||
movieId: PropTypes.number,
|
||||
movie: PropTypes.object.isRequired,
|
||||
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
quality: PropTypes.object.isRequired,
|
||||
qualityCutoffNotMet: PropTypes.bool.isRequired,
|
||||
eventType: PropTypes.string.isRequired,
|
||||
sourceTitle: PropTypes.string.isRequired,
|
||||
date: PropTypes.string.isRequired,
|
||||
|
@@ -35,50 +35,17 @@ export const defaultState = {
|
||||
isModifiable: false
|
||||
},
|
||||
{
|
||||
name: 'movies.sortTitle',
|
||||
label: translate('Movie'),
|
||||
name: 'indexer',
|
||||
label: 'Indexer',
|
||||
isSortable: 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',
|
||||
label: translate('Date'),
|
||||
isSortable: 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',
|
||||
columnLabel: translate('Details'),
|
||||
|
@@ -16,7 +16,6 @@ namespace NzbDrone.Core.Datastore.Migration
|
||||
.WithColumn("IndexerId").AsInt32()
|
||||
.WithColumn("SourceTitle").AsString()
|
||||
.WithColumn("Date").AsDateTime()
|
||||
.WithColumn("Quality").AsString()
|
||||
.WithColumn("Data").AsString()
|
||||
.WithColumn("EventType").AsInt32().Nullable()
|
||||
.WithColumn("DownloadId").AsString().Nullable().Indexed();
|
||||
|
@@ -23,6 +23,7 @@ namespace NzbDrone.Core.History
|
||||
public enum HistoryEventType
|
||||
{
|
||||
Unknown = 0,
|
||||
ReleaseGrabbed = 1
|
||||
ReleaseGrabbed = 1,
|
||||
IndexerQuery = 2
|
||||
}
|
||||
}
|
||||
|
@@ -3,6 +3,9 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.ThingiProvider.Events;
|
||||
|
||||
namespace NzbDrone.Core.History
|
||||
{
|
||||
@@ -19,7 +22,9 @@ namespace NzbDrone.Core.History
|
||||
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 Logger _logger;
|
||||
@@ -74,5 +79,23 @@ namespace NzbDrone.Core.History
|
||||
{
|
||||
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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -8,6 +8,7 @@ using NzbDrone.Common.Instrumentation.Extensions;
|
||||
using NzbDrone.Common.TPL;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.IndexerSearch
|
||||
@@ -20,12 +21,15 @@ namespace NzbDrone.Core.IndexerSearch
|
||||
|
||||
public class NzbSearchService : ISearchForNzb
|
||||
{
|
||||
private readonly IEventAggregator _eventAggregator;
|
||||
private readonly IIndexerFactory _indexerFactory;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public NzbSearchService(IIndexerFactory indexerFactory,
|
||||
public NzbSearchService(IEventAggregator eventAggregator,
|
||||
IIndexerFactory indexerFactory,
|
||||
Logger logger)
|
||||
{
|
||||
_eventAggregator = eventAggregator;
|
||||
_indexerFactory = indexerFactory;
|
||||
_logger = logger;
|
||||
}
|
||||
@@ -87,6 +91,8 @@ namespace NzbDrone.Core.IndexerSearch
|
||||
{
|
||||
var indexerReports = searchAction(indexerLocal);
|
||||
|
||||
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase.QueryTitles.Join(", ")));
|
||||
|
||||
lock (reports)
|
||||
{
|
||||
reports.AddRange(indexerReports);
|
||||
|
@@ -45,6 +45,7 @@ namespace NzbDrone.Core.Indexers
|
||||
definition.Protocol = provider.Protocol;
|
||||
definition.Privacy = provider.Privacy;
|
||||
definition.SupportsRss = provider.SupportsRss;
|
||||
definition.SupportsSearch = provider.SupportsSearch;
|
||||
definition.Capabilities = provider.Capabilities;
|
||||
}
|
||||
|
||||
|
16
src/NzbDrone.Core/Indexers/IndexerQueryEvent.cs
Normal file
16
src/NzbDrone.Core/Indexers/IndexerQueryEvent.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
|
||||
|
@@ -1,7 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using Nancy.ModelBinding;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Exceptions;
|
||||
using NzbDrone.Core.IndexerSearch;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
@@ -24,17 +27,19 @@ namespace Prowlarr.Api.V1.Search
|
||||
|
||||
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)
|
||||
{
|
||||
return GetSearchReleases(Request.Query.query, indexerIds);
|
||||
return GetSearchReleases(request.Query, indexerIds);
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetSearchReleases(Request.Query.query, null);
|
||||
return GetSearchReleases(request.Query, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
10
src/Prowlarr.Api.V1/Search/SearchRequest.cs
Normal file
10
src/Prowlarr.Api.V1/Search/SearchRequest.cs
Normal 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; }
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user