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() {
|
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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -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,
|
||||||
|
@@ -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'),
|
||||||
|
@@ -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();
|
||||||
|
@@ -23,6 +23,7 @@ namespace NzbDrone.Core.History
|
|||||||
public enum HistoryEventType
|
public enum HistoryEventType
|
||||||
{
|
{
|
||||||
Unknown = 0,
|
Unknown = 0,
|
||||||
ReleaseGrabbed = 1
|
ReleaseGrabbed = 1,
|
||||||
|
IndexerQuery = 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.Messaging.Events;
|
||||||
using NzbDrone.Core.ThingiProvider;
|
using NzbDrone.Core.ThingiProvider;
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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