mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-03-05 13:40:08 -05:00
Compare commits
51 Commits
v0.1.0.361
...
v0.1.0.447
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8fdd46cd3 | ||
|
|
b6a08bdd9e | ||
|
|
59df0351ac | ||
|
|
0fd242cd62 | ||
|
|
ed7c5a937f | ||
|
|
f6906d0f18 | ||
|
|
561563b48c | ||
|
|
e383036c84 | ||
|
|
202f439a60 | ||
|
|
449e60afc0 | ||
|
|
9675171aff | ||
|
|
bcee5f1754 | ||
|
|
d1a3e61979 | ||
|
|
b4a0c272c9 | ||
|
|
75cbabf716 | ||
|
|
6612202384 | ||
|
|
6b52dd6e7a | ||
|
|
974ab6387f | ||
|
|
9ac435bc41 | ||
|
|
b0f04bb9d7 | ||
|
|
52bff3d7bd | ||
|
|
d965cb3c98 | ||
|
|
b592a137cf | ||
|
|
b0819c97ed | ||
|
|
5802d20b93 | ||
|
|
58e30cc9a6 | ||
|
|
513b9d2324 | ||
|
|
3ebdc1c1ac | ||
|
|
e9a5c5f7d2 | ||
|
|
23c01f7dbe | ||
|
|
c35864cc7f | ||
|
|
e545e0a129 | ||
|
|
1e72944998 | ||
|
|
d234cbda8a | ||
|
|
09a9731dae | ||
|
|
3b4df1706e | ||
|
|
20038e4757 | ||
|
|
c57c77d8e7 | ||
|
|
c61c3a9c45 | ||
|
|
d6d418f7b3 | ||
|
|
ab5cf45d88 | ||
|
|
40d55b915e | ||
|
|
4a851c37d5 | ||
|
|
63b6adf0e1 | ||
|
|
d9e211472b | ||
|
|
fa05dbc642 | ||
|
|
709dc0ee5f | ||
|
|
67f26fe185 | ||
|
|
5f4218ae91 | ||
|
|
30b54d8340 | ||
|
|
ee6ae386ca |
22
.github/ISSUE_TEMPLATE/indexer_request.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE/indexer_request.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
name: Indexer Request
|
||||
about: Request an indexer for Prowlarr. Check the pinned Jackett parity issue prior to submitting a request. Duplicated requests will be closed without warning. Please search GitHub prior to requesting.
|
||||
title: '(Indexer) '
|
||||
labels: 'Type: Indexer Request'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- Check the pinned Jackett parity issue prior to submitting a request. Duplicated requests or requests covered in existing GitHub Issues will be closed without warning. Please search GitHub prior to requesting.-->
|
||||
|
||||
**Type:** <Usenet|Torrents>
|
||||
|
||||
**Tracker:** <Indexer/Tracker Name>
|
||||
|
||||
**URL:** <Indexer/Tracker URL>
|
||||
|
||||
**In Jackett?:** <Yes|No>
|
||||
<!-- Check the pinned Jackett parity issue prior to submitting a request. Duplicated requests or requests covered in existing GitHub Issues will be closed without warning. Please search GitHub prior to requesting.-->
|
||||
|
||||
**Additional Context:**
|
||||
<!-- Add any other context or screenshots about the request here. -->
|
||||
@@ -3,15 +3,31 @@
|
||||
We're always looking for people to help make Prowlarr even better, there are a number of ways to contribute.
|
||||
|
||||
## Documentation ##
|
||||
Setup guides, FAQ, the more information we have on the wiki the better.
|
||||
Setup guides, FAQ, the more information we have on the [wiki](https://wikijs.servarr.com/prowlarr) the better.
|
||||
|
||||
## Development ##
|
||||
|
||||
See the readme for information on setting up your development environment.
|
||||
### Tools required ###
|
||||
- Visual Studio 2019 or higher (https://www.visualstudio.com/vs/). The community version is free and works (https://www.visualstudio.com/downloads/).
|
||||
- HTML/Javascript editor of choice (VS Code/Sublime Text/Webstorm/Atom/etc)
|
||||
- [Git](https://git-scm.com/downloads)
|
||||
- [NodeJS](https://nodejs.org/en/download/) (Node 12.X.X or higher)
|
||||
- [Yarn](https://yarnpkg.com/)
|
||||
- .NET Core 5.0.
|
||||
|
||||
### Getting started ###
|
||||
|
||||
1. Fork Prowlarr
|
||||
2. Clone the repository into your development machine. [*info*](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository-from-github)
|
||||
3. Install the required Node Packages `yarn install`
|
||||
4. Start gulp to monitor your dev environment for any changes that need post processing using `yarn start` command.
|
||||
5. Build the project in Visual Studio, Setting startup project to `Prowlarr.Console` and framework to `net5.0`
|
||||
6. Debug the project in Visual Studio
|
||||
7. Open http://localhost:7878
|
||||
|
||||
### Contributing Code ###
|
||||
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Prowlarr/Prowlarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first)
|
||||
- Rebase from Prowlarr's develop branch, don't merge
|
||||
- Rebase from Radarr's develop branch, don't merge
|
||||
- Make meaningful commits, or squash them
|
||||
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
|
||||
- Reach out to us on the discord if you have any questions
|
||||
@@ -20,6 +36,10 @@ See the readme for information on setting up your development environment.
|
||||
- One feature/bug fix per pull request to keep things clean and easy to understand
|
||||
- Use 4 spaces instead of tabs, this is the default for VS 2019 and WebStorm (to my knowledge)
|
||||
|
||||
### Contributing Indexers ###
|
||||
- If you're contributing an indexer please phrase your commit as something like: `New: (Indexer) {Indexer Name}`, `New: (Indexer) {Usenet|Torrent} {Indexer Name}`, `New: (Indexer) {Torznab|Newznab} {Indexer Name}`
|
||||
- If you're updating an indexer please phrase your commit as something like: `Fixed: (Indexer) {Indexer Name} {changes}` e.g. `Fixed: (Indexer) Changed BHD to use API`
|
||||
|
||||
### Pull Requesting ###
|
||||
- Only make pull requests to develop, never master, if you make a PR to master we'll comment on it and close it
|
||||
- You're probably going to get some comments or questions from us, they will be to ensure consistency and maintainability
|
||||
|
||||
@@ -23,6 +23,16 @@ class BarChart extends Component {
|
||||
this.myChart = new Chart(this.canvasRef.current, {
|
||||
type: 'bar',
|
||||
options: {
|
||||
x: {
|
||||
ticks: {
|
||||
stepSize: this.props.stepSize
|
||||
}
|
||||
},
|
||||
y: {
|
||||
ticks: {
|
||||
stepSize: this.props.stepSize
|
||||
}
|
||||
},
|
||||
indexAxis: this.props.horizontal ? 'y' : 'x',
|
||||
maintainAspectRatio: false,
|
||||
plugins: {
|
||||
@@ -64,7 +74,8 @@ BarChart.propTypes = {
|
||||
horizontal: PropTypes.bool,
|
||||
legend: PropTypes.bool,
|
||||
title: PropTypes.string.isRequired,
|
||||
kind: PropTypes.oneOf(kinds.all).isRequired
|
||||
kind: PropTypes.oneOf(kinds.all).isRequired,
|
||||
stepSize: PropTypes.number
|
||||
};
|
||||
|
||||
BarChart.defaultProps = {
|
||||
@@ -72,7 +83,8 @@ BarChart.defaultProps = {
|
||||
horizontal: false,
|
||||
legend: false,
|
||||
title: '',
|
||||
kind: kinds.INFO
|
||||
kind: kinds.INFO,
|
||||
stepSize: 1
|
||||
};
|
||||
|
||||
export default BarChart;
|
||||
|
||||
@@ -16,10 +16,16 @@ class StackedBarChart extends Component {
|
||||
maintainAspectRatio: false,
|
||||
scales: {
|
||||
x: {
|
||||
stacked: true
|
||||
stacked: true,
|
||||
ticks: {
|
||||
stepSize: this.props.stepSize
|
||||
}
|
||||
},
|
||||
y: {
|
||||
stacked: true
|
||||
stacked: true,
|
||||
ticks: {
|
||||
stepSize: this.props.stepSize
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
@@ -63,11 +69,13 @@ class StackedBarChart extends Component {
|
||||
|
||||
StackedBarChart.propTypes = {
|
||||
data: PropTypes.object.isRequired,
|
||||
title: PropTypes.string.isRequired
|
||||
title: PropTypes.string.isRequired,
|
||||
stepSize: PropTypes.number
|
||||
};
|
||||
|
||||
StackedBarChart.defaultProps = {
|
||||
title: ''
|
||||
title: '',
|
||||
stepSize: 1
|
||||
};
|
||||
|
||||
export default StackedBarChart;
|
||||
|
||||
@@ -25,7 +25,7 @@ function FormInputHelpText(props) {
|
||||
isCheckInput && styles.isCheckInput
|
||||
)}
|
||||
>
|
||||
{text}
|
||||
<div dangerouslySetInnerHTML={{ __html: text }} />
|
||||
|
||||
{
|
||||
link ?
|
||||
|
||||
@@ -73,7 +73,7 @@ class HistoryOptions extends Component {
|
||||
}
|
||||
|
||||
HistoryOptions.propTypes = {
|
||||
historyCleanupDays: PropTypes.bool.isRequired,
|
||||
historyCleanupDays: PropTypes.number.isRequired,
|
||||
dispatchSaveGeneralSettings: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
|
||||
@@ -20,19 +20,25 @@ import styles from './AddIndexerModalContent.css';
|
||||
const columns = [
|
||||
{
|
||||
name: 'protocol',
|
||||
label: 'Protocol',
|
||||
label: translate('Protocol'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'name',
|
||||
label: 'Name',
|
||||
label: translate('Name'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'language',
|
||||
label: translate('Language'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'privacy',
|
||||
label: 'Privacy',
|
||||
label: translate('Privacy'),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@ class SelectIndexerRow extends Component {
|
||||
const {
|
||||
protocol,
|
||||
privacy,
|
||||
name
|
||||
name,
|
||||
language
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
@@ -41,6 +42,10 @@ class SelectIndexerRow extends Component {
|
||||
{name}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
{language}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
{privacy}
|
||||
</TableRowCell>
|
||||
@@ -53,6 +58,7 @@ SelectIndexerRow.propTypes = {
|
||||
name: PropTypes.string.isRequired,
|
||||
protocol: PropTypes.string.isRequired,
|
||||
privacy: PropTypes.string.isRequired,
|
||||
language: PropTypes.string.isRequired,
|
||||
implementation: PropTypes.string.isRequired,
|
||||
onIndexerSelect: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
@@ -50,7 +50,7 @@ class TagsModalContent extends Component {
|
||||
|
||||
render() {
|
||||
const {
|
||||
movieTags,
|
||||
indexerTags,
|
||||
tagList,
|
||||
onModalClose
|
||||
} = this.props;
|
||||
@@ -108,7 +108,7 @@ class TagsModalContent extends Component {
|
||||
|
||||
<div className={styles.result}>
|
||||
{
|
||||
movieTags.map((t) => {
|
||||
indexerTags.map((t) => {
|
||||
const tag = _.find(tagList, { id: t });
|
||||
|
||||
if (!tag) {
|
||||
@@ -140,7 +140,7 @@ class TagsModalContent extends Component {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (movieTags.indexOf(t) > -1) {
|
||||
if (indexerTags.indexOf(t) > -1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ class TagsModalContent extends Component {
|
||||
}
|
||||
|
||||
TagsModalContent.propTypes = {
|
||||
movieTags: PropTypes.arrayOf(PropTypes.number).isRequired,
|
||||
indexerTags: PropTypes.arrayOf(PropTypes.number).isRequired,
|
||||
tagList: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
onModalClose: PropTypes.func.isRequired,
|
||||
onApplyTagsPress: PropTypes.func.isRequired
|
||||
|
||||
@@ -10,15 +10,15 @@ function createMapStateToProps() {
|
||||
(state, { indexerIds }) => indexerIds,
|
||||
createAllIndexersSelector(),
|
||||
createTagsSelector(),
|
||||
(indexerIds, allMovies, tagList) => {
|
||||
const movies = _.intersectionWith(allMovies, indexerIds, (s, id) => {
|
||||
(indexerIds, allIndexers, tagList) => {
|
||||
const indexers = _.intersectionWith(allIndexers, indexerIds, (s, id) => {
|
||||
return s.id === id;
|
||||
});
|
||||
|
||||
const movieTags = _.uniq(_.concat(..._.map(movies, 'tags')));
|
||||
const indexerTags = _.uniq(_.concat(..._.map(indexers, 'tags')));
|
||||
|
||||
return {
|
||||
movieTags,
|
||||
indexerTags,
|
||||
tagList
|
||||
};
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import withScrollPosition from 'Components/withScrollPosition';
|
||||
import { testAllIndexers } from 'Store/Actions/indexerActions';
|
||||
import { saveMovieEditor, setMovieFilter, setMovieSort, setMovieTableOption } from 'Store/Actions/indexerIndexActions';
|
||||
import { saveIndexerEditor, setMovieFilter, setMovieSort, setMovieTableOption } from 'Store/Actions/indexerIndexActions';
|
||||
import scrollPositions from 'Store/scrollPositions';
|
||||
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
||||
import createIndexerClientSideCollectionItemsSelector from 'Store/Selectors/createIndexerClientSideCollectionItemsSelector';
|
||||
@@ -40,8 +40,8 @@ function createMapDispatchToProps(dispatch, props) {
|
||||
dispatch(setMovieFilter({ selectedFilterKey }));
|
||||
},
|
||||
|
||||
dispatchSaveMovieEditor(payload) {
|
||||
dispatch(saveMovieEditor(payload));
|
||||
dispatchSaveIndexerEditor(payload) {
|
||||
dispatch(saveIndexerEditor(payload));
|
||||
},
|
||||
|
||||
onTestAllPress() {
|
||||
@@ -56,7 +56,7 @@ class IndexerIndexConnector extends Component {
|
||||
// Listeners
|
||||
|
||||
onSaveSelected = (payload) => {
|
||||
this.props.dispatchSaveMovieEditor(payload);
|
||||
this.props.dispatchSaveIndexerEditor(payload);
|
||||
}
|
||||
|
||||
onScroll = ({ scrollTop }) => {
|
||||
@@ -79,7 +79,7 @@ class IndexerIndexConnector extends Component {
|
||||
|
||||
IndexerIndexConnector.propTypes = {
|
||||
isSmallScreen: PropTypes.bool.isRequired,
|
||||
dispatchSaveMovieEditor: PropTypes.func.isRequired,
|
||||
dispatchSaveIndexerEditor: PropTypes.func.isRequired,
|
||||
items: PropTypes.arrayOf(PropTypes.object)
|
||||
};
|
||||
|
||||
|
||||
@@ -248,7 +248,7 @@ class IndexerIndexRow extends Component {
|
||||
className={styles.externalLink}
|
||||
name={icons.EXTERNAL_LINK}
|
||||
title={'Website'}
|
||||
to={baseUrl}
|
||||
to={baseUrl.replace('api.', '')}
|
||||
/>
|
||||
|
||||
<IconButton
|
||||
|
||||
@@ -4,6 +4,7 @@ import React, { Component } from 'react';
|
||||
import IndexersSelectInputConnector from 'Components/Form/IndexersSelectInputConnector';
|
||||
import NewznabCategorySelectInputConnector from 'Components/Form/NewznabCategorySelectInputConnector';
|
||||
import TextInput from 'Components/Form/TextInput';
|
||||
import keyboardShortcuts from 'Components/keyboardShortcuts';
|
||||
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||
import PageContentFooter from 'Components/Page/PageContentFooter';
|
||||
import SearchFooterLabel from './SearchFooterLabel';
|
||||
@@ -38,9 +39,11 @@ class SearchFooter extends Component {
|
||||
searchQuery
|
||||
} = this.state;
|
||||
|
||||
if (searchQuery !== '' || searchCategories !== [] || searchIndexerIds !== []) {
|
||||
if (searchQuery !== '' || searchCategories.length > 0 || searchIndexerIds.length > 0) {
|
||||
this.onSearchPress();
|
||||
}
|
||||
|
||||
this.props.bindShortcut('enter', this.onSearchPress, { isGlobal: true });
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
@@ -114,6 +117,7 @@ class SearchFooter extends Component {
|
||||
|
||||
<TextInput
|
||||
name='searchQuery'
|
||||
autoFocus={true}
|
||||
value={searchQuery}
|
||||
isDisabled={isFetching}
|
||||
onChange={onInputChange}
|
||||
@@ -181,7 +185,8 @@ SearchFooter.propTypes = {
|
||||
onSearchPress: PropTypes.func.isRequired,
|
||||
hasIndexers: PropTypes.bool.isRequired,
|
||||
onInputChange: PropTypes.func.isRequired,
|
||||
searchError: PropTypes.object
|
||||
searchError: PropTypes.object,
|
||||
bindShortcut: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default SearchFooter;
|
||||
export default keyboardShortcuts(SearchFooter);
|
||||
|
||||
@@ -18,9 +18,9 @@ import translate from 'Utilities/String/translate';
|
||||
import styles from './EditApplicationModalContent.css';
|
||||
|
||||
const syncLevelOptions = [
|
||||
{ key: 'disabled', value: 'Disabled' },
|
||||
{ key: 'addOnly', value: 'Add and Remove Only' },
|
||||
{ key: 'fullSync', value: 'Full Sync' }
|
||||
{ key: 'disabled', value: translate('Disabled') },
|
||||
{ key: 'addOnly', value: translate('AddRemoveOnly') },
|
||||
{ key: 'fullSync', value: translate('FullSync') }
|
||||
];
|
||||
|
||||
function EditApplicationModalContent(props) {
|
||||
@@ -53,7 +53,7 @@ function EditApplicationModalContent(props) {
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>
|
||||
{`${id ? 'Edit' : 'Add'} Application`}
|
||||
{`${id ? translate('Edit') : translate('Add')} ${translate('Application')}`}
|
||||
</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
@@ -94,13 +94,13 @@ function EditApplicationModalContent(props) {
|
||||
</FormGroup>
|
||||
|
||||
<FormGroup>
|
||||
<FormLabel>{'Sync Level'}</FormLabel>
|
||||
<FormLabel>{translate('SyncLevel')}</FormLabel>
|
||||
|
||||
<FormInputGroup
|
||||
type={inputTypes.SELECT}
|
||||
values={syncLevelOptions}
|
||||
name="syncLevel"
|
||||
helpText={'Sync Level'}
|
||||
helpText={`${translate('SyncLevelAddRemove')}<br>${translate('SyncLevelFull')}`}
|
||||
{...syncLevel}
|
||||
onChange={onInputChange}
|
||||
/>
|
||||
|
||||
@@ -53,6 +53,9 @@ class AddDownloadClientModalContent extends Component {
|
||||
<div>
|
||||
|
||||
<Alert kind={kinds.INFO}>
|
||||
<div>
|
||||
{translate('AddDownloadClientToProwlarr')}
|
||||
</div>
|
||||
<div>
|
||||
{translate('ProwlarrSupportsAnyDownloadClient')}
|
||||
</div>
|
||||
|
||||
@@ -25,7 +25,7 @@ function NotificationEventItems(props) {
|
||||
<FormLabel>{translate('NotificationTriggers')}</FormLabel>
|
||||
<div>
|
||||
<FormInputHelpText
|
||||
text={translate('NotifcationTriggersHelpText')}
|
||||
text={translate('NotificationTriggersHelpText')}
|
||||
link="https://wikijs.servarr.com/prowlarr/settings#connections"
|
||||
/>
|
||||
<div className={styles.events}>
|
||||
|
||||
@@ -176,7 +176,7 @@ export const SET_MOVIE_SORT = 'indexerIndex/setMovieSort';
|
||||
export const SET_MOVIE_FILTER = 'indexerIndex/setMovieFilter';
|
||||
export const SET_MOVIE_VIEW = 'indexerIndex/setMovieView';
|
||||
export const SET_MOVIE_TABLE_OPTION = 'indexerIndex/setMovieTableOption';
|
||||
export const SAVE_MOVIE_EDITOR = 'indexerIndex/saveMovieEditor';
|
||||
export const SAVE_INDEXER_EDITOR = 'indexerIndex/saveIndexerEditor';
|
||||
export const BULK_DELETE_INDEXERS = 'indexerIndex/bulkDeleteIndexers';
|
||||
|
||||
//
|
||||
@@ -186,14 +186,14 @@ export const setMovieSort = createAction(SET_MOVIE_SORT);
|
||||
export const setMovieFilter = createAction(SET_MOVIE_FILTER);
|
||||
export const setMovieView = createAction(SET_MOVIE_VIEW);
|
||||
export const setMovieTableOption = createAction(SET_MOVIE_TABLE_OPTION);
|
||||
export const saveMovieEditor = createThunk(SAVE_MOVIE_EDITOR);
|
||||
export const saveIndexerEditor = createThunk(SAVE_INDEXER_EDITOR);
|
||||
export const bulkDeleteIndexers = createThunk(BULK_DELETE_INDEXERS);
|
||||
|
||||
//
|
||||
// Action Handlers
|
||||
|
||||
export const actionHandlers = handleThunks({
|
||||
[SAVE_MOVIE_EDITOR]: function(getState, payload, dispatch) {
|
||||
[SAVE_INDEXER_EDITOR]: function(getState, payload, dispatch) {
|
||||
dispatch(set({
|
||||
section,
|
||||
isSaving: true
|
||||
|
||||
@@ -15,32 +15,32 @@ class MoreInfo extends Component {
|
||||
return (
|
||||
<FieldSet legend={translate('MoreInfo')}>
|
||||
<DescriptionList>
|
||||
<DescriptionListItemTitle>Home page</DescriptionListItemTitle>
|
||||
<DescriptionListItemTitle>{translate('HomePage')}</DescriptionListItemTitle>
|
||||
<DescriptionListItemDescription>
|
||||
<Link to="https://prowlarr.com/">prowlarr.com</Link>
|
||||
</DescriptionListItemDescription>
|
||||
|
||||
<DescriptionListItemTitle>Discord</DescriptionListItemTitle>
|
||||
<DescriptionListItemDescription>
|
||||
<Link to="https://prowlarr.com/discord">prowlarr.com/discord</Link>
|
||||
</DescriptionListItemDescription>
|
||||
|
||||
<DescriptionListItemTitle>Wiki</DescriptionListItemTitle>
|
||||
<DescriptionListItemTitle>{translate('Wiki')}</DescriptionListItemTitle>
|
||||
<DescriptionListItemDescription>
|
||||
<Link to="https://wikijs.servarr.com/prowlarr">wikijs.servarr.com/prowlarr</Link>
|
||||
</DescriptionListItemDescription>
|
||||
|
||||
<DescriptionListItemTitle>Donations</DescriptionListItemTitle>
|
||||
<DescriptionListItemTitle>{translate('Reddit')}</DescriptionListItemTitle>
|
||||
<DescriptionListItemDescription>
|
||||
<Link to="https://opencollective.com/prowlarr">opencollective.com/prowlarr</Link>
|
||||
<Link to="https://reddit.com/r/prowlarr">r/prowlarr</Link>
|
||||
</DescriptionListItemDescription>
|
||||
|
||||
<DescriptionListItemTitle>Source</DescriptionListItemTitle>
|
||||
<DescriptionListItemTitle>{translate('Discord')}</DescriptionListItemTitle>
|
||||
<DescriptionListItemDescription>
|
||||
<Link to="https://prowlarr.com/discord">prowlarr.com/discord</Link>
|
||||
</DescriptionListItemDescription>
|
||||
|
||||
<DescriptionListItemTitle>{translate('Source')}</DescriptionListItemTitle>
|
||||
<DescriptionListItemDescription>
|
||||
<Link to="https://github.com/Prowlarr/Prowlarr/">github.com/Prowlarr/Prowlarr</Link>
|
||||
</DescriptionListItemDescription>
|
||||
|
||||
<DescriptionListItemTitle>Feature Requests</DescriptionListItemTitle>
|
||||
<DescriptionListItemTitle>{translate('FeatureRequests')}</DescriptionListItemTitle>
|
||||
<DescriptionListItemDescription>
|
||||
<Link to="https://github.com/Prowlarr/Prowlarr/issues">github.com/Prowlarr/Prowlarr/issues</Link>
|
||||
</DescriptionListItemDescription>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
.logoContainer {
|
||||
display: inline-block;
|
||||
margin: 1em;
|
||||
margin: 0.5em;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
outline: none;
|
||||
|
||||
@@ -24,7 +24,7 @@ class UpdateChanges extends Component {
|
||||
<ul>
|
||||
{
|
||||
changes.map((change, index) => {
|
||||
const checkChange = change.replace(/#\d{4,5}\b/g, (match, contents) => {
|
||||
const checkChange = change.replace(/#\d{3,5}\b/g, (match, contents) => {
|
||||
return `[${match}](https://github.com/Prowlarr/Prowlarr/issues/${match.substring(1)})`;
|
||||
});
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@ namespace NzbDrone.Common.Test.InstrumentationTests
|
||||
[TestCase(@"https://baconbits.org/feeds.php?feed=torrents_tv&user=12345&auth=2b51db35e1910123321025a12b9933d2&passkey=mySecret&authkey=2b51db35e1910123321025a12b9933d2")]
|
||||
[TestCase(@"http://127.0.0.1:9117/dl/indexername?jackett_apikey=flwjiefewklfjacketmySecretsdfldskjfsdlk&path=we0re9f0sdfbase64sfdkfjsdlfjk&file=The+Torrent+File+Name.torrent")]
|
||||
[TestCase(@"http://nzb.su/getnzb/2b51db35e1912ffc138825a12b9933d2.nzb&i=37292&r=2b51db35e1910123321025a12b9933d2")]
|
||||
[TestCase(@"https://horrorcharnel.org/takeloginhorror.php: username=mySecret&password=mySecret&use_sslvalue==&perm_ssl=1&submitme=X&use_ssl=1&returnto=%2F&captchaSelection=1230456")]
|
||||
[TestCase(@"https://torrentdb.net/login: _token=2b51db35e1912ffc138825a12b9933d2&username=mySecret&password=mySecret&remember=on")]
|
||||
|
||||
// NzbGet
|
||||
[TestCase(@"{ ""Name"" : ""ControlUsername"", ""Value"" : ""mySecret"" }, { ""Name"" : ""ControlPassword"", ""Value"" : ""mySecret"" }, ")]
|
||||
|
||||
@@ -84,6 +84,13 @@ namespace NzbDrone.Common.Http
|
||||
throw new WebException($"Too many automatic redirections were attempted for {autoRedirectChain.Join(" -> ")}", WebExceptionStatus.ProtocolError);
|
||||
}
|
||||
|
||||
// 302 or 303 should default to GET on redirect even if POST on original
|
||||
if (response.StatusCode == HttpStatusCode.Redirect || response.StatusCode == HttpStatusCode.RedirectMethod)
|
||||
{
|
||||
request.Method = HttpMethod.GET;
|
||||
request.ContentData = null;
|
||||
}
|
||||
|
||||
response = await ExecuteRequestAsync(request, cookieContainer);
|
||||
}
|
||||
while (response.HasHttpRedirect);
|
||||
|
||||
@@ -62,6 +62,20 @@ namespace NzbDrone.Common.Http
|
||||
StatusCode == HttpStatusCode.TemporaryRedirect ||
|
||||
StatusCode == HttpStatusCode.Found;
|
||||
|
||||
public string RedirectUrl
|
||||
{
|
||||
get
|
||||
{
|
||||
var newUrl = Headers["Location"];
|
||||
if (newUrl == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return (Request.Url += new HttpUri(newUrl)).FullUri;
|
||||
}
|
||||
}
|
||||
|
||||
public string[] GetCookieHeaders()
|
||||
{
|
||||
return Headers.GetValues("Set-Cookie") ?? Array.Empty<string>();
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace NzbDrone.Common.Instrumentation
|
||||
{
|
||||
// Url
|
||||
new Regex(@"(?<=\?|&|: |;)(apikey|token|passkey|auth|authkey|user|uid|api|[a-z_]*apikey|account|passwd)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"(?<=\?|&)[^=]*?(username|password)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"(?<=\?|&| )[^=]*?(_?token|username|password)=(?<secret>[^&=]+?)(?= |&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"torrentleech\.org/(?!rss)(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"torrentleech\.org/rss/download/[0-9]+/(?<secret>[0-9a-z]+)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
new Regex(@"iptorrents\.com/[/a-z0-9?&;]*?(?:[?&;](u|tp)=(?<secret>[^&=;]+?))+(?= |;|&|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase),
|
||||
@@ -77,7 +77,6 @@ namespace NzbDrone.Common.Instrumentation
|
||||
private static string CleanseRemoteIP(Match match)
|
||||
{
|
||||
var group = match.Groups[1];
|
||||
var valueAll = match.Value;
|
||||
var valueIP = group.Value;
|
||||
|
||||
if (IPAddress.TryParse(valueIP, out var address) && !address.IsLocalAddress())
|
||||
|
||||
@@ -33,14 +33,8 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks
|
||||
Subject.Check().ShouldBeWarning();
|
||||
}
|
||||
|
||||
[TestCase("Develop")]
|
||||
[TestCase("develop")]
|
||||
public void should_return_error_when_branch_is_v1(string branch)
|
||||
{
|
||||
GivenValidBranch(branch);
|
||||
|
||||
Subject.Check().ShouldBeError();
|
||||
}
|
||||
|
||||
[TestCase("nightly")]
|
||||
[TestCase("Nightly")]
|
||||
public void should_return_no_warning_when_branch_valid(string branch)
|
||||
|
||||
@@ -2,6 +2,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.Indexers.FileList;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
@@ -21,6 +22,33 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests
|
||||
Username = "somename"
|
||||
};
|
||||
|
||||
Subject.Capabilities = new IndexerCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q, MovieSearchParam.ImdbId
|
||||
},
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
MusicSearchParam.Q
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
BookSearchParam.Q
|
||||
},
|
||||
Flags = new List<IndexerFlag>
|
||||
{
|
||||
IndexerFlag.FreeLeech
|
||||
}
|
||||
};
|
||||
|
||||
Subject.Capabilities.Categories.AddCategoryMapping(1, NewznabStandardCategory.MoviesSD, "Filme SD");
|
||||
Subject.Capabilities.Categories.AddCategoryMapping(2, NewznabStandardCategory.MoviesDVD, "Filme DVD");
|
||||
|
||||
_movieSearchCriteria = new MovieSearchCriteria
|
||||
{
|
||||
SearchTerm = "Star Wars",
|
||||
@@ -38,7 +66,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests
|
||||
[Test]
|
||||
public void should_use_categories_for_feed()
|
||||
{
|
||||
var results = Subject.GetSearchRequests(new MovieSearchCriteria { Categories = new int[] { 1, 2 } });
|
||||
var results = Subject.GetSearchRequests(new MovieSearchCriteria { Categories = new int[] { NewznabStandardCategory.MoviesSD.Id, NewznabStandardCategory.MoviesDVD.Id } });
|
||||
|
||||
results.GetAllTiers().Should().HaveCount(1);
|
||||
|
||||
@@ -50,7 +78,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests
|
||||
[Test]
|
||||
public void should_not_search_by_imdbid_if_not_supported()
|
||||
{
|
||||
_movieSearchCriteria.ImdbId = "tt0076759";
|
||||
_movieSearchCriteria.ImdbId = "0076759";
|
||||
var results = Subject.GetSearchRequests(_movieSearchCriteria);
|
||||
|
||||
results.GetAllTiers().Should().HaveCount(1);
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
|
||||
_movieSearchCriteria = new MovieSearchCriteria
|
||||
{
|
||||
Categories = new int[] { 2000, 2010 },
|
||||
ImdbId = "tt0076759"
|
||||
ImdbId = "0076759"
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
|
||||
_movieSearchCriteria = new MovieSearchCriteria
|
||||
{
|
||||
Categories = new int[] { 2000, 2010 },
|
||||
ImdbId = "tt0076759"
|
||||
ImdbId = "0076759"
|
||||
};
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace NzbDrone.Core.Test.IndexerTests.HDBitsTests
|
||||
public void should_search_by_imdbid_if_supported()
|
||||
{
|
||||
var results = Subject.GetSearchRequests(_movieSearchCriteria);
|
||||
var imdbQuery = int.Parse(_movieSearchCriteria.ImdbId.Substring(2));
|
||||
var imdbQuery = int.Parse(_movieSearchCriteria.ImdbId);
|
||||
|
||||
results.GetAllTiers().Should().HaveCount(1);
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Applications.Lidarr
|
||||
|
||||
return other.EnableRss == EnableRss &&
|
||||
other.EnableAutomaticSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableInteractiveSearch &&
|
||||
other.Name == Name &&
|
||||
other.Implementation == Implementation &&
|
||||
other.Priority == Priority &&
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Applications.Radarr
|
||||
|
||||
return other.EnableRss == EnableRss &&
|
||||
other.EnableAutomaticSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableInteractiveSearch &&
|
||||
other.Name == Name &&
|
||||
other.Implementation == Implementation &&
|
||||
other.Priority == Priority &&
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Applications.Readarr
|
||||
|
||||
return other.EnableRss == EnableRss &&
|
||||
other.EnableAutomaticSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableInteractiveSearch &&
|
||||
other.Name == Name &&
|
||||
other.Implementation == Implementation &&
|
||||
other.Priority == Priority &&
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace NzbDrone.Core.Applications.Sonarr
|
||||
|
||||
return other.EnableRss == EnableRss &&
|
||||
other.EnableAutomaticSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableAutomaticSearch &&
|
||||
other.EnableInteractiveSearch == EnableInteractiveSearch &&
|
||||
other.Name == Name &&
|
||||
other.Implementation == Implementation &&
|
||||
other.Priority == Priority &&
|
||||
|
||||
@@ -23,11 +23,6 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||
|
||||
if (!Enum.GetNames(typeof(ReleaseBranches)).Any(x => x.ToLower() == currentBranch))
|
||||
{
|
||||
if (currentBranch == "develop")
|
||||
{
|
||||
return new HealthCheck(GetType(), HealthCheckResult.Error, string.Format(_localizationService.GetLocalizedString("ReleaseBranchCheckPreviousVersionMessage"), _configFileService.Branch), "#branch-is-for-a-previous-version");
|
||||
}
|
||||
|
||||
return new HealthCheck(GetType(), HealthCheckResult.Warning, string.Format(_localizationService.GetLocalizedString("ReleaseBranchCheckOfficialBranchMessage"), _configFileService.Branch), "#branch-is-not-a-valid-release-branch");
|
||||
}
|
||||
|
||||
@@ -36,6 +31,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||
|
||||
public enum ReleaseBranches
|
||||
{
|
||||
Develop,
|
||||
Nightly
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,14 +119,14 @@ namespace NzbDrone.Core.History
|
||||
|
||||
if (message.Query is MovieSearchCriteria)
|
||||
{
|
||||
history.Data.Add("ImdbId", ((MovieSearchCriteria)message.Query).ImdbId ?? string.Empty);
|
||||
history.Data.Add("ImdbId", ((MovieSearchCriteria)message.Query).FullImdbId ?? string.Empty);
|
||||
history.Data.Add("TmdbId", ((MovieSearchCriteria)message.Query).TmdbId?.ToString() ?? string.Empty);
|
||||
history.Data.Add("TraktId", ((MovieSearchCriteria)message.Query).TraktId?.ToString() ?? string.Empty);
|
||||
}
|
||||
|
||||
if (message.Query is TvSearchCriteria)
|
||||
{
|
||||
history.Data.Add("ImdbId", ((TvSearchCriteria)message.Query).ImdbId ?? string.Empty);
|
||||
history.Data.Add("ImdbId", ((TvSearchCriteria)message.Query).FullImdbId ?? string.Empty);
|
||||
history.Data.Add("TvdbId", ((TvSearchCriteria)message.Query).TvdbId?.ToString() ?? string.Empty);
|
||||
history.Data.Add("TraktId", ((TvSearchCriteria)message.Query).TraktId?.ToString() ?? string.Empty);
|
||||
history.Data.Add("RId", ((TvSearchCriteria)message.Query).RId?.ToString() ?? string.Empty);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Parser;
|
||||
|
||||
namespace NzbDrone.Core.IndexerSearch.Definitions
|
||||
{
|
||||
@@ -20,5 +21,7 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public string FullImdbId => ParseUtil.GetFullImdbId(ImdbId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
|
||||
public string SanitizedTvSearchString => (SanitizedSearchTerm + " " + EpisodeSearchString).Trim();
|
||||
public string EpisodeSearchString => GetEpisodeSearchString();
|
||||
|
||||
public string FullImdbId => ParseUtil.GetFullImdbId(ImdbId);
|
||||
|
||||
public override bool RssSearch
|
||||
{
|
||||
get
|
||||
|
||||
@@ -80,13 +80,13 @@ namespace NzbDrone.Core.IndexerSearch
|
||||
r.InfoUrl == null ? null : new XElement("comments", r.InfoUrl),
|
||||
r.PublishDate == DateTime.MinValue ? new XElement("pubDate", XmlDateFormat(DateTime.Now)) : new XElement("pubDate", XmlDateFormat(r.PublishDate)),
|
||||
new XElement("size", r.Size),
|
||||
r.Category == null ? null : from c in r.Category select new XElement("category", c.Id),
|
||||
r.Categories == null ? null : from c in r.Categories select new XElement("category", c.Id),
|
||||
new XElement(
|
||||
"enclosure",
|
||||
new XAttribute("url", r.DownloadUrl ?? t.MagnetUrl ?? string.Empty),
|
||||
r.Size == null ? null : new XAttribute("length", r.Size),
|
||||
new XAttribute("type", protocol == DownloadProtocol.Torrent ? "application/x-bittorrent" : "application/x-nzb")),
|
||||
r.Category == null ? null : from c in r.Category select GetNabElement("category", c.Id, protocol),
|
||||
r.Categories == null ? null : from c in r.Categories select GetNabElement("category", c.Id, protocol),
|
||||
r.IndexerFlags == null ? null : from f in r.IndexerFlags select GetNabElement("tag", f.Name, protocol),
|
||||
GetNabElement("rageid", r.TvRageId, protocol),
|
||||
GetNabElement("thetvdb", r.TvdbId, protocol),
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace NzbDrone.Core.IndexerVersions
|
||||
public class IndexerDefinitionUpdateService : IIndexerDefinitionUpdateService, IExecute<IndexerDefinitionUpdateCommand>
|
||||
{
|
||||
private const int DEFINITION_VERSION = 1;
|
||||
private readonly List<string> _defintionBlacklist = new List<string>() { "blutopia", "beyond-hd", "beyond-hd-oneurl", "hdbits" };
|
||||
private readonly List<string> _defintionBlacklist = new List<string>() { "aither", "animeworld", "blutopia", "beyond-hd", "beyond-hd-oneurl", "hdbits" };
|
||||
|
||||
private readonly IHttpClient _httpClient;
|
||||
private readonly IAppFolderInfo _appFolderInfo;
|
||||
|
||||
59
src/NzbDrone.Core/Indexers/Definitions/Aither.cs
Normal file
59
src/NzbDrone.Core/Indexers/Definitions/Aither.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers.Definitions.UNIT3D;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
public class Aither : Unit3dBase
|
||||
{
|
||||
public override string Name => "Aither";
|
||||
public override string BaseUrl => "https://aither.cc/";
|
||||
public override string Description => "Aither is a Private Torrent Tracker for HD MOVIES / TV";
|
||||
public override string Language => "en-us";
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
|
||||
|
||||
public Aither(IHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger)
|
||||
: base(httpClient, eventAggregator, indexerStatusService, configService, logger)
|
||||
{
|
||||
}
|
||||
|
||||
protected override IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.ImdbId, TvSearchParam.TvdbId
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q, MovieSearchParam.ImdbId, MovieSearchParam.TmdbId
|
||||
},
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
MusicSearchParam.Q
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
BookSearchParam.Q
|
||||
}
|
||||
};
|
||||
|
||||
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.Movies, "Movie");
|
||||
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TV, "TV");
|
||||
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.Audio, "Music");
|
||||
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.PCGames, "Games");
|
||||
caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.XXX, "XXX");
|
||||
caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.TVSport, "Sport");
|
||||
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.PC, "Software/Apps");
|
||||
caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.BooksEBook, "Ebooks/Magazines");
|
||||
caps.Categories.AddCategoryMapping(14, NewznabStandardCategory.AudioAudiobook, "AudioBooks");
|
||||
caps.Categories.AddCategoryMapping(15, NewznabStandardCategory.Other, "Education");
|
||||
|
||||
return caps;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -449,7 +449,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
Guid = guid.AbsoluteUri,
|
||||
DownloadUrl = linkUri.AbsoluteUri,
|
||||
PublishDate = publishDate,
|
||||
Category = category,
|
||||
Categories = category,
|
||||
Description = description,
|
||||
Size = size,
|
||||
Seeders = seeders,
|
||||
|
||||
@@ -294,7 +294,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
rCat = rCat.Substring(rCatIdx + 4);
|
||||
}
|
||||
|
||||
release.Category = _categories.MapTrackerCatToNewznab(rCat);
|
||||
release.Categories = _categories.MapTrackerCatToNewznab(rCat);
|
||||
|
||||
if (row.QuerySelector("img[alt=\"Gold Torrent\"]") != null)
|
||||
{
|
||||
|
||||
61
src/NzbDrone.Core/Indexers/Definitions/AnimeWorld.cs
Normal file
61
src/NzbDrone.Core/Indexers/Definitions/AnimeWorld.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System.Collections.Generic;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers.Definitions.UNIT3D;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
public class AnimeWorld : Unit3dBase
|
||||
{
|
||||
public override string Name => "AnimeWorld";
|
||||
public override string BaseUrl => "https://animeworld.cx/";
|
||||
public override string Description => "AnimeWorld (AW) is a GERMAN Private site for ANIME / MANGA / HENTAI";
|
||||
public override string Language => "de-de";
|
||||
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
|
||||
public AnimeWorld(IHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger)
|
||||
: base(httpClient, eventAggregator, indexerStatusService, configService, logger)
|
||||
{
|
||||
}
|
||||
|
||||
protected override IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep, TvSearchParam.ImdbId, TvSearchParam.TvdbId
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q, MovieSearchParam.ImdbId, MovieSearchParam.TmdbId
|
||||
},
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
MusicSearchParam.Q
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
BookSearchParam.Q
|
||||
}
|
||||
};
|
||||
|
||||
caps.Categories.AddCategoryMapping(1, NewznabStandardCategory.Movies, "Anime Movie");
|
||||
caps.Categories.AddCategoryMapping(2, NewznabStandardCategory.TVAnime, "Anime Series");
|
||||
caps.Categories.AddCategoryMapping(3, NewznabStandardCategory.Audio, "Anime Musik/OST");
|
||||
caps.Categories.AddCategoryMapping(4, NewznabStandardCategory.PCGames, "Anime Spiele");
|
||||
caps.Categories.AddCategoryMapping(5, NewznabStandardCategory.XXX, "Hentai");
|
||||
caps.Categories.AddCategoryMapping(6, NewznabStandardCategory.PCGames, "Spiele Linux");
|
||||
caps.Categories.AddCategoryMapping(7, NewznabStandardCategory.Other, "Sonstiges");
|
||||
caps.Categories.AddCategoryMapping(8, NewznabStandardCategory.Movies, "Filme");
|
||||
caps.Categories.AddCategoryMapping(9, NewznabStandardCategory.TV, "Serien");
|
||||
caps.Categories.AddCategoryMapping(10, NewznabStandardCategory.PCGames, "Spiele");
|
||||
caps.Categories.AddCategoryMapping(11, NewznabStandardCategory.Audio, "Musik");
|
||||
caps.Categories.AddCategoryMapping(12, NewznabStandardCategory.BooksComics, "Mangas");
|
||||
|
||||
return caps;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,11 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
|
||||
{
|
||||
var torrentInfos = new List<TorrentInfo>();
|
||||
|
||||
if (indexerResponse.HttpResponse.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
return torrentInfos.ToArray();
|
||||
}
|
||||
|
||||
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
throw new IndexerException(indexerResponse, $"Unexpected response status {indexerResponse.HttpResponse.StatusCode} code from API request");
|
||||
@@ -50,7 +55,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
|
||||
InfoHash = row.InfoHash,
|
||||
InfoUrl = details,
|
||||
Guid = details,
|
||||
Category = cats,
|
||||
Categories = cats,
|
||||
PublishDate = row.CreatedAt,
|
||||
Size = row.FileSize,
|
||||
Files = row.FileCount,
|
||||
|
||||
@@ -74,9 +74,9 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
|
||||
{
|
||||
var parameters = GetBasicSearchParameters(searchCriteria.Categories);
|
||||
|
||||
if (searchCriteria.ImdbId != null)
|
||||
if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
parameters.Add("imdb", searchCriteria.ImdbId);
|
||||
parameters.Add("imdb", searchCriteria.FullImdbId);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -103,9 +103,9 @@ namespace NzbDrone.Core.Indexers.Definitions.Avistaz
|
||||
{
|
||||
var parameters = GetBasicSearchParameters(searchCriteria.Categories);
|
||||
|
||||
if (searchCriteria.ImdbId != null)
|
||||
if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
parameters.Add("imdb", searchCriteria.ImdbId);
|
||||
parameters.Add("imdb", searchCriteria.FullImdbId);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -297,7 +297,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
release.Title = release.Title.Substring(0, insertPoint) + " Season 1 " + release.Title.Substring(insertPoint);
|
||||
}
|
||||
|
||||
release.Category = currentCategories;
|
||||
release.Categories = currentCategories;
|
||||
|
||||
//release.Description = row.QuerySelector("span.tags")?.TextContent;
|
||||
release.Guid = _baseUrl + qTitleLink.GetAttribute("href");
|
||||
|
||||
@@ -123,7 +123,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.ImdbId, searchCriteria.TmdbId.GetValueOrDefault()));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId, searchCriteria.TmdbId.GetValueOrDefault()));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -141,7 +141,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -209,7 +209,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
InfoHash = row.InfoHash,
|
||||
InfoUrl = details,
|
||||
Guid = details,
|
||||
Category = _categories.MapTrackerCatDescToNewznab(row.Category),
|
||||
Categories = _categories.MapTrackerCatDescToNewznab(row.Category),
|
||||
PublishDate = DateTime.Parse(row.CreatedAt, CultureInfo.InvariantCulture),
|
||||
Size = row.Size,
|
||||
Grabs = row.Grabs,
|
||||
|
||||
@@ -104,12 +104,12 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
|
||||
torrentInfo.DownloadVolumeFactor = 0;
|
||||
torrentInfo.MinimumRatio = 1;
|
||||
|
||||
torrentInfo.Category = _categories.MapTrackerCatToNewznab(torrent.Resolution);
|
||||
torrentInfo.Categories = _categories.MapTrackerCatToNewznab(torrent.Resolution);
|
||||
|
||||
// Default to TV if category could not be mapped
|
||||
if (torrentInfo.Category == null || !torrentInfo.Category.Any())
|
||||
if (torrentInfo.Categories == null || !torrentInfo.Categories.Any())
|
||||
{
|
||||
torrentInfo.Category = new List<IndexerCategory> { NewznabStandardCategory.TV };
|
||||
torrentInfo.Categories = new List<IndexerCategory> { NewznabStandardCategory.TV };
|
||||
}
|
||||
|
||||
results.Add(torrentInfo);
|
||||
|
||||
@@ -107,6 +107,7 @@ namespace NzbDrone.Core.Indexers.Cardigann
|
||||
{
|
||||
Enable = true,
|
||||
Name = definition.Name,
|
||||
Language = definition.Language,
|
||||
Implementation = GetType().Name,
|
||||
Settings = new CardigannSettings { DefinitionFile = definition.File },
|
||||
Protocol = DownloadProtocol.Torrent,
|
||||
|
||||
@@ -237,7 +237,7 @@ namespace NzbDrone.Core.Indexers.Cardigann
|
||||
}
|
||||
else if (setting.Type == "checkbox")
|
||||
{
|
||||
variables[name] = ((bool)value) ? ".True" : ".False";
|
||||
variables[name] = ((bool)value) ? ".True" : null;
|
||||
}
|
||||
else if (setting.Type == "select")
|
||||
{
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace NzbDrone.Core.Indexers.Cardigann
|
||||
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
// Remove cookie cache
|
||||
if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.Headers["Location"]
|
||||
if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.RedirectUrl
|
||||
.ContainsIgnoreCase("login.php"))
|
||||
{
|
||||
CookiesUpdater(null, null);
|
||||
@@ -194,17 +194,17 @@ namespace NzbDrone.Core.Indexers.Cardigann
|
||||
var cats = MapTrackerCatToNewznab(value);
|
||||
if (cats.Any())
|
||||
{
|
||||
if (release.Category == null || fieldModifiers.Contains("noappend"))
|
||||
if (release.Categories == null || fieldModifiers.Contains("noappend"))
|
||||
{
|
||||
release.Category = cats;
|
||||
release.Categories = cats;
|
||||
}
|
||||
else
|
||||
{
|
||||
release.Category = release.Category.Union(cats).ToList();
|
||||
release.Categories = release.Categories.Union(cats).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
value = release.Category.ToString();
|
||||
value = release.Categories.ToString();
|
||||
break;
|
||||
case "size":
|
||||
release.Size = ReleaseInfo.GetBytes(value);
|
||||
|
||||
@@ -43,8 +43,8 @@ namespace NzbDrone.Core.Indexers.Cardigann
|
||||
|
||||
variables[".Query.Movie"] = null;
|
||||
variables[".Query.Year"] = null;
|
||||
variables[".Query.IMDBID"] = searchCriteria.ImdbId;
|
||||
variables[".Query.IMDBIDShort"] = searchCriteria.ImdbId?.TrimStart('t') ?? null;
|
||||
variables[".Query.IMDBID"] = searchCriteria.FullImdbId;
|
||||
variables[".Query.IMDBIDShort"] = searchCriteria.ImdbId;
|
||||
variables[".Query.TMDBID"] = searchCriteria.TmdbId;
|
||||
variables[".Query.TraktID"] = searchCriteria.TraktId;
|
||||
|
||||
@@ -78,8 +78,8 @@ namespace NzbDrone.Core.Indexers.Cardigann
|
||||
variables[".Query.Series"] = null;
|
||||
variables[".Query.Ep"] = searchCriteria.Episode;
|
||||
variables[".Query.Season"] = searchCriteria.Season;
|
||||
variables[".Query.IMDBID"] = searchCriteria.ImdbId;
|
||||
variables[".Query.IMDBIDShort"] = searchCriteria.ImdbId?.Replace("tt", "") ?? null;
|
||||
variables[".Query.IMDBID"] = searchCriteria.FullImdbId;
|
||||
variables[".Query.IMDBIDShort"] = searchCriteria.ImdbId;
|
||||
variables[".Query.TVDBID"] = searchCriteria.TvdbId;
|
||||
variables[".Query.TVRageID"] = searchCriteria.RId;
|
||||
variables[".Query.TVMazeID"] = searchCriteria.TvMazeId;
|
||||
@@ -635,14 +635,14 @@ namespace NzbDrone.Core.Indexers.Cardigann
|
||||
{
|
||||
if (requestUrl.StartsWith(SiteLink) && !redirectUrl.StartsWith(SiteLink))
|
||||
{
|
||||
var uri = new Uri(redirectUrl);
|
||||
var uri = new HttpUri(redirectUrl);
|
||||
return uri.Scheme + "://" + uri.Host + "/";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected string GetRedirectDomainHint(HttpResponse result) => GetRedirectDomainHint(result.Request.Url.ToString(), result.Headers.GetSingleValue("Location"));
|
||||
protected string GetRedirectDomainHint(HttpResponse result) => GetRedirectDomainHint(result.Request.Url.ToString(), result.RedirectUrl);
|
||||
|
||||
protected async Task<HttpResponse> HandleRequest(RequestBlock request, Dictionary<string, object> variables = null, string referer = null)
|
||||
{
|
||||
|
||||
@@ -179,7 +179,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -197,7 +197,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -262,7 +262,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
release.MinimumRatio = 1.1;
|
||||
release.MinimumSeedTime = 432000; // 120 hours
|
||||
release.Title = row.name;
|
||||
release.Category = _categories.MapTrackerCatToNewznab(row.category.ToString());
|
||||
release.Categories = _categories.MapTrackerCatToNewznab(row.category.ToString());
|
||||
release.Size = row.size;
|
||||
release.Seeders = row.seeders;
|
||||
release.Peers = row.leechers + release.Seeders;
|
||||
|
||||
@@ -24,12 +24,12 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
|
||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||
{
|
||||
return new FileListRequestGenerator() { Settings = Settings, BaseUrl = BaseUrl };
|
||||
return new FileListRequestGenerator() { Settings = Settings, BaseUrl = BaseUrl, Capabilities = Capabilities };
|
||||
}
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
{
|
||||
return new FileListParser(Settings, BaseUrl);
|
||||
return new FileListParser(Settings, BaseUrl, Capabilities.Categories);
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
|
||||
@@ -22,5 +22,6 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
public bool DoubleUp { get; set; }
|
||||
[JsonProperty(PropertyName = "upload_date")]
|
||||
public DateTime UploadDate { get; set; }
|
||||
public string Category { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,11 +12,13 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
{
|
||||
private readonly string _baseUrl;
|
||||
private readonly FileListSettings _settings;
|
||||
private readonly IndexerCapabilitiesCategories _categories;
|
||||
|
||||
public FileListParser(FileListSettings settings, string baseUrl)
|
||||
public FileListParser(FileListSettings settings, string baseUrl, IndexerCapabilitiesCategories categories)
|
||||
{
|
||||
_settings = settings;
|
||||
_baseUrl = baseUrl;
|
||||
_categories = categories;
|
||||
}
|
||||
|
||||
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
|
||||
@@ -57,6 +59,7 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
Guid = string.Format("FileList-{0}", id),
|
||||
Title = result.Name,
|
||||
Size = result.Size,
|
||||
Categories = _categories.MapTrackerCatDescToNewznab(result.Category),
|
||||
DownloadUrl = GetDownloadUrl(id),
|
||||
InfoUrl = GetInfoUrl(id),
|
||||
Seeders = result.Seeders,
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
{
|
||||
public string BaseUrl { get; set; }
|
||||
public FileListSettings Settings { get; set; }
|
||||
public IndexerCapabilities Capabilities { get; set; }
|
||||
public Func<IDictionary<string, string>> GetCookies { get; set; }
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
|
||||
@@ -20,7 +21,7 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
|
||||
if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
pageableRequests.Add(GetRequest("search-torrents", searchCriteria.Categories, string.Format("&type=imdb&query={0}", searchCriteria.ImdbId)));
|
||||
pageableRequests.Add(GetRequest("search-torrents", searchCriteria.Categories, string.Format("&type=imdb&query={0}", searchCriteria.FullImdbId)));
|
||||
}
|
||||
else if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
@@ -57,7 +58,7 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
|
||||
if (searchCriteria.ImdbId.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
pageableRequests.Add(GetRequest("search-torrents", searchCriteria.Categories, string.Format("&type=imdb&query={0}&season={1}&episode={2}", searchCriteria.ImdbId, searchCriteria.Season, searchCriteria.Episode)));
|
||||
pageableRequests.Add(GetRequest("search-torrents", searchCriteria.Categories, string.Format("&type=imdb&query={0}&season={1}&episode={2}", searchCriteria.FullImdbId, searchCriteria.Season, searchCriteria.Episode)));
|
||||
}
|
||||
else if (searchCriteria.SearchTerm.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
@@ -106,7 +107,7 @@ namespace NzbDrone.Core.Indexers.FileList
|
||||
|
||||
private IEnumerable<IndexerRequest> GetRequest(string searchType, int[] categories, string parameters)
|
||||
{
|
||||
var categoriesQuery = string.Join(",", categories.Distinct());
|
||||
var categoriesQuery = string.Join(",", Capabilities.Categories.MapTorznabCapsToTrackers(categories));
|
||||
|
||||
var baseUrl = string.Format("{0}/api.php?action={1}&category={2}&username={3}&passkey={4}{5}", BaseUrl.TrimEnd('/'), searchType, categoriesQuery, Settings.Username.Trim(), Settings.Passkey.Trim(), parameters);
|
||||
|
||||
|
||||
@@ -88,11 +88,11 @@ namespace NzbDrone.Core.Indexers.Gazelle
|
||||
var category = torrent.Category;
|
||||
if (category == null || category.Contains("Select Category"))
|
||||
{
|
||||
release.Category = _capabilities.Categories.MapTrackerCatToNewznab("1");
|
||||
release.Categories = _capabilities.Categories.MapTrackerCatToNewznab("1");
|
||||
}
|
||||
else
|
||||
{
|
||||
release.Category = _capabilities.Categories.MapTrackerCatDescToNewznab(category);
|
||||
release.Categories = _capabilities.Categories.MapTrackerCatDescToNewznab(category);
|
||||
}
|
||||
|
||||
torrentInfos.Add(release);
|
||||
@@ -120,11 +120,11 @@ namespace NzbDrone.Core.Indexers.Gazelle
|
||||
var category = result.Category;
|
||||
if (category == null || category.Contains("Select Category"))
|
||||
{
|
||||
release.Category = _capabilities.Categories.MapTrackerCatToNewznab("1");
|
||||
release.Categories = _capabilities.Categories.MapTrackerCatToNewznab("1");
|
||||
}
|
||||
else
|
||||
{
|
||||
release.Category = _capabilities.Categories.MapTrackerCatDescToNewznab(category);
|
||||
release.Categories = _capabilities.Categories.MapTrackerCatDescToNewznab(category);
|
||||
}
|
||||
|
||||
torrentInfos.Add(release);
|
||||
|
||||
@@ -170,7 +170,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -188,7 +188,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -335,7 +335,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
DownloadUrl = link.AbsoluteUri,
|
||||
InfoUrl = details.AbsoluteUri,
|
||||
PublishDate = publishDate,
|
||||
Category = cat,
|
||||
Categories = cat,
|
||||
ImdbId = imdb ?? 0,
|
||||
Size = size,
|
||||
Grabs = grabs,
|
||||
|
||||
@@ -42,6 +42,11 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
return new IPTorrentsParser(Settings, Capabilities.Categories, BaseUrl);
|
||||
}
|
||||
|
||||
protected override IDictionary<string, string> GetCookies()
|
||||
{
|
||||
return CookieUtil.CookieHeaderToDictionary(Settings.Cookie);
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
@@ -120,6 +125,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
caps.Categories.AddCategoryMapping(86, NewznabStandardCategory.PC0day, "Appz/Non-English");
|
||||
caps.Categories.AddCategoryMapping(64, NewznabStandardCategory.AudioAudiobook, "AudioBook");
|
||||
caps.Categories.AddCategoryMapping(35, NewznabStandardCategory.Books, "Books");
|
||||
caps.Categories.AddCategoryMapping(102, NewznabStandardCategory.Books, "Books/Non-English");
|
||||
caps.Categories.AddCategoryMapping(94, NewznabStandardCategory.BooksComics, "Books/Comics");
|
||||
caps.Categories.AddCategoryMapping(95, NewznabStandardCategory.BooksOther, "Books/Educational");
|
||||
caps.Categories.AddCategoryMapping(98, NewznabStandardCategory.Other, "Other/Fonts");
|
||||
@@ -172,11 +178,6 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
var request = new IndexerRequest(searchUrl, HttpAccept.Html);
|
||||
|
||||
foreach (var cookie in CookieUtil.CookieHeaderToDictionary(Settings.Cookie))
|
||||
{
|
||||
request.HttpRequest.Cookies.Add(cookie.Key, cookie.Value);
|
||||
}
|
||||
|
||||
yield return request;
|
||||
}
|
||||
|
||||
@@ -184,7 +185,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -202,7 +203,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -307,7 +308,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
DownloadUrl = link.AbsoluteUri,
|
||||
InfoUrl = details.AbsoluteUri,
|
||||
PublishDate = publishDate,
|
||||
Category = cat,
|
||||
Categories = cat,
|
||||
Size = size,
|
||||
Files = files,
|
||||
Grabs = grabs,
|
||||
|
||||
@@ -186,7 +186,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -204,7 +204,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -290,7 +290,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
catLink = catLink.Substring(catSplit + 9);
|
||||
}
|
||||
|
||||
release.Category = _categories.MapTrackerCatToNewznab(catLink);
|
||||
release.Categories = _categories.MapTrackerCatToNewznab(catLink);
|
||||
|
||||
var grabs = row.QuerySelector("td:nth-child(6)").TextContent;
|
||||
release.Grabs = ParseUtil.CoerceInt(grabs);
|
||||
|
||||
@@ -115,7 +115,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -133,7 +133,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -198,7 +198,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
InfoUrl = details,
|
||||
Guid = details,
|
||||
PublishDate = publishDate,
|
||||
Category = _categories.MapTrackerCatToNewznab(torrent.Category.ToString()),
|
||||
Categories = _categories.MapTrackerCatToNewznab(torrent.Category.ToString()),
|
||||
Size = torrent.Size,
|
||||
Seeders = torrent.Seeders,
|
||||
Peers = torrent.Seeders + torrent.PartialSeeders + torrent.Leechers,
|
||||
|
||||
@@ -329,7 +329,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
}
|
||||
|
||||
var category = item.Category;
|
||||
release.Category = _categories.MapTrackerCatToNewznab(category);
|
||||
release.Categories = _categories.MapTrackerCatToNewznab(category);
|
||||
|
||||
release.DownloadUrl = _baseUrl + "/tor/download.php?tid=" + id;
|
||||
release.InfoUrl = _baseUrl + "/t/" + id;
|
||||
@@ -375,7 +375,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
MamId = "";
|
||||
}
|
||||
|
||||
[FieldDefinition(1, Label = "Mam Id", HelpText = "Mam Session Id")]
|
||||
[FieldDefinition(1, Label = "Mam Id", HelpText = "Mam Session Id (Created Under Profile -> Security)")]
|
||||
public string MamId { get; set; }
|
||||
|
||||
[FieldDefinition(2, Type = FieldType.Checkbox, Label = "Exclude VIP", HelpText = "Exclude VIP Torrents from search results")]
|
||||
|
||||
@@ -90,6 +90,8 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
yield return GetDefinition("DrunkenSlug", GetSettings("https://api.drunkenslug.com"));
|
||||
yield return GetDefinition("GingaDADDY", GetSettings("https://www.gingadaddy.com"));
|
||||
yield return GetDefinition("Miatrix", GetSettings("https://www.miatrix.com"));
|
||||
yield return GetDefinition("Newz-Complex", GetSettings("https://newz-complex.org/www"));
|
||||
yield return GetDefinition("Newz69", GetSettings("https://newz69.keagaming.com"));
|
||||
yield return GetDefinition("NinjaCentral", GetSettings("https://ninjacentral.co.za"));
|
||||
yield return GetDefinition("Nzb.su", GetSettings("https://api.nzb.su"));
|
||||
yield return GetDefinition("NZBCat", GetSettings("https://nzb.cat"));
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
|
||||
if (searchCriteria.TraktId.HasValue && capabilities.MovieSearchTraktAvailable)
|
||||
{
|
||||
parameters.Add("traktid", searchCriteria.ImdbId);
|
||||
parameters.Add("traktid", searchCriteria.TraktId.ToString());
|
||||
}
|
||||
|
||||
//Workaround issue with Sphinx search returning garbage results on some indexers. If we don't use id parameters, fallback to t=search
|
||||
@@ -241,6 +241,11 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
baseUrl += string.Format("&cat={0}", categoriesQuery);
|
||||
}
|
||||
|
||||
if (Settings.AdditionalParameters.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
baseUrl += Settings.AdditionalParameters;
|
||||
}
|
||||
|
||||
if (Settings.ApiKey.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
baseUrl += "&apikey=" + Settings.ApiKey;
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn
|
||||
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
// Remove cookie cache
|
||||
if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.Headers["Location"]
|
||||
if (indexerResponse.HttpResponse.HasHttpRedirect && indexerResponse.HttpResponse.RedirectUrl
|
||||
.ContainsIgnoreCase("login.php"))
|
||||
{
|
||||
CookiesUpdater(null, null);
|
||||
@@ -112,7 +112,7 @@ namespace NzbDrone.Core.Indexers.PassThePopcorn
|
||||
MinimumSeedTime = 345600,
|
||||
DownloadVolumeFactor = free ? 0 : 1,
|
||||
UploadVolumeFactor = 1,
|
||||
Category = new List<IndexerCategory> { NewznabStandardCategory.Movies }
|
||||
Categories = new List<IndexerCategory> { NewznabStandardCategory.Movies }
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
|
||||
@@ -262,7 +262,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -280,7 +280,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -360,7 +360,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
DownloadUrl = link,
|
||||
PublishDate = publishDate,
|
||||
Size = size,
|
||||
Category = _categories.MapTrackerCatToNewznab(cat),
|
||||
Categories = _categories.MapTrackerCatToNewznab(cat),
|
||||
Files = files,
|
||||
Grabs = grabs,
|
||||
Seeders = seeders,
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace NzbDrone.Core.Indexers.Rarbg
|
||||
var torrentInfo = new TorrentInfo();
|
||||
|
||||
torrentInfo.Guid = GetGuid(torrent);
|
||||
torrentInfo.Category = _capabilities.Categories.MapTrackerCatDescToNewznab(torrent.category);
|
||||
torrentInfo.Categories = _capabilities.Categories.MapTrackerCatDescToNewznab(torrent.category);
|
||||
torrentInfo.Title = torrent.title;
|
||||
torrentInfo.Size = torrent.size;
|
||||
torrentInfo.DownloadUrl = torrent.download;
|
||||
|
||||
@@ -72,35 +72,35 @@ namespace NzbDrone.Core.Indexers.Rarbg
|
||||
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SearchTerm, searchCriteria.Categories, searchCriteria.ImdbId, searchCriteria.TmdbId));
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories, searchCriteria.FullImdbId, searchCriteria.TmdbId));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SearchTerm, searchCriteria.Categories));
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SearchTerm, searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SanitizedTvSearchString, searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SearchTerm, searchCriteria.Categories));
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SearchTerm, searchCriteria.Categories));
|
||||
pageableRequests.Add(GetRequest(searchCriteria.SanitizedSearchTerm, searchCriteria.Categories));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
|
||||
@@ -200,7 +200,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -218,7 +218,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -307,7 +307,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
Peers = seeders + leechers,
|
||||
Grabs = (int)grabs,
|
||||
Files = (int)files,
|
||||
Category = _categories.MapTrackerCatToNewznab(category),
|
||||
Categories = _categories.MapTrackerCatToNewznab(category),
|
||||
ImdbId = imdb ?? 0,
|
||||
MinimumRatio = 1,
|
||||
MinimumSeedTime = 172800, // 48 hours
|
||||
|
||||
@@ -208,7 +208,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
InfoUrl = _baseUrl + $"shows/{r.Page}/",
|
||||
PublishDate = r.Release_Date.DateTime,
|
||||
Files = 1,
|
||||
Category = new List<IndexerCategory> { NewznabStandardCategory.TVAnime },
|
||||
Categories = new List<IndexerCategory> { NewznabStandardCategory.TVAnime },
|
||||
Seeders = 1,
|
||||
Peers = 2,
|
||||
MinimumRatio = 1,
|
||||
|
||||
@@ -160,7 +160,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -178,7 +178,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -232,7 +232,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
release.MinimumRatio = 1.1;
|
||||
release.MinimumSeedTime = 172800; // 48 hours
|
||||
release.Title = row.name;
|
||||
release.Category = _categories.MapTrackerCatToNewznab(row.category.ToString());
|
||||
release.Categories = _categories.MapTrackerCatToNewznab(row.category.ToString());
|
||||
release.Size = row.size;
|
||||
release.Seeders = row.seeders;
|
||||
release.Peers = row.leechers + release.Seeders;
|
||||
|
||||
@@ -239,7 +239,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
var torrentItem = new TorrentInfo
|
||||
{
|
||||
Title = item.Name,
|
||||
Category = _categories.MapTrackerCatToNewznab(item.Category.ToString()),
|
||||
Categories = _categories.MapTrackerCatToNewznab(item.Category.ToString()),
|
||||
Guid = details,
|
||||
InfoUrl = details,
|
||||
InfoHash = item.InfoHash, // magnet link is auto generated from infohash
|
||||
|
||||
@@ -161,7 +161,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -179,7 +179,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -245,7 +245,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
DownloadUrl = link.AbsoluteUri,
|
||||
InfoUrl = details.AbsoluteUri,
|
||||
PublishDate = publishDate,
|
||||
Category = _categories.MapTrackerCatToNewznab(row.c.ToString()),
|
||||
Categories = _categories.MapTrackerCatToNewznab(row.c.ToString()),
|
||||
Size = (long)row.size,
|
||||
Files = (int)row.files,
|
||||
Grabs = (int)row.completed,
|
||||
|
||||
@@ -211,7 +211,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -229,7 +229,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.ImdbId));
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedTvSearchString), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
@@ -305,7 +305,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
Guid = details.AbsoluteUri,
|
||||
DownloadUrl = link.AbsoluteUri,
|
||||
PublishDate = publishDate,
|
||||
Category = cats,
|
||||
Categories = cats,
|
||||
Size = size,
|
||||
Grabs = grabs,
|
||||
Seeders = seeders,
|
||||
|
||||
@@ -299,7 +299,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
release.MinimumSeedTime = 72 * 60 * 60;
|
||||
var qCatLink = row.QuerySelector("a[href^=\"/browse_elastic.php?cat=\"]");
|
||||
var catStr = qCatLink.GetAttribute("href").Split('=')[1];
|
||||
release.Category = _categories.MapTrackerCatToNewznab(catStr);
|
||||
release.Categories = _categories.MapTrackerCatToNewznab(catStr);
|
||||
var qDetailsLink = row.QuerySelector("a[href^=\"/details.php?id=\"]");
|
||||
var qDetailsTitle = row.QuerySelector("td:has(a[href^=\"/details.php?id=\"]) b");
|
||||
release.Title = qDetailsTitle.TextContent.Trim();
|
||||
|
||||
@@ -19,12 +19,15 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
private readonly INewznabCapabilitiesProvider _capabilitiesProvider;
|
||||
|
||||
public override string Name => "Torznab";
|
||||
public override string BaseUrl => "";
|
||||
public override string BaseUrl => GetBaseUrlFromSettings();
|
||||
public override bool FollowRedirect => true;
|
||||
public override bool SupportsRedirect => true;
|
||||
|
||||
public override DownloadProtocol Protocol => DownloadProtocol.Torrent;
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
|
||||
|
||||
public override int PageSize => _capabilitiesProvider.GetCapabilities(Settings).LimitsDefault.Value;
|
||||
public override IndexerCapabilities Capabilities { get => GetCapabilitiesFromSettings(); protected set => base.Capabilities = value; }
|
||||
|
||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||
{
|
||||
@@ -37,7 +40,42 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
{
|
||||
return new TorznabRssParser();
|
||||
return new TorznabRssParser(Settings);
|
||||
}
|
||||
|
||||
public string GetBaseUrlFromSettings()
|
||||
{
|
||||
var baseUrl = "";
|
||||
|
||||
if (Definition == null || Settings == null || Settings.Categories == null)
|
||||
{
|
||||
return baseUrl;
|
||||
}
|
||||
|
||||
return Settings.BaseUrl;
|
||||
}
|
||||
|
||||
public IndexerCapabilities GetCapabilitiesFromSettings()
|
||||
{
|
||||
var caps = new IndexerCapabilities();
|
||||
|
||||
if (Definition == null || Settings == null || Settings.Categories == null)
|
||||
{
|
||||
return caps;
|
||||
}
|
||||
|
||||
foreach (var category in Settings.Categories)
|
||||
{
|
||||
caps.Categories.AddCategoryMapping(category.Name, category);
|
||||
}
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
public override IndexerCapabilities GetCapabilities()
|
||||
{
|
||||
// Newznab uses different Caps per site, so we need to cache them to db on first indexer add to prevent issues with loading UI and pulling caps every time.
|
||||
return _capabilitiesProvider.GetCapabilities(Settings);
|
||||
}
|
||||
|
||||
public override IEnumerable<ProviderDefinition> DefaultDefinitions
|
||||
@@ -68,7 +106,7 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
SupportsRss = SupportsRss,
|
||||
SupportsSearch = SupportsSearch,
|
||||
SupportsRedirect = SupportsRedirect,
|
||||
Capabilities = new IndexerCapabilities()
|
||||
Capabilities = Capabilities
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -12,9 +12,11 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
{
|
||||
public const string ns = "{http://torznab.com/schemas/2015/feed}";
|
||||
|
||||
public TorznabRssParser()
|
||||
private readonly TorznabSettings _settings;
|
||||
public TorznabRssParser(TorznabSettings settings)
|
||||
{
|
||||
UseEnclosureUrl = true;
|
||||
_settings = settings;
|
||||
}
|
||||
|
||||
protected override bool PreProcess(IndexerResponse indexerResponse)
|
||||
@@ -141,6 +143,27 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
return TryGetTorznabAttribute(item, "magneturl");
|
||||
}
|
||||
|
||||
protected override ICollection<IndexerCategory> GetCategory(XElement item)
|
||||
{
|
||||
var cats = TryGetMultipleNewznabAttributes(item, "category");
|
||||
var results = new List<IndexerCategory>();
|
||||
|
||||
foreach (var cat in cats)
|
||||
{
|
||||
if (int.TryParse(cat, out var intCategory))
|
||||
{
|
||||
var indexerCat = _settings.Categories?.FirstOrDefault(c => c.Id == intCategory) ?? null;
|
||||
|
||||
if (indexerCat != null)
|
||||
{
|
||||
results.Add(indexerCat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
protected override int? GetSeeders(XElement item)
|
||||
{
|
||||
var seeders = TryGetTorznabAttribute(item, "seeders");
|
||||
@@ -224,5 +247,22 @@ namespace NzbDrone.Core.Indexers.Torznab
|
||||
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
protected List<string> TryGetMultipleNewznabAttributes(XElement item, string key)
|
||||
{
|
||||
var attrElements = item.Elements(ns + "attr").Where(e => e.Attribute("name").Value.Equals(key, StringComparison.OrdinalIgnoreCase));
|
||||
var results = new List<string>();
|
||||
|
||||
foreach (var element in attrElements)
|
||||
{
|
||||
var attrValue = element.Attribute("value");
|
||||
if (attrValue != null)
|
||||
{
|
||||
results.Add(attrValue.Value);
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace NzbDrone.Core.Indexers.Definitions.UNIT3D
|
||||
InfoHash = row.Id,
|
||||
InfoUrl = details,
|
||||
Guid = details,
|
||||
Category = _categories.MapTrackerCatDescToNewznab(row.Attributes.Category),
|
||||
Categories = _categories.MapTrackerCatDescToNewznab(row.Attributes.Category),
|
||||
PublishDate = DateTime.Parse(row.Attributes.CreatedAt, CultureInfo.InvariantCulture),
|
||||
Size = row.Attributes.Size,
|
||||
Files = row.Attributes.Files,
|
||||
|
||||
306
src/NzbDrone.Core/Indexers/Definitions/YTS.cs
Normal file
306
src/NzbDrone.Core/Indexers/Definitions/YTS.cs
Normal file
@@ -0,0 +1,306 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using FluentValidation;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Annotations;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Parser;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.ThingiProvider;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
public class YTS : TorrentIndexerBase<YTSSettings>
|
||||
{
|
||||
public override string Name => "YTS";
|
||||
public override string BaseUrl => "https://yts.mx/";
|
||||
public override string Language => "en-us";
|
||||
public override string Description => "YTS is a Public torrent site specialising in HD movies of small size";
|
||||
public override Encoding Encoding => Encoding.GetEncoding("windows-1252");
|
||||
public override DownloadProtocol Protocol => DownloadProtocol.Torrent;
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Public;
|
||||
|
||||
public override TimeSpan RateLimit => TimeSpan.FromSeconds(2.5);
|
||||
public override IndexerCapabilities Capabilities => SetCapabilities();
|
||||
|
||||
public YTS(IHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger)
|
||||
: base(httpClient, eventAggregator, indexerStatusService, configService, logger)
|
||||
{
|
||||
}
|
||||
|
||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||
{
|
||||
return new YTSRequestGenerator() { Settings = Settings, Capabilities = Capabilities, BaseUrl = BaseUrl };
|
||||
}
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
{
|
||||
return new YTSParser(Settings, Capabilities.Categories, BaseUrl);
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam> { MovieSearchParam.Q, MovieSearchParam.ImdbId },
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
caps.Categories.AddCategoryMapping(45, NewznabStandardCategory.MoviesHD, "Movies/x264/720p");
|
||||
caps.Categories.AddCategoryMapping(44, NewznabStandardCategory.MoviesHD, "Movies/x264/1080p");
|
||||
caps.Categories.AddCategoryMapping(46, NewznabStandardCategory.MoviesUHD, "Movies/x264/2160p");
|
||||
caps.Categories.AddCategoryMapping(47, NewznabStandardCategory.Movies3D, "Movies/x264/3D");
|
||||
|
||||
return caps;
|
||||
}
|
||||
}
|
||||
|
||||
public class YTSRequestGenerator : IIndexerRequestGenerator
|
||||
{
|
||||
public YTSSettings Settings { get; set; }
|
||||
public IndexerCapabilities Capabilities { get; set; }
|
||||
public string BaseUrl { get; set; }
|
||||
|
||||
public YTSRequestGenerator()
|
||||
{
|
||||
}
|
||||
|
||||
private IEnumerable<IndexerRequest> GetPagedRequests(string term, int[] categories, string imdbId = null)
|
||||
{
|
||||
var searchUrl = string.Format("{0}/api/v2/list_movies.json", BaseUrl.TrimEnd('/'));
|
||||
|
||||
var searchString = term;
|
||||
|
||||
var queryCollection = new NameValueCollection
|
||||
{
|
||||
// without this the API sometimes returns nothing
|
||||
{ "sort", "date_added" },
|
||||
{ "limit", "50" }
|
||||
};
|
||||
|
||||
if (imdbId.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
queryCollection.Add("query_term", imdbId);
|
||||
}
|
||||
else if (!string.IsNullOrWhiteSpace(searchString))
|
||||
{
|
||||
searchString = searchString.Replace("'", ""); // ignore ' (e.g. search for america's Next Top Model)
|
||||
queryCollection.Add("query_term", searchString);
|
||||
}
|
||||
|
||||
searchUrl = searchUrl + "?" + queryCollection.GetQueryString();
|
||||
|
||||
var request = new IndexerRequest(searchUrl, HttpAccept.Html);
|
||||
|
||||
yield return request;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories, searchCriteria.FullImdbId));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(string.Format("{0}", searchCriteria.SanitizedSearchTerm), searchCriteria.Categories));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public Func<IDictionary<string, string>> GetCookies { get; set; }
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
}
|
||||
|
||||
public class YTSParser : IParseIndexerResponse
|
||||
{
|
||||
private readonly YTSSettings _settings;
|
||||
private readonly IndexerCapabilitiesCategories _categories;
|
||||
private readonly string _baseUrl;
|
||||
|
||||
public YTSParser(YTSSettings settings, IndexerCapabilitiesCategories categories, string baseurl)
|
||||
{
|
||||
_settings = settings;
|
||||
_categories = categories;
|
||||
_baseUrl = baseurl;
|
||||
}
|
||||
|
||||
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
|
||||
{
|
||||
var torrentInfos = new List<ReleaseInfo>();
|
||||
|
||||
var contentString = indexerResponse.Content;
|
||||
|
||||
// returned content might start with an html error message, remove it first
|
||||
var jsonStart = contentString.IndexOf('{');
|
||||
var jsonContentStr = contentString.Remove(0, jsonStart);
|
||||
|
||||
var jsonContent = JObject.Parse(jsonContentStr);
|
||||
|
||||
var result = jsonContent.Value<string>("status");
|
||||
|
||||
// query was not successful
|
||||
if (result != "ok")
|
||||
{
|
||||
return new List<ReleaseInfo>();
|
||||
}
|
||||
|
||||
var dataItems = jsonContent.Value<JToken>("data");
|
||||
var movieCount = dataItems.Value<int>("movie_count");
|
||||
|
||||
// no results found in query
|
||||
if (movieCount < 1)
|
||||
{
|
||||
return new List<ReleaseInfo>();
|
||||
}
|
||||
|
||||
var movies = dataItems.Value<JToken>("movies");
|
||||
if (movies == null)
|
||||
{
|
||||
return new List<ReleaseInfo>();
|
||||
}
|
||||
|
||||
foreach (var movie in movies)
|
||||
{
|
||||
var torrents = movie.Value<JArray>("torrents");
|
||||
if (torrents == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var torrent in torrents)
|
||||
{
|
||||
var release = new TorrentInfo();
|
||||
|
||||
// append type: BRRip or WEBRip, resolves #3558 via #4577
|
||||
var type = torrent.Value<string>("type");
|
||||
switch (type)
|
||||
{
|
||||
case "web":
|
||||
type = "WEBRip";
|
||||
break;
|
||||
default:
|
||||
type = "BRRip";
|
||||
break;
|
||||
}
|
||||
|
||||
var quality = torrent.Value<string>("quality");
|
||||
var title = movie.Value<string>("title").Replace(":", "").Replace(' ', '.');
|
||||
var year = movie.Value<int>("year");
|
||||
release.Title = $"{title}.{year}.{quality}.{type}-YTS";
|
||||
|
||||
var imdb = movie.Value<string>("imdb_code");
|
||||
release.ImdbId = ParseUtil.GetImdbID(imdb).Value;
|
||||
|
||||
release.InfoHash = torrent.Value<string>("hash"); // magnet link is auto generated from infohash
|
||||
|
||||
// ex: 2015-08-16 21:25:08 +0000
|
||||
var dateStr = torrent.Value<string>("date_uploaded");
|
||||
var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
|
||||
release.PublishDate = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc).ToLocalTime();
|
||||
|
||||
release.DownloadUrl = torrent.Value<string>("url");
|
||||
release.Seeders = torrent.Value<int>("seeds");
|
||||
release.Peers = torrent.Value<int>("peers") + release.Seeders;
|
||||
release.Size = torrent.Value<long>("size_bytes");
|
||||
release.DownloadVolumeFactor = 0;
|
||||
release.UploadVolumeFactor = 1;
|
||||
|
||||
release.InfoUrl = movie.Value<string>("url");
|
||||
|
||||
//release.Poster = new Uri(movie.Value<string>("large_cover_image"));
|
||||
release.Guid = release.DownloadUrl;
|
||||
|
||||
// map the quality to a newznab category for torznab compatibility (for Radarr, etc)
|
||||
switch (quality)
|
||||
{
|
||||
case "720p":
|
||||
release.Categories = _categories.MapTrackerCatToNewznab("45");
|
||||
break;
|
||||
case "1080p":
|
||||
release.Categories = _categories.MapTrackerCatToNewznab("44");
|
||||
break;
|
||||
case "2160p":
|
||||
release.Categories = _categories.MapTrackerCatToNewznab("46");
|
||||
break;
|
||||
case "3D":
|
||||
release.Categories = _categories.MapTrackerCatToNewznab("47");
|
||||
break;
|
||||
default:
|
||||
release.Categories = _categories.MapTrackerCatToNewznab("45");
|
||||
break;
|
||||
}
|
||||
|
||||
if (release == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
torrentInfos.Add(release);
|
||||
}
|
||||
}
|
||||
|
||||
return torrentInfos.ToArray();
|
||||
}
|
||||
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
}
|
||||
|
||||
public class YTSSettingsValidator : AbstractValidator<YTSSettings>
|
||||
{
|
||||
}
|
||||
|
||||
public class YTSSettings : IProviderConfig
|
||||
{
|
||||
private static readonly YTSSettingsValidator Validator = new YTSSettingsValidator();
|
||||
|
||||
public NzbDroneValidationResult Validate()
|
||||
{
|
||||
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -378,7 +378,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
Guid = details.AbsoluteUri,
|
||||
DownloadUrl = link.AbsoluteUri,
|
||||
PublishDate = publishDate,
|
||||
Category = cat,
|
||||
Categories = cat,
|
||||
Size = size,
|
||||
Grabs = grabs,
|
||||
Seeders = seeders,
|
||||
|
||||
@@ -413,6 +413,8 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
request.HttpRequest.AllowAutoRedirect = FollowRedirect;
|
||||
|
||||
var originalUrl = request.Url;
|
||||
|
||||
Cookies = GetCookies();
|
||||
|
||||
if (Cookies != null)
|
||||
@@ -433,12 +435,13 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
await DoLogin();
|
||||
|
||||
request.HttpRequest.Url = originalUrl;
|
||||
ModifyRequest(request);
|
||||
|
||||
response = await _httpClient.ExecuteAsync(request.HttpRequest);
|
||||
}
|
||||
|
||||
// Throw any other http error we get after attempting auth
|
||||
// Throw common http errors here before we try to parse
|
||||
if (response.HasHttpError)
|
||||
{
|
||||
_logger.Warn("HTTP Error - {0}", response);
|
||||
@@ -447,10 +450,6 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
throw new TooManyRequestsException(request.HttpRequest, response);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new HttpException(request.HttpRequest, response);
|
||||
}
|
||||
}
|
||||
|
||||
UpdateCookies(Cookies, DateTime.Now + TimeSpan.FromDays(30));
|
||||
|
||||
@@ -147,7 +147,7 @@ namespace NzbDrone.Core.Indexers
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
var definitions = provider.DefaultDefinitions
|
||||
.Where(v => v.Name != null && (v.Name != typeof(Cardigann.Cardigann).Name || v.Name != typeof(Newznab.Newznab).Name));
|
||||
.Where(v => v.Name != null && (v.Name != typeof(Cardigann.Cardigann).Name || v.Name != typeof(Newznab.Newznab).Name || v.Name != typeof(Torznab.Torznab).Name));
|
||||
|
||||
foreach (IndexerDefinition definition in definitions)
|
||||
{
|
||||
@@ -256,7 +256,7 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
SetProviderCharacteristics(provider, definition);
|
||||
|
||||
if (definition.Implementation == typeof(Newznab.Newznab).Name)
|
||||
if (definition.Implementation == typeof(Newznab.Newznab).Name || definition.Implementation == typeof(Torznab.Torznab).Name)
|
||||
{
|
||||
var settings = (NewznabSettings)definition.Settings;
|
||||
settings.Categories = _newznabCapabilitiesProvider.GetCapabilities(settings)?.Categories.GetTorznabCategoryList() ?? null;
|
||||
@@ -276,7 +276,7 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
SetProviderCharacteristics(provider, definition);
|
||||
|
||||
if (definition.Implementation == typeof(Newznab.Newznab).Name)
|
||||
if (definition.Implementation == typeof(Newznab.Newznab).Name || definition.Implementation == typeof(Torznab.Torznab).Name)
|
||||
{
|
||||
var settings = (NewznabSettings)definition.Settings;
|
||||
settings.Categories = _newznabCapabilitiesProvider.GetCapabilities(settings)?.Categories.GetTorznabCategoryList() ?? null;
|
||||
|
||||
@@ -160,7 +160,7 @@ namespace NzbDrone.Core.Indexers
|
||||
releaseInfo.DownloadUrl = GetDownloadUrl(item);
|
||||
releaseInfo.InfoUrl = GetInfoUrl(item);
|
||||
releaseInfo.CommentUrl = GetCommentUrl(item);
|
||||
releaseInfo.Category = GetCategory(item);
|
||||
releaseInfo.Categories = GetCategory(item);
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
"Connect": "Verbindungen",
|
||||
"Connections": "Verbindungen",
|
||||
"Crew": "Besetzung",
|
||||
"CustomFilters": "Filter anpassen...",
|
||||
"CustomFilters": "Filter anpassen",
|
||||
"CustomFormats": "Eigene Formate",
|
||||
"Date": "Datum",
|
||||
"Dates": "Termine",
|
||||
@@ -667,7 +667,7 @@
|
||||
"SettingsRuntimeFormat": "Laufzeit Format",
|
||||
"SearchOnAddHelpText": "Suche nach den Filmen auf der Liste nach dem hinzufügen",
|
||||
"RSSSyncIntervalHelpTextWarning": "Dies wird alle Indexer betreffen. Bitte folge deren Regeln",
|
||||
"RSSIsNotSupportedWithThisIndexer": "Der Indexer unterstützt kein RSS Sync.",
|
||||
"RSSIsNotSupportedWithThisIndexer": "RSS wird von diesem Indexer nicht unterstützt",
|
||||
"RetryingDownloadInterp": "Herunterladen nochmal versuchen {0} um {1}",
|
||||
"RemovingTag": "Tag entfernen",
|
||||
"ReleaseWillBeProcessedInterp": "Release wird verarbeitet {0}",
|
||||
@@ -875,7 +875,7 @@
|
||||
"IndexersSelectedInterp": "{0} Indexer ausgewählt",
|
||||
"IndexerRss": "Indexer RSS",
|
||||
"IndexerQuery": "Indexer Anfrage",
|
||||
"IndexerHealthCheckNoIndexers": "Keine Indexer aktiviert, Prowlarr wird keine Suchergebnisse zurückgeben.",
|
||||
"IndexerHealthCheckNoIndexers": "Keine Indexer aktiviert, Prowlarr wird keine Suchergebnisse zurückgeben",
|
||||
"IndexerAuth": "Indexer Auth",
|
||||
"EnableIndexer": "Indexer aktivieren",
|
||||
"IndexerObsoleteCheckMessage": "Indexer sind nicht mehr verfügbar oder wurden aktualiiert: {0}. Bitte enfernen und (oder) neu zu Prowlarr hinzufügen",
|
||||
@@ -889,5 +889,21 @@
|
||||
"AllIndexersHiddenDueToFilter": "Alle Indexer sind durch den ausgewählten Filter ausgeblendet.",
|
||||
"AddToDownloadClient": "Release zum Downloader hinzufügen",
|
||||
"AddNewIndexer": "Neuen Indexer hinzufügen",
|
||||
"AddedToDownloadClient": "Release zum Client hinzugefügt"
|
||||
"AddedToDownloadClient": "Release zum Client hinzugefügt",
|
||||
"AddAppProfile": "App synchronisier Profil hinzufügen",
|
||||
"AppProfile": "App-Profil",
|
||||
"AppProfiles": "App-Profile",
|
||||
"EnableRssHelpText": "RSS-Feed für Indexer aktivieren",
|
||||
"EnableRss": "RSS aktivieren",
|
||||
"EditAppProfile": "App-Profil bearbeiten",
|
||||
"Wiki": "Wiki",
|
||||
"RSS": "RSS",
|
||||
"RedirectHelpText": "Leiten Sie eingehende Download-Anfragen für den Indexer um, statt Proxying mit Prowlarr",
|
||||
"Redirect": "Umleiten",
|
||||
"Reddit": "Reddit",
|
||||
"HomePage": "Startseite",
|
||||
"FeatureRequests": "Funktionsanfragen",
|
||||
"AppProfileSelectHelpText": "App-Profile werden verwendet, um die Einstellungen für RSS, automatische Suche und interaktive Suche bei der Anwendungssynchronisierung zu steuern",
|
||||
"Discord": "Discord",
|
||||
"PrioritySettings": "Priorität"
|
||||
}
|
||||
|
||||
@@ -2,12 +2,16 @@
|
||||
"About": "About",
|
||||
"AcceptConfirmationModal": "Accept Confirmation Modal",
|
||||
"Actions": "Actions",
|
||||
"Add": "Add",
|
||||
"AddAppProfile": "Add App Sync Profile",
|
||||
"AddDownloadClient": "Add Download Client",
|
||||
"AddDownloadClientToProwlarr": "Adding a download client allows Prowlarr to send releases direct from the UI while doing a manual search.",
|
||||
"Added": "Added",
|
||||
"AddedToDownloadClient": "Release added to client",
|
||||
"AddIndexer": "Add Indexer",
|
||||
"AddingTag": "Adding tag",
|
||||
"AddNewIndexer": "Add New Indexer",
|
||||
"AddRemoveOnly": "Add and Remove Only",
|
||||
"AddToDownloadClient": "Add release to download client",
|
||||
"Age": "Age",
|
||||
"All": "All",
|
||||
@@ -17,6 +21,7 @@
|
||||
"ApiKey": "API Key",
|
||||
"AppDataDirectory": "AppData directory",
|
||||
"AppDataLocationHealthCheckMessage": "Updating will not be possible to prevent deleting AppData on Update",
|
||||
"Applications": "Applications",
|
||||
"ApplicationStatusCheckAllClientMessage": "All applications are unavailable due to failures",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Applications unavailable due to failures: {0}",
|
||||
"Apply": "Apply",
|
||||
@@ -26,9 +31,13 @@
|
||||
"ApplyTagsHelpTexts3": "Remove: Remove the entered tags",
|
||||
"ApplyTagsHelpTexts4": "Replace: Replace the tags with the entered tags (enter no tags to clear all tags)",
|
||||
"AppProfile": "App Profile",
|
||||
"AppProfileDeleteConfirm": "Are you sure you want to delete {0}?",
|
||||
"AppProfileInUse": "App Profile in Use",
|
||||
"AppProfiles": "App Profiles",
|
||||
"AppProfileSelectHelpText": "App profiles are used to control RSS, Automatic Search and Interactive Search settings on application sync",
|
||||
"Apps": "Apps",
|
||||
"AreYouSureYouWantToResetYourAPIKey": "Are you sure you want to reset your API Key?",
|
||||
"Auth": "Auth",
|
||||
"Authentication": "Authentication",
|
||||
"AuthenticationMethodHelpText": "Require Username and Password to access Prowlarr",
|
||||
"Automatic": "Automatic",
|
||||
@@ -48,6 +57,7 @@
|
||||
"BypassProxyForLocalAddresses": "Bypass Proxy for Local Addresses",
|
||||
"Cancel": "Cancel",
|
||||
"CancelPendingTask": "Are you sure you want to cancel this pending task?",
|
||||
"Category": "Category",
|
||||
"CertificateValidation": "Certificate Validation",
|
||||
"CertificateValidationHelpText": "Change how strict HTTPS certification validation is",
|
||||
"ChangeHasNotBeenSavedYet": "Change has not been saved yet",
|
||||
@@ -56,6 +66,7 @@
|
||||
"ClearHistoryMessageText": "Are you sure you want to clear all Prowlarr history?",
|
||||
"ClientPriority": "Client Priority",
|
||||
"CloneIndexer": "Clone Indexer",
|
||||
"CloneProfile": "Clone Profile",
|
||||
"Close": "Close",
|
||||
"CloseCurrentModal": "Close Current Modal",
|
||||
"Columns": "Columns",
|
||||
@@ -67,6 +78,8 @@
|
||||
"Connections": "Connections",
|
||||
"ConnectSettings": "Connect Settings",
|
||||
"ConnectSettingsSummary": "Notifications, connections to media servers/players and custom scripts",
|
||||
"CouldNotConnectSignalR": "Could not connect to SignalR, UI won't update",
|
||||
"Custom": "Custom",
|
||||
"CustomFilters": "Custom Filters",
|
||||
"Date": "Date",
|
||||
"Dates": "Dates",
|
||||
@@ -75,28 +88,35 @@
|
||||
"Delete": "Delete",
|
||||
"DeleteApplication": "Delete Application",
|
||||
"DeleteApplicationMessageText": "Are you sure you want to delete the application '{0}'?",
|
||||
"DeleteAppProfile": "Delete App Profile",
|
||||
"DeleteBackup": "Delete Backup",
|
||||
"DeleteBackupMessageText": "Are you sure you want to delete the backup '{0}'?",
|
||||
"DeleteDownloadClient": "Delete Download Client",
|
||||
"DeleteDownloadClientMessageText": "Are you sure you want to delete the download client '{0}'?",
|
||||
"DeleteIndexer": "Delete Indexer",
|
||||
"DeleteIndexerMessageText": "Are you sure you want to delete the indexer '{0}'?",
|
||||
"DeleteNotification": "Delete Notification",
|
||||
"DeleteNotificationMessageText": "Are you sure you want to delete the notification '{0}'?",
|
||||
"DeleteTag": "Delete Tag",
|
||||
"DeleteTagMessageText": "Are you sure you want to delete the tag '{0}'?",
|
||||
"Description": "Description",
|
||||
"Details": "Details",
|
||||
"DevelopmentSettings": "Development Settings",
|
||||
"Disabled": "Disabled",
|
||||
"Discord": "Discord",
|
||||
"Docker": "Docker",
|
||||
"Donations": "Donations",
|
||||
"DownloadClient": "Download Client",
|
||||
"DownloadClientCheckNoneAvailableMessage": "No download client is available",
|
||||
"DownloadClientCheckUnableToCommunicateMessage": "Unable to communicate with {0}.",
|
||||
"DownloadClients": "Download Clients",
|
||||
"DownloadClientSettings": "Download Client Settings",
|
||||
"DownloadClientsSettingsSummary": "Download clients, download handling and remote path mappings",
|
||||
"DownloadClientsSettingsSummary": "Download clients configuration for integration into Prowlarr UI search",
|
||||
"DownloadClientStatusCheckAllClientMessage": "All download clients are unavailable due to failures",
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Download clients unavailable due to failures: {0}",
|
||||
"DownloadClientUnavailable": "Download client is unavailable",
|
||||
"Downloading": "Downloading",
|
||||
"Edit": "Edit",
|
||||
"EditAppProfile": "Edit App Profile",
|
||||
"EditIndexer": "Edit Indexer",
|
||||
"Enable": "Enable",
|
||||
@@ -108,6 +128,7 @@
|
||||
"EnableColorImpairedMode": "Enable Color-Impaired Mode",
|
||||
"EnableColorImpairedModeHelpText": "Altered style to allow color-impaired users to better distinguish color coded information",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Automatically import completed downloads from download client",
|
||||
"Enabled": "Enabled",
|
||||
"EnabledHelpText": "Enable this list for use in Prowlarr",
|
||||
"EnableHelpText": "Enable metadata file creation for this metadata type",
|
||||
"EnableIndexer": "Enable Indexer",
|
||||
@@ -119,6 +140,7 @@
|
||||
"EnableRssHelpText": "Enable Rss feed for Indexer",
|
||||
"EnableSSL": "Enable SSL",
|
||||
"EnableSslHelpText": " Requires restart running as administrator to take effect",
|
||||
"Encoding": "Encoding",
|
||||
"Error": "Error",
|
||||
"ErrorLoadingContents": "Error loading contents",
|
||||
"Events": "Events",
|
||||
@@ -126,6 +148,8 @@
|
||||
"Exception": "Exception",
|
||||
"ExistingMovies": "Existing Movie(s)",
|
||||
"ExistingTag": "Existing tag",
|
||||
"Failed": "Failed",
|
||||
"FeatureRequests": "Feature Requests",
|
||||
"Filename": "Filename",
|
||||
"Files": "Files",
|
||||
"Filter": "Filter",
|
||||
@@ -134,17 +158,21 @@
|
||||
"FocusSearchBox": "Focus Search Box",
|
||||
"Folder": "Folder",
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "For more information on the individual download clients, click on the info buttons.",
|
||||
"FullSync": "Full Sync",
|
||||
"General": "General",
|
||||
"GeneralSettings": "General Settings",
|
||||
"GeneralSettingsSummary": "Port, SSL, username/password, proxy, analytics and updates",
|
||||
"Grabbed": "Grabbed",
|
||||
"Grabs": "Grabs",
|
||||
"Health": "Health",
|
||||
"HealthNoIssues": "No issues with your configuration",
|
||||
"HiddenClickToShow": "Hidden, click to show",
|
||||
"HideAdvanced": "Hide Advanced",
|
||||
"History": "History",
|
||||
"HomePage": "Home Page",
|
||||
"Host": "Host",
|
||||
"Hostname": "Hostname",
|
||||
"Id": "Id",
|
||||
"IgnoredAddresses": "Ignored Addresses",
|
||||
"IllRestartLater": "I'll restart later",
|
||||
"Importing": "Importing",
|
||||
@@ -213,6 +241,7 @@
|
||||
"NoMinimumForAnyRuntime": "No minimum for any runtime",
|
||||
"NoTagsHaveBeenAddedYet": "No tags have been added yet",
|
||||
"NotificationTriggers": "Notification Triggers",
|
||||
"NotificationTriggersHelpText": "Select which events should trigger this notification",
|
||||
"NoUpdatesAreAvailable": "No updates are available",
|
||||
"OAuthPopupMessage": "Pop-ups are being blocked by your browser",
|
||||
"Ok": "Ok",
|
||||
@@ -232,8 +261,11 @@
|
||||
"Port": "Port",
|
||||
"PortNumber": "Port Number",
|
||||
"PreferredSize": "Preferred Size",
|
||||
"Presets": "Presets",
|
||||
"Priority": "Priority",
|
||||
"PriorityHelpText": "Prioritize multiple Download Clients. Round-Robin is used for clients with the same priority.",
|
||||
"PrioritySettings": "Priority",
|
||||
"Privacy": "Privacy",
|
||||
"Protocol": "Protocol",
|
||||
"ProwlarrSupportsAnyDownloadClient": "Prowlarr supports any of the download clients listed below.",
|
||||
"ProwlarrSupportsAnyIndexer": "Prowlarr supports any indexer that uses the Newznab standard, as well as other indexers listed below.",
|
||||
@@ -248,8 +280,10 @@
|
||||
"PtpOldSettingsCheckMessage": "The following PassThePopcorn indexers have deprecated settings and should be updated: {0}",
|
||||
"QualityDefinitions": "Quality Definitions",
|
||||
"QualitySettings": "Quality Settings",
|
||||
"Query": "Query",
|
||||
"Queue": "Queue",
|
||||
"ReadTheWikiForMoreInformation": "Read the Wiki for more information",
|
||||
"Reddit": "Reddit",
|
||||
"Redirect": "Redirect",
|
||||
"RedirectHelpText": "Redirect incoming download requests for indexer instead of Proxying using Prowlarr",
|
||||
"Refresh": "Refresh",
|
||||
@@ -318,10 +352,14 @@
|
||||
"SSLPort": "SSL Port",
|
||||
"StartTypingOrSelectAPathBelow": "Start typing or select a path below",
|
||||
"StartupDirectory": "Startup directory",
|
||||
"Stats": "Stats",
|
||||
"Status": "Status",
|
||||
"Style": "Style",
|
||||
"SuggestTranslationChange": "Suggest translation change",
|
||||
"SyncAppIndexers": "Sync App Indexers",
|
||||
"SyncLevel": "Sync Level",
|
||||
"SyncLevelAddRemove": "Add and Remove Only: When it is added or removed from Prowlarr, it will update this remote app.",
|
||||
"SyncLevelFull": "Full Sync: Will keep this app fully in sync. Changes made in Prowlarr are then synced to this app. Any change made remotely will be overridden by Prowlarr on the next sync.",
|
||||
"System": "System",
|
||||
"SystemTimeCheckMessage": "System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected",
|
||||
"TableOptions": "Table Options",
|
||||
@@ -340,6 +378,8 @@
|
||||
"Title": "Title",
|
||||
"Today": "Today",
|
||||
"Tomorrow": "Tomorrow",
|
||||
"Torrent": "Torrent",
|
||||
"Torrents": "Torrents",
|
||||
"Type": "Type",
|
||||
"UI": "UI",
|
||||
"UILanguage": "UI Language",
|
||||
@@ -347,10 +387,15 @@
|
||||
"UILanguageHelpTextWarning": "Browser Reload Required",
|
||||
"UISettings": "UI Settings",
|
||||
"UISettingsSummary": "Calendar, date and color impaired options",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Unable to add a new application, please try again.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Unable to add a new application profile, please try again.",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Unable to add a new download client, please try again.",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Unable to add a new indexer, please try again.",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Unable to add a new notification, please try again.",
|
||||
"UnableToLoadAppProfiles": "Unable to load app profiles",
|
||||
"UnableToLoadBackups": "Unable to load backups",
|
||||
"UnableToLoadDevelopmentSettings": "Unable to load Development settings",
|
||||
"UnableToLoadDownloadClients": "Unable to load download clients",
|
||||
"UnableToLoadGeneralSettings": "Unable to load General settings",
|
||||
"UnableToLoadHistory": "Unable to load history",
|
||||
"UnableToLoadIndexers": "Unable to load Indexers",
|
||||
@@ -376,6 +421,7 @@
|
||||
"Version": "Version",
|
||||
"View": "View",
|
||||
"Warn": "Warn",
|
||||
"Wiki": "Wiki",
|
||||
"YesCancel": "Yes, Cancel",
|
||||
"Yesterday": "Yesterday"
|
||||
}
|
||||
}
|
||||
@@ -853,5 +853,6 @@
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Indexers no disponible por errores durando más de 6 horas: {0}",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Ningún indexer está disponible por errores durando más de 6 horas",
|
||||
"EditMovieFile": "Editar Archivo de Película",
|
||||
"ListTagsHelpText": "Etiquetas con las que se añadirán los elementos"
|
||||
"ListTagsHelpText": "Etiquetas con las que se añadirán los elementos",
|
||||
"PrioritySettings": "Prioridad"
|
||||
}
|
||||
|
||||
@@ -351,7 +351,7 @@
|
||||
"AutoRedownloadFailedHelpText": "Chercher et essayer de télécharger une version différente automatiquement",
|
||||
"Automatic": "Automatique",
|
||||
"AutoDownloadPropersHelpText": "Prowlarr devrait-il automatiquement télécharger les propers quand ils sont disponibles ?",
|
||||
"AuthenticationMethodHelpText": "Exiger un identifiant et un mot de passe pour accéder à Prowlarr",
|
||||
"AuthenticationMethodHelpText": "Un nom d'utilisateur et un mot de passe sont nécessaires pour accéder à Prowlarr",
|
||||
"Authentication": "Authentification",
|
||||
"AsAllDayHelpText": "Les événements apparaîtront comme des événements durant toute la journée dans votre calendrier",
|
||||
"AreYouSureYouWantToResetYourAPIKey": "Êtes vous sûr de vouloir réinitialiser votre clé API ?",
|
||||
@@ -361,7 +361,7 @@
|
||||
"ApplyTags": "Appliquer les Tags",
|
||||
"AppDataDirectory": "Dossier AppData",
|
||||
"ApiKey": "Clé API",
|
||||
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Prowlarr. Cela inclut des informations sur votre navigateur, quelle page Prowlarr WebUI vous utilisez, les rapports d'erreur ainsi que le systeme d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.",
|
||||
"AnalyticsEnabledHelpText": "Envoyer des informations anonymes sur l'utilisation et les erreurs vers les serveurs de Prowlarr. Cela inclut des informations sur votre navigateur, quelle page Prowlarr WebUI vous utilisez, les rapports d'erreur ainsi que le système d'exploitation et sa version. Nous utiliserons ces informations pour prioriser les nouvelles fonctionnalités et les corrections de bugs.",
|
||||
"AnalyseVideoFiles": "Analyser les fichiers vidéo",
|
||||
"AlreadyInYourLibrary": "Déjà présent dans votre collection",
|
||||
"AllowHardcodedSubsHelpText": "Les sous-titres incrustés détectés seront automatiquement téléchargés",
|
||||
@@ -441,7 +441,7 @@
|
||||
"ConnectSettings": "Paramètres de connexion",
|
||||
"CleanLibraryLevel": "Nettoyer au niveau de la collection",
|
||||
"CertificationCountry": "Pays de classification",
|
||||
"BackupFolderHelpText": "Les chemins relatifs pointeront sous le dossier AppData de Prowlarr",
|
||||
"BackupFolderHelpText": "Les chemins correspondants seront sous le répertoire AppData de Prowlarr",
|
||||
"AvailabilityDelayHelpText": "Temps à laisser s’écouler (avant ou après la date de disponibilité) avant de chercher le film",
|
||||
"AddImportExclusionHelpText": "Empêcher le film d’être ajouté automatiquement à Prowlarr par des listes",
|
||||
"ImportExtraFilesHelpText": "Importer les fichiers extra correspondants (sous-titres, .nfo etc.) après avoir importé un fichier film",
|
||||
@@ -493,7 +493,7 @@
|
||||
"Disabled": "Désactivé",
|
||||
"DeleteNotificationMessageText": "Êtes-vous sûr de vouloir supprimer la notification '{0}' ?",
|
||||
"AutomaticSearch": "Recherche automatique",
|
||||
"AddIndexer": "Ajouter Indexeur",
|
||||
"AddIndexer": "Ajouter un indexeur",
|
||||
"ListUpdateInterval": "Intervalle de mise à jour de la liste",
|
||||
"ListSyncLevelHelpText": "Les films de la bibliothèque seront supprimés ou non surveillés s'ils ne figurent pas dans votre liste",
|
||||
"Links": "Liens",
|
||||
@@ -828,7 +828,7 @@
|
||||
"CloseCurrentModal": "Fermer le modal actuel",
|
||||
"AddingTag": "Ajouter un tag",
|
||||
"OnHealthIssueHelpText": "Sur un problème de santé",
|
||||
"AcceptConfirmationModal": "Accepter le modal de confirmation",
|
||||
"AcceptConfirmationModal": "Accepter la modalité de confirmation",
|
||||
"StartSearchForMissingMovie": "Lancer la recherche de film manquant",
|
||||
"StartProcessing": "Lancer le traitement",
|
||||
"StartImport": "Lancer l'importation",
|
||||
@@ -852,5 +852,79 @@
|
||||
"EditMovieFile": "Modifier Fichier Vidéo",
|
||||
"Yesterday": "Hier",
|
||||
"Tomorrow": "Demain",
|
||||
"Today": "Aujourd'hui"
|
||||
"Today": "Aujourd'hui",
|
||||
"SettingsLogSql": "Log Sql",
|
||||
"UnableToLoadDevelopmentSettings": "Impossible de charger les paramètres de développement",
|
||||
"TestAllApps": "Tester toutes les applications",
|
||||
"SyncAppIndexers": "Synchroniser les indexeurs d'applications",
|
||||
"SettingsSqlLoggingHelpText": "Enregistrez toutes les requêtes SQL de Prowlarr",
|
||||
"SettingsLogRotateHelpText": "Nombre maximum de fichiers journaux à conserver dans le dossier des journaux",
|
||||
"SettingsLogRotate": "Rotation du journal",
|
||||
"SettingsIndexerLoggingHelpText": "Enregistrer des données supplémentaires de l'indexeur, y compris la réponse",
|
||||
"SettingsIndexerLogging": "Journalisation d'index améliorée",
|
||||
"SettingsFilterSentryEventsHelpText": "Filtrer les événements d'erreur utilisateur connus pour qu'ils ne soient pas envoyés en tant qu'Analytics",
|
||||
"SettingsFilterSentryEvents": "Filtrer les événements d'analyse",
|
||||
"SettingsConsoleLogLevel": "Niveau de journalisation de la console",
|
||||
"SearchIndexers": "Recherche indexeurs",
|
||||
"NewznabVipCheckExpiringClientMessage": "Les avantages VIP de l'indexeur arrivent bientôt à expiration : {0}",
|
||||
"NewznabVipCheckExpiredClientMessage": "Les avantages VIP de l'indexeur ont expiré : {0}",
|
||||
"IndexersSelectedInterp": "{0} indexeur(s) sélectionné(s)",
|
||||
"IndexerRss": "Indexeur Rss",
|
||||
"IndexerQuery": "Requête indexeur",
|
||||
"IndexerObsoleteCheckMessage": "Les indexeurs sont obsolètes ou ont été mis à jour : {0}. Veuillez supprimer et (ou) rajouter à Prowlarr",
|
||||
"IndexerHealthCheckNoIndexers": "Aucun indexeur activé, Prowlarr ne renverra pas de résultats de recherche",
|
||||
"IndexerAuth": "Indexer Auth",
|
||||
"EnableRssHelpText": "Activer le flux RSS pour l'indexeur",
|
||||
"EnableRss": "Activer RSS",
|
||||
"EnableIndexer": "Activer l'indexeur",
|
||||
"EditAppProfile": "Modifier profil de l'App",
|
||||
"AppProfiles": "Profils d'application",
|
||||
"AddAppProfile": "Ajouter un profil de synchronisation d'App",
|
||||
"DevelopmentSettings": "Paramètres de développement",
|
||||
"DeleteApplicationMessageText": "Etes-vous sûr de vouloir supprimer l'application '{0}' ?",
|
||||
"DeleteApplication": "Supprimer l'application",
|
||||
"ClearHistoryMessageText": "Vous êtes sûr de vouloir effacer tout l'historique de Prowlarr ?",
|
||||
"ClearHistory": "Effacer l'historique",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Applications indisponibles en raison de dysfonctionnements : {0}",
|
||||
"ApplicationStatusCheckAllClientMessage": "Toutes les applications sont indisponibles en raison de dysfonctionnements.",
|
||||
"AllIndexersHiddenDueToFilter": "Tous les indexeurs sont cachés en raison du filtre appliqué.",
|
||||
"AddToDownloadClient": "Ajouter un release au client",
|
||||
"AddedToDownloadClient": "Release ajoutée au client",
|
||||
"AddNewIndexer": "Ajouter un nouvel indexeur",
|
||||
"AppProfile": "Profils d'application",
|
||||
"Wiki": "Wiki",
|
||||
"RSS": "RSS",
|
||||
"RedirectHelpText": "Rediriger les demandes de téléchargement entrantes pour l'indexeur au lieu de proxy à l'aide de Prowlarr",
|
||||
"Redirect": "Rediriger",
|
||||
"Reddit": "Reddit",
|
||||
"HomePage": "Page d'accueil",
|
||||
"FeatureRequests": "Requêtes de nouvelles fonctionnalités",
|
||||
"Discord": "Discord",
|
||||
"AppProfileSelectHelpText": "Les profils d'application sont utilisés pour contrôler les paramètres RSS, Recherche automatique et Recherche interactive lors de la synchronisation de l'application",
|
||||
"PrioritySettings": "Priorité",
|
||||
"CouldNotConnectSignalR": "Impossible de se connecter à SignalR, l'interface utilisateur ne sera pas mise à jour",
|
||||
"Encoding": "Codage",
|
||||
"NotificationTriggersHelpText": "Sélectionnez les événements qui doivent déclencher cette notification",
|
||||
"AddDownloadClient": "Ajouter un client de téléchargement",
|
||||
"Applications": "Applications",
|
||||
"AppProfileDeleteConfirm": "Voulez-vous vraiment supprimer {0} ?",
|
||||
"AppProfileInUse": "Profil d'application en cours d'utilisation",
|
||||
"Apps": "Apps",
|
||||
"Auth": "Auth",
|
||||
"Category": "Catégorie",
|
||||
"Custom": "Personnalisé",
|
||||
"DeleteAppProfile": "Supprimer le profil de l'application",
|
||||
"Description": "Description",
|
||||
"Donations": "Dons",
|
||||
"Enabled": "Activé",
|
||||
"Grabs": "Saisie",
|
||||
"Id": "Id",
|
||||
"Presets": "Préconfigurations",
|
||||
"Privacy": "Vie privée",
|
||||
"Query": "Requête",
|
||||
"Stats": "Stats",
|
||||
"Torrent": "Torrent",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Impossible d'ajouter une nouvelle application, veuillez réessayer.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Impossible d'ajouter un nouveau profil d'application, veuillez réessayer.",
|
||||
"UnableToLoadAppProfiles": "Impossible de charger les profils d'application"
|
||||
}
|
||||
|
||||
@@ -878,5 +878,46 @@
|
||||
"AllIndexersHiddenDueToFilter": "Az összes indexelő rejtve van az alkalmazott szűrő miatt.",
|
||||
"AddToDownloadClient": "Kiadás hozzáadása a kliens letöltéséhez",
|
||||
"AddNewIndexer": "Új indexelő hozzáadása",
|
||||
"AddedToDownloadClient": "Kiadás hozzáadva a klienshez"
|
||||
"AddedToDownloadClient": "Kiadás hozzáadva a klienshez",
|
||||
"EnableRssHelpText": "RSS Engedélyezése az Indexerekhez",
|
||||
"EnableRss": "RSS Engedélyezése",
|
||||
"EditAppProfile": "App profil szerkesztése",
|
||||
"AppProfiles": "App profilok",
|
||||
"AddAppProfile": "Szinkronizálási profil hozzáadása",
|
||||
"AppProfile": "App Profil",
|
||||
"Wiki": "Wiki",
|
||||
"RSS": "RSS",
|
||||
"RedirectHelpText": "Átirányítja a bejövő letöltési kéréseket az indexelőhöz a Prowlarr használatával történő proxy helyett",
|
||||
"Redirect": "Átirányítás",
|
||||
"Reddit": "Reddit",
|
||||
"HomePage": "Kezdőlap",
|
||||
"FeatureRequests": "Funkció kérése",
|
||||
"Discord": "Discord",
|
||||
"AppProfileSelectHelpText": "Az alkalmazásprofilok az RSS vezérlésére szolgálnak, Automatikus keresés és Interaktív keresés beállításai az alkalmazás szinkronizálásakor",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Nem lehet új alkalmazást hozzáadni, próbálkozzon újra.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Nem lehet új alkalmazásprofilt hozzáadni, próbálkozzon újra.",
|
||||
"AddDownloadClient": "Letöltőkliens hozzáadása",
|
||||
"Applications": "Alkalmazások",
|
||||
"AppProfileDeleteConfirm": "Biztosan törli a következőt: {0}?",
|
||||
"AppProfileInUse": "Használatban lévő alkalmazásprofil",
|
||||
"Apps": "Appok",
|
||||
"Auth": "Engedélyek",
|
||||
"Category": "Kategória",
|
||||
"CouldNotConnectSignalR": "Nem sikerült csatlakozni a SignalR-hez, a felhasználói felület nem frissül",
|
||||
"Custom": "Egyedi",
|
||||
"DeleteAppProfile": "Alkalmazásprofil törlése",
|
||||
"Description": "Leírás",
|
||||
"Donations": "Adományok",
|
||||
"Enabled": "Engedélyezve",
|
||||
"Encoding": "Kódolás",
|
||||
"Grabs": "Megfogások",
|
||||
"Id": "Azonosító",
|
||||
"NotificationTriggersHelpText": "Válaszd ki, hogy mely események indítsák el ezt az értesítést",
|
||||
"Presets": "Előbeállítások",
|
||||
"Privacy": "Titkosítás",
|
||||
"Query": "Lekérdezés",
|
||||
"Stats": "Statisztikák",
|
||||
"Torrent": "Torrent",
|
||||
"UnableToLoadAppProfiles": "Nem sikerült betölteni az alkalmazásprofilokat",
|
||||
"PrioritySettings": "Prioritás"
|
||||
}
|
||||
|
||||
@@ -847,5 +847,6 @@
|
||||
"ListTagsHelpText": "Gli elementi dell'elenco dei tag saranno aggiunti con",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Alcuni indexer non disponibili da più di 6 ore a causa di errori: {0}",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Nessun indexer è disponibile da più di 6 ore a causa di errori",
|
||||
"EditMovieFile": "Edita File del Film"
|
||||
"EditMovieFile": "Edita File del Film",
|
||||
"PrioritySettings": "Priorità"
|
||||
}
|
||||
|
||||
@@ -851,5 +851,6 @@
|
||||
"AllIndexersHiddenDueToFilter": "Alle Indexeerders zijn verborgen door actieve filter",
|
||||
"AddToDownloadClient": "Release toevoegen aan download client",
|
||||
"AddNewIndexer": "Voeg nieuwe Indexeerder Toe",
|
||||
"AddedToDownloadClient": "Release toegevoegd aan client"
|
||||
"AddedToDownloadClient": "Release toegevoegd aan client",
|
||||
"PrioritySettings": "Prioriteit"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"Peers": "Peers",
|
||||
"AppDataLocationHealthCheckMessage": "Atualizar não será possível para evitar exclusão do AppData na Atualização",
|
||||
"AppDataLocationHealthCheckMessage": "Não será possível atualizar para evitar a exclusão de AppData",
|
||||
"Year": "Ano",
|
||||
"Week": "Semana",
|
||||
"Warn": "Aviso",
|
||||
@@ -9,8 +9,8 @@
|
||||
"VideoCodec": "Codec de Video",
|
||||
"UpdateSelected": "Atualização Selecionada",
|
||||
"Updates": "Atualizações",
|
||||
"UpdateCheckUINotWritableMessage": "Não foi possível instalar a atualização porque a pasta de UI '{0}' não tem permissões de escrita para o usuário '{1}'.",
|
||||
"UpdateCheckStartupNotWritableMessage": "Não foi possível instalar a atualização porque a pasta de inicialização '{0}' não tem permissões de escrita para o usuário '{1}'.",
|
||||
"UpdateCheckUINotWritableMessage": "Não foi possível instalar a atualização porque a pasta de IU \"{0}\" não tem permissões de escrita para o utilizador \"{1}\".",
|
||||
"UpdateCheckStartupNotWritableMessage": "Não foi possível instalar a atualização porque a pasta de inicialização \"{0}\" não tem permissões de escrita para o utilizador \"{1}\".",
|
||||
"UpdateCheckStartupTranslocationMessage": "Não foi possível instalar a atualização porque a pasta de inicialização '{0}' está em uma pasta de \"App Translocation\".",
|
||||
"UpdateAll": "Atualizar Tudo",
|
||||
"UnselectAll": "Desselecionar tudo",
|
||||
@@ -19,18 +19,18 @@
|
||||
"Unmonitored": "Não Monitorado",
|
||||
"Unavailable": "Indisponível",
|
||||
"UISettingsSummary": "Calendário, data e opções de modo daltônico",
|
||||
"UI": "UI",
|
||||
"UI": "IU",
|
||||
"Type": "Tipo",
|
||||
"TotalSpace": "Espaço Total",
|
||||
"Titles": "Títulos",
|
||||
"Title": "Título",
|
||||
"Timeleft": "Tempo Restante",
|
||||
"Time": "Data",
|
||||
"TestAll": "Testar Tudo",
|
||||
"TestAll": "Testar tudo",
|
||||
"Test": "Teste",
|
||||
"Tasks": "Tarefas",
|
||||
"TagsSettingsSummary": "Ver todas as tags e como elas são usadas. Tags não usadas podem ser removidas",
|
||||
"Tags": "Tags",
|
||||
"TagsSettingsSummary": "Ver todas as etiquetas e como são usadas. Etiquetas não usadas podem ser removidas",
|
||||
"Tags": "Etiquetas",
|
||||
"TableOptionsColumnsMessage": "Escolher quais colunas são visíveis e qual ordem elas aparecem",
|
||||
"TableOptions": "Opções de Tabela",
|
||||
"Table": "Tabela",
|
||||
@@ -38,7 +38,7 @@
|
||||
"System": "Sistema",
|
||||
"Style": "Estilo",
|
||||
"Studio": "Estúdio",
|
||||
"Status": "Status",
|
||||
"Status": "Estado",
|
||||
"SourceTitle": "Título de Origem",
|
||||
"Source": "Origem",
|
||||
"Sort": "Ordenar",
|
||||
@@ -49,7 +49,7 @@
|
||||
"ShowStudio": "Mostrar Estúdio",
|
||||
"ShowSizeOnDisk": "Mostrar Tamanho em Disco",
|
||||
"ShowSearchHelpText": "Mostrar botão de pesquisa ao passar o cursor",
|
||||
"ShowSearch": "Mostrar Pesquisa",
|
||||
"ShowSearch": "Mostrar pesquisa",
|
||||
"ShowQualityProfile": "Mostrar Qualidade de Perfil",
|
||||
"ShowPath": "Mostrar Caminho",
|
||||
"ShowMonitored": "Mostrar Monitorado",
|
||||
@@ -71,9 +71,9 @@
|
||||
"SettingsLongDateFormat": "Formato Longo de Data",
|
||||
"SettingsFirstDayOfWeek": "Primeiro Dia da Semana",
|
||||
"SettingsEnableColorImpairedMode": "Ativar Modo Daltônico",
|
||||
"SettingsEnableColorImpairedModeHelpText": "Estilo alterado para permitir usuários daltônicos a distinguir melhor informações coloridas",
|
||||
"Settings": "Configurações",
|
||||
"SetTags": "Colocar Tags",
|
||||
"SettingsEnableColorImpairedModeHelpText": "Estilo alterado para permitir utilizadores daltônicos a distinguir melhor informações coloridas",
|
||||
"Settings": "Definições",
|
||||
"SetTags": "Definir etiquetas",
|
||||
"SelectFolder": "Selecionar Pasta",
|
||||
"SelectAll": "Selecionar Todos",
|
||||
"Seeders": "Seeders",
|
||||
@@ -84,7 +84,7 @@
|
||||
"SearchForMissing": "Buscar Ausentes",
|
||||
"SearchFiltered": "Pesquisa Filtrada",
|
||||
"SearchAll": "Buscar Todos",
|
||||
"Search": "Busca",
|
||||
"Search": "Pesquisar",
|
||||
"Scheduled": "Agendado",
|
||||
"SaveChanges": "Salvar Mudanças",
|
||||
"Save": "Salvar",
|
||||
@@ -95,7 +95,7 @@
|
||||
"RootFolderCheckMultipleMessage": "Múltiplas pastas raízes não foram encontradas: {0}",
|
||||
"RootFolder": "Pasta Raiz",
|
||||
"Restrictions": "Restrições",
|
||||
"RestoreBackup": "Restaurar Backup",
|
||||
"RestoreBackup": "Restaurar cópia de segurança",
|
||||
"Restart": "Reiniciar",
|
||||
"RenameFiles": "Renomear Arquivos",
|
||||
"Renamed": "Renomeado",
|
||||
@@ -121,7 +121,7 @@
|
||||
"QualitySettingsSummary": "Tamanhos de qualidade e nomeamento",
|
||||
"QualityProfiles": "Perfis de Qualidades",
|
||||
"QualityProfile": "Perfil de Qualidade",
|
||||
"QualityDefinitions": "Definições de Qualidade",
|
||||
"QualityDefinitions": "Definições de qualidade",
|
||||
"Quality": "Qualidade",
|
||||
"PtpOldSettingsCheckMessage": "Os seguintes indexadores PassThePopcorn tem configurações obsoletas e precisam ser atualizados: {0}",
|
||||
"ProxyCheckResolveIpMessage": "Não foi possível Resolver o Endereço IP do Host Proxy Configurado {0}",
|
||||
@@ -141,7 +141,7 @@
|
||||
"PendingChangesMessage": "Você tem mudanças não salvas, tem certeza que deseja sair da pagina?",
|
||||
"PendingChangesDiscardChanges": "Descartar mudanças e sair",
|
||||
"Path": "Caminho",
|
||||
"PageSize": "Tamanho de Página",
|
||||
"PageSize": "Tamanho de página",
|
||||
"OverviewOptions": "Opções de Resumo",
|
||||
"Overview": "Resumo",
|
||||
"OutputPath": "Caminho de Saida",
|
||||
@@ -167,7 +167,7 @@
|
||||
"Movie": "Filme",
|
||||
"MoveFiles": "Mover Arquivos",
|
||||
"MountCheckMessage": "O ponto de montagem que leva a um filme esta montado como apenas leitura: ",
|
||||
"MoreInfo": "Mais Info",
|
||||
"MoreInfo": "Mais informações",
|
||||
"Month": "Mes",
|
||||
"MonoVersionCheckUpgradeRecommendedMessage": "O Mono versão {0} instalado atualmente é suportado, mas atualizar para {1} é recomendado.",
|
||||
"MonoVersionCheckOldNotSupportedMessage": "O Mono versão {0} instalado atualmente é velho e obsoleto. Por favor atualize para o Mono versão {1}.",
|
||||
@@ -189,16 +189,16 @@
|
||||
"MediaInfoDllCheckMessage": "A biblioteca MediaInfo no pôde ser carregado {0}",
|
||||
"MassMovieSearch": "Pesquisa de Filmes em Massa",
|
||||
"ManualImport": "Importação Manual",
|
||||
"Logging": "Logs",
|
||||
"Logging": "Registo em log",
|
||||
"LogFilesLocationMessage": "Os logs estão localizados em:",
|
||||
"LogFiles": "Logs",
|
||||
"LogFiles": "Ficheiros de log",
|
||||
"Location": "Localização",
|
||||
"ListsSettingsSummary": "Listas de Importações, listas de exclusões",
|
||||
"Lists": "Listas",
|
||||
"ListExclusions": "Lista de Exclusões",
|
||||
"Level": "Nível",
|
||||
"LastWriteTime": "Horário da Ultima Escrita",
|
||||
"Language": "Linguagem",
|
||||
"Language": "Idioma",
|
||||
"Languages": "Idiomas",
|
||||
"KeyboardShortcuts": "Atalhos de Teclado",
|
||||
"InteractiveImport": "Importação Interativa",
|
||||
@@ -224,7 +224,7 @@
|
||||
"Import": "Importar",
|
||||
"Ignored": "Ignorado",
|
||||
"iCalLink": "Vincular iCal",
|
||||
"Host": "Host",
|
||||
"Host": "Anfitrião",
|
||||
"History": "Histórico",
|
||||
"HideAdvanced": "Ocultar Avançado",
|
||||
"HealthNoIssues": "Sem problemas com sua configuração",
|
||||
@@ -233,7 +233,7 @@
|
||||
"GrabSelected": "Capturar Selecionado",
|
||||
"Grabbed": "Pegado",
|
||||
"Genres": "Gêneros",
|
||||
"GeneralSettingsSummary": "Porta, SSL, usuário/senha, proxy, análises e atualizações",
|
||||
"GeneralSettingsSummary": "Porta, SSL, utilizador/palavra-passe, proxy, análises e atualizações",
|
||||
"General": "Geral",
|
||||
"FreeSpace": "Espaço Livre",
|
||||
"Formats": "Formatos",
|
||||
@@ -241,8 +241,8 @@
|
||||
"Folder": "Pasta",
|
||||
"Filter": "Filtro",
|
||||
"Filesize": "Tamanho do Arquivo",
|
||||
"Files": "Arquivos",
|
||||
"Filename": "Nome do Arquivo",
|
||||
"Files": "Ficheiros",
|
||||
"Filename": "Nome do ficheiro",
|
||||
"FileManagement": "Gerenciamento de Arquivo",
|
||||
"FailedDownloadHandling": "Manuseio de Download Falhado",
|
||||
"Failed": "Falhado",
|
||||
@@ -257,10 +257,10 @@
|
||||
"DownloadClientStatusCheckSingleClientMessage": "Gerenciadores de downloads indisponíveis devido a falhas: {0}",
|
||||
"DownloadClientStatusCheckAllClientMessage": "Todos os gerenciadores de downloads estão indisponíveis devido a falhas",
|
||||
"DownloadClientsSettingsSummary": "Gerenciadores de downloads, tratamento de downloads e mapeamento de caminhos remotos",
|
||||
"DownloadClients": "Gerenciador de Downloads",
|
||||
"DownloadClients": "Clientes de transferências",
|
||||
"DownloadClientCheckUnableToCommunicateMessage": "Incapaz de comunicar com {0}.",
|
||||
"DownloadClientCheckNoneAvailableMessage": "Nenhum gerenciador de downloads disponível",
|
||||
"DownloadClient": "Gerenciador de Downloads",
|
||||
"DownloadClient": "Cliente de transferências",
|
||||
"DotNetVersionCheckOldUnsupportedMessage": "O Framework .Net {0} instalado atualmente é velho e não suportado. Por favor atualize para o Framework .Net para ao menos {1}.",
|
||||
"DotNetVersionCheckNotRecommendedMessage": "O Framework .Net {0} instalado atualmente é suportado, mas nós recomendamos atualizar para ao menos {1}.",
|
||||
"DiskSpace": "Espaço em Disco",
|
||||
@@ -270,7 +270,7 @@
|
||||
"DetailedProgressBarHelpText": "Mostrar texto na barra de progresso",
|
||||
"DetailedProgressBar": "Barra de Progresso Detalhada",
|
||||
"Deleted": "Excluído",
|
||||
"Delete": "Excluir",
|
||||
"Delete": "Eliminar",
|
||||
"DelayProfiles": "Perfis de Espera",
|
||||
"Day": "Dia",
|
||||
"Dates": "Datas",
|
||||
@@ -299,8 +299,8 @@
|
||||
"Cancel": "Cancelar",
|
||||
"Calendar": "Calendário",
|
||||
"Blacklist": "Lista Negra",
|
||||
"BackupNow": "Fazer Backup",
|
||||
"Backup": "Backup",
|
||||
"BackupNow": "Criar cópia de segurança",
|
||||
"Backup": "Cópia de segurança",
|
||||
"AudioInfo": "Info de Audio",
|
||||
"Apply": "Aplicar",
|
||||
"AndNot": "e não",
|
||||
@@ -321,23 +321,23 @@
|
||||
"Added": "Adicionado",
|
||||
"Activity": "Atividade",
|
||||
"Actions": "Ações",
|
||||
"About": "Sobre",
|
||||
"About": "Acerca de",
|
||||
"AvailabilityDelay": "Espera de Disponibilidade",
|
||||
"AutoUnmonitorPreviouslyDownloadedMoviesHelpText": "Filmes deletados no disco deixam automaticamente de ser monitorados no Prowlarr",
|
||||
"AutoRedownloadFailedHelpText": "Automaticamente busque e tente baixar uma versão diferente",
|
||||
"Automatic": "Automático",
|
||||
"AutoDownloadPropersHelpText": "O Prowlarr deve automaticamente atualizar para propers quando disponível?",
|
||||
"AuthenticationMethodHelpText": "Solicitar nome de usuário e senha para acessar ao Prowlarr",
|
||||
"AuthenticationMethodHelpText": "Solicitar nome de utilizador e palavra-passe para acessar ao Prowlarr",
|
||||
"Authentication": "Autenticação",
|
||||
"AsAllDayHelpText": "Eventos aparecerão como eventos de dia inteiro em seu calendário",
|
||||
"AreYouSureYouWantToResetYourAPIKey": "Tem certeza que quer redefinir sua Chave API?",
|
||||
"AreYouSureYouWantToResetYourAPIKey": "Tem a certeza que quer redefinir sua Chave da API?",
|
||||
"AreYouSureYouWantToDeleteThisRemotePathMapping": "Tem certeza que quer deletar este mapeamento de pasta remota?",
|
||||
"AreYouSureYouWantToDeleteThisImportListExclusion": "Tem certeza que quer deletar esta exclusão de lista de importação?",
|
||||
"AreYouSureYouWantToDeleteThisDelayProfile": "Tem certeza que quer deletar este perfil de espera?",
|
||||
"ApplyTags": "Adicionar Tags",
|
||||
"AppDataDirectory": "Pasta de AppData",
|
||||
"ApiKey": "Chave API",
|
||||
"AnalyticsEnabledHelpText": "Envie informações anônimas de uso e de erros aos servidores do Prowlarr. Isso inclui informações sobre seu navegador, páginas utilizadas no WebUI do Prowlarr, informações de erros, bem como as versões de sistema operacional e da aplicação.",
|
||||
"ApplyTags": "Aplicar etiquetas",
|
||||
"AppDataDirectory": "Pasta AppData",
|
||||
"ApiKey": "Chave da API",
|
||||
"AnalyticsEnabledHelpText": "Envie informações anônimas de uso e de erros aos servidores do Prowlarr. Isso inclui informações sobre seu browser, páginas utilizadas no WebUI do Prowlarr, informações de erros, bem como as versões de sistema operacional e da aplicação. Usaremos essas informações para priorizar recursos e correções de bugs.",
|
||||
"AnalyseVideoFiles": "Analizar arquivos de vídeo",
|
||||
"AlreadyInYourLibrary": "Já está em sua biblioteca",
|
||||
"AllowHardcodedSubsHelpText": "Legendas embutidas que sejam detectadas serão automaticamente baixadas",
|
||||
@@ -345,32 +345,32 @@
|
||||
"AgeWhenGrabbed": "Tempo de vida (quando capturado)",
|
||||
"AddMoviesMonitored": "Adicionar Filmes Monitorados",
|
||||
"AddListExclusion": "Adicionar Exclusão de Lista",
|
||||
"QualitySettings": "Ajustes de Qualidade",
|
||||
"QualitySettings": "Definições de qualidade",
|
||||
"QualityCutoffHasNotBeenMet": "Ponto de corte de qualidade não foi alcançado",
|
||||
"PublishedDate": "Data de Publicação",
|
||||
"ProxyType": "Tipo de Proxy",
|
||||
"ProxyType": "Tipo de proxy",
|
||||
"ProtocolHelpText": "Escolha que protocolo(s) utilizar e qual o preferido ao escolher entre versões iguais",
|
||||
"PreferIndexerFlagsHelpText": "Priorizar versões com marcas especiais",
|
||||
"PreferIndexerFlags": "Preferir Flags do Indexador",
|
||||
"PortNumber": "Número da Porta",
|
||||
"PortNumber": "Número da porta",
|
||||
"Port": "Porta",
|
||||
"Permissions": "Permissões",
|
||||
"Password": "Senha",
|
||||
"Password": "Palavra-passe",
|
||||
"PageSizeHelpText": "Número de elementos por página",
|
||||
"PackageVersion": "Versão do Pacote",
|
||||
"PackageVersion": "Versão do pacote",
|
||||
"Original": "Original",
|
||||
"OpenBrowserOnStart": "Abrir navegador ao iniciar",
|
||||
"OpenBrowserOnStart": "Abrir browser ao iniciar",
|
||||
"OnUpgradeHelpText": "Notificar quando filmes tiverem upgrade para uma melhor qualidade",
|
||||
"OnRenameHelpText": "Ao Renomear",
|
||||
"OnHealthIssueHelpText": "Em Problema de Status",
|
||||
"OnHealthIssueHelpText": "Ao ter problemas no estado de funcionamento",
|
||||
"OnGrabHelpText": "Ao Capturar",
|
||||
"OnDownloadHelpText": "Notificar quando os filmes forem importados com sucesso",
|
||||
"NotMonitored": "Não Monitorado",
|
||||
"NotificationTriggers": "Disparadores de Notificação",
|
||||
"NotificationTriggers": "Acionadores de notificação",
|
||||
"NotAvailable": "Não Disponível",
|
||||
"NoMinimumForAnyRuntime": "Sem mínimo para tempo de execução",
|
||||
"NoLimitForAnyRuntime": "Sem limite de tempo de execução",
|
||||
"NoLeaveIt": "Não, Deixe-o",
|
||||
"NoLeaveIt": "Não, deixe-o",
|
||||
"New": "Novo",
|
||||
"NetCore": "Core .NET",
|
||||
"NamingSettings": "Ajustes de Nomeação",
|
||||
@@ -388,7 +388,7 @@
|
||||
"MonoVersion": "Versão do Mono",
|
||||
"MonitoredHelpText": "Baixar Filme se disponível",
|
||||
"Mode": "Modo",
|
||||
"MinimumLimits": "Limites Mínimos",
|
||||
"MinimumLimits": "Limites mínimos",
|
||||
"MinimumFreeSpaceWhenImportingHelpText": "Evitar a importação caso deixe menos espaço livre em disco que esta quantidade",
|
||||
"MinimumFreeSpace": "Espaço Livre Mínimo",
|
||||
"MinimumAgeHelpText": "Somente Usenet: Tempo de espera mínimo, em minutos, dos NZBs, para que sejam baixados. Use isto para dar às novas versões tempo de propagar-se em seu provedor de usenet.",
|
||||
@@ -400,7 +400,7 @@
|
||||
"Mechanism": "Mecanismo",
|
||||
"MaximumSizeHelpText": "Tamanho máximo de uma versão para ser importada, em MB. Ajuste para zero para ilimitado",
|
||||
"MaximumSize": "Tamanho Máximo",
|
||||
"MaximumLimits": "Limites Máximos",
|
||||
"MaximumLimits": "Limites máximos",
|
||||
"Logs": "Logs",
|
||||
"LogLevel": "Nível de log",
|
||||
"Local": "Local",
|
||||
@@ -413,7 +413,7 @@
|
||||
"IndexerFlags": "Flags do Indexador",
|
||||
"IncludeUnmonitored": "Incluir Não Monitorados",
|
||||
"IncludeUnknownMovieItemsHelpText": "Mostrar items sem um filme na fila, isso pode incluir filmes removidos, filmes ou qualquer outra coisa na categoria Prowlarr",
|
||||
"IncludeHealthWarningsHelpText": "Incluir Alertas de Status",
|
||||
"IncludeHealthWarningsHelpText": "Incluir avisos de estado de funcionamento",
|
||||
"IncludeCustomFormatWhenRenamingHelpText": "Incluir no formato de renomeação {Custom Formats}",
|
||||
"IncludeCustomFormatWhenRenaming": "Incluir Formato Personalizado ao Renomear",
|
||||
"ImportMovies": "Importar Filmes",
|
||||
@@ -428,14 +428,14 @@
|
||||
"IconForCutoffUnmet": "Ícone para Ponto de Corte Não-alcançado",
|
||||
"ICalHttpUrlHelpText": "Copie este endereço para sua aplicação ou clique para registrar-se caso seu navegador suporte webcal",
|
||||
"ICalFeed": "Feed iCal",
|
||||
"Hostname": "Nome do Servidor",
|
||||
"Hostname": "Nome do servidor",
|
||||
"HelpText": "Intervalo em minutos. Coloque zero para desabilitar (isso irá parar toda a captura automática)",
|
||||
"Group": "Grupo",
|
||||
"GrabRelease": "Capturar Versão",
|
||||
"GrabID": "Capturar ID",
|
||||
"Grab": "Capturar",
|
||||
"Global": "Global",
|
||||
"GeneralSettings": "Ajustes Gerais",
|
||||
"GeneralSettings": "Definições gerais",
|
||||
"FollowPerson": "Seguir Pessoa",
|
||||
"Folders": "Pastas",
|
||||
"Fixed": "Corrigido",
|
||||
@@ -445,37 +445,37 @@
|
||||
"FileChmodMode": "Modo CHMOD de arquivo",
|
||||
"Exluded": "Excluído",
|
||||
"Ended": "Finalizado",
|
||||
"EnableSslHelpText": " Requer reiniciar a aplicação como administrador para ter efeito",
|
||||
"EnableSslHelpText": " Requer reinício da aplicação como administrador para aplicar alterações",
|
||||
"EnableSSL": "Ativar SSL",
|
||||
"EnableRSS": "Ativar RSS",
|
||||
"EnableMediaInfoHelpText": "Extraia informações de vídeo como resolução, tempo de execução e informações de codec dos arquivos. Isso requer que o Prowlarr leia partes do arquivo, o que pode causar alta atividade de disco ou de rede durante as varreduras.",
|
||||
"EnableInteractiveSearch": "Ativar Busca Interativa",
|
||||
"EnableHelpText": "Ativar criação de arquivo de metadados para este tipo de metadados",
|
||||
"EnableMediaInfoHelpText": "Extraia informações de vídeo como resolução, tempo de execução e informações de codec dos ficheiros. Isso requer que o Prowlarr leia partes do ficheiro, o que pode causar alta atividade de disco ou de rede durante as análises.",
|
||||
"EnableInteractiveSearch": "Ativar pesquisa interativa",
|
||||
"EnableHelpText": "Ativar criação de ficheiro de metadados para este tipo de metadados",
|
||||
"EnabledHelpText": "Ativar esta lista para uso no Prowlarr",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Automaticamente importar downloads completados do gerenciador de downloads",
|
||||
"EnableColorImpairedModeHelpText": "Estilo alterado para permitir que usuários com daltonismo possam melhor distinguir informações de cores",
|
||||
"EnableColorImpairedMode": "Ativar Modo de Daltonismo",
|
||||
"EnableAutomaticSearch": "Ativar Busca Automática",
|
||||
"EnableAutomaticAdd": "Ativar Adição Automática",
|
||||
"EnableCompletedDownloadHandlingHelpText": "Automaticamente importar transferências concluídas do cliente de transferências",
|
||||
"EnableColorImpairedModeHelpText": "Estilo alterado para permitir que utilizadores com daltonismo possam melhor distinguir informações de cores",
|
||||
"EnableColorImpairedMode": "Ativar modo de daltonismo",
|
||||
"EnableAutomaticSearch": "Ativar pesquisa automática",
|
||||
"EnableAutomaticAdd": "Ativar adição automática",
|
||||
"EnableAutoHelpText": "Se ativado, Filmes desta lista serão automaticamente adicionados ao Prowlarr",
|
||||
"Enable": "Habilitar",
|
||||
"Enable": "Ativar",
|
||||
"EditPerson": "Editar Pessoa",
|
||||
"EditMovie": "Editar Filme",
|
||||
"Edition": "Edição",
|
||||
"DownloadWarningCheckDownloadClientForMoreDetails": "Alerta de download: verifique mais detalhes no gerenciador de downloads",
|
||||
"DownloadPropers": "Baixar Propers",
|
||||
"DownloadFailedCheckDownloadClientForMoreDetails": "Falha no download: verifique mais detalhes no gerenciador de downloads",
|
||||
"DownloadClientSettings": "Ajustes do Gerenciador de Downloads",
|
||||
"DownloadClientSettings": "Definições do cliente de transferências",
|
||||
"Docker": "Docker",
|
||||
"DestinationRelativePath": "Caminho Relativo de Destino",
|
||||
"DestinationPath": "Caminho de Destino",
|
||||
"DeleteTag": "Deletar Tag",
|
||||
"DeleteTag": "Excluir etiqueta",
|
||||
"DeleteSelectedMovieFiles": "Deletar Arquivos de Filme Selecionados",
|
||||
"DeleteRestriction": "Deletar Restrição",
|
||||
"DeleteQualityProfile": "Deletar Perfil de Qualidade",
|
||||
"DeleteNotification": "Deletar Notificação",
|
||||
"DeleteNotification": "Eliminar notificação",
|
||||
"DeleteList": "Deletar Lista",
|
||||
"DeleteIndexer": "Deletar Indexador",
|
||||
"DeleteIndexer": "Eliminar indexador",
|
||||
"DeleteImportListExclusion": "Apagar Exclusão de Lista de Importação",
|
||||
"DeleteFile": "Apagar arquivo",
|
||||
"DeleteEmptyFoldersHelpText": "Deletar pastas de filmes vazias durante a varredura de disco e quando arquivos de filmes são apagados",
|
||||
@@ -483,9 +483,9 @@
|
||||
"DeleteDownloadClient": "Deletar Gerenciador de Download",
|
||||
"DeleteDelayProfile": "Deletar Perfil de Espera",
|
||||
"DeleteCustomFormat": "Deletar Formato Personalizado",
|
||||
"DeleteBackup": "Deletar Backup",
|
||||
"DelayProfile": "Perfil de Espera",
|
||||
"DBMigration": "Migração de DB",
|
||||
"DeleteBackup": "Eliminar cópia de segurança",
|
||||
"DelayProfile": "Perfil de atraso",
|
||||
"DBMigration": "Migração de base de dados",
|
||||
"CutoffHelpText": "Quando esta qualidade for alcançada, o Prowlarr não irá mais baixar filmes",
|
||||
"CutoffFormatScoreHelpText": "Quando esta pontuação do formato personalizado for alcançada, o Prowlarr não irá mais baixar filmes",
|
||||
"CustomFormatsSettings": "Ajustes Personalizados de Formatos",
|
||||
@@ -494,7 +494,7 @@
|
||||
"CreateEmptyMovieFolders": "Criar pastas vazias para filmes",
|
||||
"CopyUsingHardlinksHelpTextWarning": "Ocasionalmente, bloqueios de arquivos podem impedir a renomeação de arquivos que ainda estão em modo seed. Você pode temporariamente desabilitar o seeding e usar a função de renomeação do Prowlarr como uma solução alternativa.",
|
||||
"CopyUsingHardlinksHelpText": "Usar Hardlinks ao tentar copiar arquivos a partir de torrents que ainda estão em modo seed",
|
||||
"ConnectSettings": "Configurações de Conexão",
|
||||
"ConnectSettings": "Configurações de conexão",
|
||||
"Conditions": "Condições",
|
||||
"ColonReplacementFormatHelpText": "Mude a forma como o Prowlarr lida com a substituição de dois-pontos",
|
||||
"ColonReplacement": "Substituição de dois-pontos",
|
||||
@@ -510,21 +510,21 @@
|
||||
"CertificationCountryHelpText": "Selecionar País para Certificação de Filmes",
|
||||
"CertificationCountry": "País de certificação",
|
||||
"CertificateValidationHelpText": "Mudar nível de restrição da validação da certificação HTTPS",
|
||||
"CertificateValidation": "Validação de Certificado",
|
||||
"BypassProxyForLocalAddresses": "Ignorar Proxy para Endereços Locais",
|
||||
"CertificateValidation": "Validação de certificado",
|
||||
"BypassProxyForLocalAddresses": "Ignorar proxy para endereços locais",
|
||||
"Branch": "Ramificação",
|
||||
"BlacklistRelease": "Bloquear Versão",
|
||||
"BlacklistHelpText": "Evite que o Prowlarr tente automaticamente capturar esta versão do filme novamente",
|
||||
"BindAddressHelpText": "Endereço IP4 válido ou '*' para todas as interfaces",
|
||||
"BindAddress": "Endereço IP Atribuído",
|
||||
"Backups": "Backups",
|
||||
"BindAddressHelpText": "Endereço IP4 válido ou \"*\" para todas as interfaces",
|
||||
"BindAddress": "Endereço de vínculo",
|
||||
"Backups": "Cópias de segurança",
|
||||
"BackupFolderHelpText": "Caminhos relativos estarão na pasta AppData do Prowlarr",
|
||||
"BackupIntervalHelpText": "Intervalo entre backups automáticos",
|
||||
"BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão deletados automaticamente",
|
||||
"BackupRetentionHelpText": "Cópias de segurança automáticas anteriores ao período de retenção serão eliminadas automaticamente",
|
||||
"Cutoff": "Corte",
|
||||
"CustomFormatJSON": "JSON Personalizado",
|
||||
"CouldNotFindResults": "Nenhum resultado encontrado para '{0}'",
|
||||
"ClientPriority": "Prioridade do Gerenciador",
|
||||
"ClientPriority": "Prioridade do cliente",
|
||||
"ClickToChangeMovie": "Clique para modificar filme",
|
||||
"CheckDownloadClientForDetails": "verifique o gerenciador de downloads para mais detalhes",
|
||||
"CantFindMovie": "Por que não consigo encontrar meu filme?",
|
||||
@@ -533,12 +533,12 @@
|
||||
"BranchUpdate": "Ramificação utilizada para atualizar o Prowlarr",
|
||||
"BeforeUpdate": "Antes de atualizar",
|
||||
"AvailabilityDelayHelpText": "Quantidade de tempo antes ou depois da data de disponibilidade para buscar por Filme",
|
||||
"ApplyTagsHelpTexts4": "Substituir: substitui as tags pelas tags adicionadas (deixe em branco para limpar todas as tags)",
|
||||
"ApplyTagsHelpTexts3": "Remover: remove as tags adicionadas",
|
||||
"ApplyTagsHelpTexts2": "Adicionar: adicionar às tags a lista existente de tags",
|
||||
"ApplyTagsHelpTexts1": "Como adicionar tags aos filmes selecionados",
|
||||
"ApplyTagsHelpTexts4": "Substituir: mudar as etiquetas pelas adicionadas (deixe em branco para limpar todas as etiquetas)",
|
||||
"ApplyTagsHelpTexts3": "Remover: excluir as etiquetas adicionadas",
|
||||
"ApplyTagsHelpTexts2": "Adicionar: agregar as etiquetas à lista existente de etiquetas",
|
||||
"ApplyTagsHelpTexts1": "Como adicionar etiquetas aos filmes selecionados",
|
||||
"AllowMovieChangeClickToChangeMovie": "Clique para trocar o filme",
|
||||
"AddingTag": "Adicionando tag",
|
||||
"AddingTag": "Adicionando etiqueta",
|
||||
"AddImportExclusionHelpText": "Impedir filme de ser adicionado ao Prowlarr através de listas",
|
||||
"DelayingDownloadUntilInterp": "Suspendendo download até {0} às {1}",
|
||||
"CopyToClipboard": "Copiar à Área de Transferência",
|
||||
@@ -552,7 +552,7 @@
|
||||
"CustomFormatUnknownConditionOption": "Opção '{0}' desconhecida para condição '{1}'",
|
||||
"CustomFormatUnknownCondition": "Condição de Formato Personalizado '{0}' desconhecida",
|
||||
"CloneCustomFormat": "Clonar Formato Personalizado",
|
||||
"AutomaticSearch": "Busca Automática",
|
||||
"AutomaticSearch": "Pesquisa automática",
|
||||
"UnableToLoadIndexers": "Não foi possível carregar os Indexadores",
|
||||
"UnableToLoadIndexerOptions": "Não é possível carregar as opções do indexador",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "Não foi possível adicionar um novo indexador, tente novamente.",
|
||||
@@ -561,30 +561,30 @@
|
||||
"RSSIsNotSupportedWithThisIndexer": "RSS não é suportado por esse indexador",
|
||||
"ProwlarrSupportsAnyIndexer": "O Prowlarr suporta qualquer indexador que use o padrão Newznab, bem como outros indexadores listados abaixo.",
|
||||
"IndexerPriorityHelpText": "Prioridade do Indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.",
|
||||
"IndexerPriority": "Prioridade do Indexador",
|
||||
"IndexerPriority": "Prioridade do indexador",
|
||||
"ForMoreInformationOnTheIndividualIndexers": "Para mais informações sobre cada indexador, clique nos botões de informação.",
|
||||
"EnableInteractiveSearchHelpTextWarning": "Este indexador não suporta busca",
|
||||
"EditIndexer": "Modificar Indexador",
|
||||
"DeleteIndexerMessageText": "Tem certeza que quer apagar o indexador '{0}'?",
|
||||
"AddIndexer": "Adicionar Indexador",
|
||||
"DeleteIndexerMessageText": "Tem a certeza que quer eliminar o indexador \"{0}\"?",
|
||||
"AddIndexer": "Adicionar indexador",
|
||||
"UsenetDelayHelpText": "Tempo de espera, em minutos, para aguardar antes de capturar uma versão de Usenet",
|
||||
"ShowCutoffUnmetIconHelpText": "Mostrar ícone para arquivos quando o ponto de corte não tiver sido alcançado",
|
||||
"ReleaseRejected": "Versão Rejeitada",
|
||||
"SetPermissions": "Definir Permissões",
|
||||
"SearchForMovie": "Buscar filme",
|
||||
"ScriptPath": "Caminho do Script",
|
||||
"ScriptPath": "Caminho do script",
|
||||
"Retention": "Retenção",
|
||||
"Result": "Resultado",
|
||||
"Restore": "Restaurar",
|
||||
"RestartProwlarr": "Reiniciar Prowlarr",
|
||||
"RestartNow": "Reiniciar Agora",
|
||||
"ResetAPIKey": "Redefinir Chave API",
|
||||
"Reset": "Redefinir",
|
||||
"RestartNow": "Reiniciar agora",
|
||||
"ResetAPIKey": "Repor chave da API",
|
||||
"Reset": "Repor",
|
||||
"RequiredPlaceHolder": "Adicionar nova restrição",
|
||||
"ReplaceIllegalCharacters": "Substituir Caracteres Ilegais",
|
||||
"Reorder": "Reordenar",
|
||||
"RenameMovies": "Renomear Filmes",
|
||||
"RemovingTag": "Removendo tag",
|
||||
"RemovingTag": "Removendo etiqueta",
|
||||
"RemoveFromQueue": "Remover da fila",
|
||||
"RemoveFromDownloadClient": "Remover do Gerenciador de Downloads",
|
||||
"RemoveFromBlacklist": "Remover da blacklist",
|
||||
@@ -597,7 +597,7 @@
|
||||
"RecyclingBin": "Lixeira",
|
||||
"Reason": "Razão",
|
||||
"Real": "Real",
|
||||
"ReadTheWikiForMoreInformation": "Leia a Wiki para mais informações",
|
||||
"ReadTheWikiForMoreInformation": "Leia a Wiki para obter mais informações",
|
||||
"ProwlarrTags": "Tags do Prowlarr",
|
||||
"Prowlarr": "Prowlarr",
|
||||
"Queued": "Em Fila",
|
||||
@@ -605,11 +605,11 @@
|
||||
"Pending": "Pendente",
|
||||
"Paused": "Pausado",
|
||||
"OnDeleteHelpText": "Ao Apagar",
|
||||
"NoUpdatesAreAvailable": "No há atualizações disponíveis",
|
||||
"NoTagsHaveBeenAddedYet": "Nenhuma tag foi adicionada ainda",
|
||||
"NoLogFiles": "Sem arquivos de log",
|
||||
"NoUpdatesAreAvailable": "Não há atualizações disponíveis",
|
||||
"NoTagsHaveBeenAddedYet": "Nenhuma etiqueta foi adicionada ainda",
|
||||
"NoLogFiles": "Sem ficheiros de log",
|
||||
"NoHistory": "Sem histórico",
|
||||
"NoBackupsAreAvailable": "Não há backups disponíveis",
|
||||
"NoBackupsAreAvailable": "Não há cópias de segurança disponíveis",
|
||||
"MoviesSelectedInterp": "{0} Filme(s) Selecionado(s)",
|
||||
"MovieIsUnmonitored": "O filme não é monitorado",
|
||||
"MinutesSixty": "60 Minutos: {0}",
|
||||
@@ -644,18 +644,18 @@
|
||||
"FailedLoadingSearchResults": "Erro ao carregar resultados da busca. Por favor, tente novamente.",
|
||||
"ExtraFileExtensionsHelpTexts2": "Exemplos: '.sub, .nfo' ou 'sub,nfo'",
|
||||
"ExtraFileExtensionsHelpTexts1": "Lista separada por vírgulas de arquivos extras a importar (.nfo será importado como .nfo-orig)",
|
||||
"ExistingTag": "Tag Existente",
|
||||
"ExistingTag": "Etiqueta existente",
|
||||
"TmdbIdHelpText": "ID TMDb do filme a ser ignorado",
|
||||
"MovieExcludedFromAutomaticAdd": "Filme Ignorado da Inclusão Automática",
|
||||
"MovieAlreadyExcluded": "Filme já Ignorado",
|
||||
"ExcludeMovie": "Ignorar Filme",
|
||||
"Excluded": "Ignorado",
|
||||
"Exception": "Falha",
|
||||
"Exception": "Exceção",
|
||||
"ErrorLoadingPreviews": "Erro ao carregar pré-visualizações",
|
||||
"ErrorLoadingContents": "Erro ao carregar conteúdo",
|
||||
"EnableInteractiveSearchHelpText": "Será utilizado ao realizar uma busca interativa",
|
||||
"EnableAutomaticSearchHelpTextWarning": "Será utilizado ao realizar uma busca interativa",
|
||||
"EnableAutomaticSearchHelpText": "Será utilizado ao realizar buscas automáticas através da UI ou pelo Prowlarr",
|
||||
"EnableAutomaticSearchHelpText": "Será utilizado ao realizar buscas automáticas através da IU ou pelo Prowlarr",
|
||||
"DownloadWarning": "Alerta de download: {0}",
|
||||
"DownloadPropersAndRepacksHelpTextWarning": "Use palavras preferidas para atualizações automáticas a propers/repacks",
|
||||
"PreferredSize": "Tamanho Preferido",
|
||||
@@ -669,13 +669,13 @@
|
||||
"DownloadedAndMonitored": "Baixado e Monitorado",
|
||||
"DownloadClientUnavailable": "O gerenciador de downloads não está disponível",
|
||||
"Disabled": "Desativado",
|
||||
"DeleteTagMessageText": "Tem certeza que quer deletar a tag '{0}'?",
|
||||
"DeleteTagMessageText": "Tem a certeza que quer eliminar a etiqueta \"{0}\"?",
|
||||
"DeleteSelectedMovieFilesMessage": "Tem certeza que quer apagar os arquivos de filme selecionados?",
|
||||
"DeleteRestrictionHelpText": "Tem certeza que quer deletar esta restrição?",
|
||||
"DeleteNotificationMessageText": "Tem certeza que quer deletar a notificação '{0}'?",
|
||||
"DeleteNotificationMessageText": "Tem a certeza que quer eliminar a notificação \"{0}\"?",
|
||||
"DeleteListMessageText": "Tem certeza que quer deletar a lista '{0}'?",
|
||||
"DeleteDownloadClientMessageText": "Tem certeza que quer deletar o gerenciador de downloads '{0}'?",
|
||||
"DeleteBackupMessageText": "Tem certeza que quer apagar o backup '{0}'?",
|
||||
"DeleteBackupMessageText": "Tem a certeza que quer eliminar a cópia de segurança \"{0}\"?",
|
||||
"RenameMoviesHelpText": "O Prowlarr usará o nome atual do arquivo se a renomeação estiver desabilitada",
|
||||
"IncludeRecommendationsHelpText": "Incluir filmes recomendados pelo Prowlarr na visão de descobrimento",
|
||||
"YouCanAlsoSearch": "Você também pode buscar utilizando o ID TMDb ou IMDb de um filme, p. ex. tmdb:71663",
|
||||
@@ -693,16 +693,16 @@
|
||||
"TimeFormat": "Formato de Hora",
|
||||
"ThisConditionMatchesUsingRegularExpressions": "Esta condição utiliza expressões regulares. Note que os caracteres {0} têm significados especiais e precisam de escape com um {1}",
|
||||
"TestAllLists": "Testar Todas as Listas",
|
||||
"TestAllClients": "Testar todos os Gerenciadores",
|
||||
"TagsHelpText": "Aplica-se a filmes com pelo menos uma tag correspondente",
|
||||
"TagIsNotUsedAndCanBeDeleted": "A Tag não é utilizada e pode ser deletada",
|
||||
"TestAllClients": "Testar todos os clientes",
|
||||
"TagsHelpText": "Aplica-se a indexadores com pelo menos uma etiqueta correspondente",
|
||||
"TagIsNotUsedAndCanBeDeleted": "A etiqueta não é utilizada e pode ser excluída",
|
||||
"SubfolderWillBeCreatedAutomaticallyInterp": "A subpasta '{0}' será criada automaticamente",
|
||||
"StartTypingOrSelectAPathBelow": "Comece a digitar ou selecione um caminho abaixo",
|
||||
"StandardMovieFormat": "Formato Padrão de Filme",
|
||||
"SSLCertPathHelpText": "Caminho para o arquivo PFX",
|
||||
"SSLCertPath": "Caminho do Certificado SSL",
|
||||
"SSLCertPath": "Caminho do certificado SSL",
|
||||
"SSLCertPasswordHelpText": "Senha do arquivo PFX",
|
||||
"SSLCertPassword": "Senha do Certificado SSL",
|
||||
"SSLCertPassword": "Palavra-passe do certificado SSL",
|
||||
"SourceRelativePath": "Caminho Relativo de Origem",
|
||||
"SourcePath": "Caminho de Origem",
|
||||
"SorryThatMovieCannotBeFound": "Desculpe, este filme não foi encontrado.",
|
||||
@@ -724,12 +724,12 @@
|
||||
"SettingsRuntimeFormat": "Formato de Tempo de Execução",
|
||||
"SetPermissionsLinuxHelpTextWarning": "Se você não conhece essa configuração, não a altere.",
|
||||
"SetPermissionsLinuxHelpText": "Deve-se executar CHMOD ao importar/renomear arquivos?",
|
||||
"SendAnonymousUsageData": "Enviar Dados Anônimos de Uso",
|
||||
"SendAnonymousUsageData": "Enviar dados anônimos de uso",
|
||||
"SearchOnAddHelpText": "Buscar os filmes desta lista ao ser adicionada ao Prowlarr",
|
||||
"RSSSyncInterval": "Intervalo de Sincronização de RSS",
|
||||
"RetryingDownloadInterp": "Nova tentativa de download {0} às {1}",
|
||||
"RetentionHelpText": "Somente Usenet: ajustar para zero para retenção ilimitada",
|
||||
"RestartRequiredHelpTextWarning": "É necessário reiniciar para aplicar alterações",
|
||||
"RestartRequiredHelpTextWarning": "Requer reinício para aplicar alterações",
|
||||
"RescanMovieFolderAfterRefresh": "Varrer novamente a Pasta do Filme após Atualizar",
|
||||
"RescanAfterRefreshHelpTextWarning": "O Prowlarr não irá automaticamente detectar mudanças nos arquivos quando a opção selecionada não for \"Sempre\"",
|
||||
"RescanAfterRefreshHelpText": "Efetuar uma nova varredura na pasta do filme após atualizar o filme",
|
||||
@@ -743,12 +743,12 @@
|
||||
"ProwlarrSupportsAnyRSSMovieListsAsWellAsTheOneStatedBelow": "O Prowlarr suporta qualquer lista RSS de filmes, bem como os demais listados abaixo.",
|
||||
"ProwlarrSupportsAnyDownloadClient": "O Prowlarr suporta qualquer gerenciador de download que utilize o padrão Newznab, bem como os demais listados abaixo.",
|
||||
"QualityProfileDeleteConfirm": "Tem certeza que quer deletar o perfil de qualidade {0}",
|
||||
"ProxyUsernameHelpText": "Apenas insira usuário e senha caso seja requerido. Caso contrário, deixe em branco.",
|
||||
"ProxyPasswordHelpText": "Apenas insira usuário e senha caso seja requerido. Caso contrário, deixe em branco.",
|
||||
"ProxyBypassFilterHelpText": "Use ',' como separador e '*.' como coringa para subdomínios",
|
||||
"ProxyUsernameHelpText": "Apenas insira o utilizador e a palavra-passe caso seja requerido. Caso contrário, deixe em branco.",
|
||||
"ProxyPasswordHelpText": "Apenas insira o utilizador e a palavra-passe caso seja requerido. Caso contrário, deixe em branco.",
|
||||
"ProxyBypassFilterHelpText": "Use \",\" como separador e \"*.\" como caráter universal para subdomínios",
|
||||
"Proper": "Proper",
|
||||
"MovieInfoLanguage": "Idioma das Informações dos Filmes",
|
||||
"MaintenanceRelease": "Versão de Manutenção",
|
||||
"MaintenanceRelease": "Versão de manutenção",
|
||||
"TorrentDelay": "Espera para Torrents",
|
||||
"UsenetDelay": "Espera para Usenet",
|
||||
"UnableToLoadDelayProfiles": "Não foi possível carregar os Perfis de Espera",
|
||||
@@ -769,15 +769,15 @@
|
||||
"LogLevelTraceHelpTextWarning": "Log em modo trace somente deve ser habilitado temporariamente",
|
||||
"ListSyncLevelHelpText": "Filmes na biblioteca serão removidos ou não mais monitorados se não estiverem em sua lista",
|
||||
"LaunchBrowserHelpText": " Abrir o navegador e abrir a página principal do Prowlarr ao iniciar a aplicação.",
|
||||
"TagCannotBeDeletedWhileInUse": "Não é possível deletar enquanto estiver em uso",
|
||||
"TagCannotBeDeletedWhileInUse": "Não é possível excluir enquanto estiver em uso",
|
||||
"SuggestTranslationChange": "Sugerir mudança na tradução",
|
||||
"StartupDirectory": "Pasta de início",
|
||||
"StartupDirectory": "Diretório de início",
|
||||
"SSLPort": "Porta SSL",
|
||||
"YesCancel": "Sim, Cancelar",
|
||||
"WaitingToProcess": "Aguardando para Processar",
|
||||
"WaitingToImport": "Aguardando para Importar",
|
||||
"Version": "Versão",
|
||||
"Username": "Nome de Usuário",
|
||||
"Username": "Nome de utilizador",
|
||||
"UseProxy": "Usar Proxy",
|
||||
"Usenet": "Usenet",
|
||||
"UseHardlinksInsteadOfCopy": "Usar Hardlinks em vez de Copiar",
|
||||
@@ -785,9 +785,9 @@
|
||||
"Uptime": "Tempo de Atividade",
|
||||
"Unreleased": "Não Lançado",
|
||||
"Ungroup": "Desagrupar",
|
||||
"UnableToLoadUISettings": "Não foi possível carregar os ajustes de UI",
|
||||
"UnableToLoadUISettings": "Não foi possível carregar as definições da IU",
|
||||
"UnableToLoadTheCalendar": "Não foi possível carregar o calendário",
|
||||
"UnableToLoadTags": "Não foi possível carregar as Tags",
|
||||
"UnableToLoadTags": "Não foi possível carregar as etiquetas",
|
||||
"UnableToLoadRootFolders": "Não foi possível carregar as pastas raízes",
|
||||
"UnableToLoadRestrictions": "Não foi possível carregar as Restrições",
|
||||
"UnableToLoadRemotePathMappings": "Não foi possível carregar os Mapeamentos de Caminhos Remotos",
|
||||
@@ -816,15 +816,15 @@
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "Não foi possível adicionar uma nova notificação, tente novamente.",
|
||||
"UnableToAddANewListExclusionPleaseTryAgain": "Não foi possível adicionar uma nova exclusão de lista, tente novamente.",
|
||||
"UnableToAddANewListPleaseTryAgain": "Não foi possível adicionar uma nova lista, tente novamente.",
|
||||
"UISettings": "Ajustes da UI",
|
||||
"UILanguageHelpTextWarning": "Será necessário reiniciar o navegador",
|
||||
"UILanguageHelpText": "Idioma que o Radar irá usar para a interface gráfica",
|
||||
"UILanguage": "Idioma da UI",
|
||||
"UISettings": "Definições da IU",
|
||||
"UILanguageHelpTextWarning": "É necessário reiniciar o navegador",
|
||||
"UILanguageHelpText": "Idioma que o Prowlarr usará para a IU",
|
||||
"UILanguage": "Idioma da IU",
|
||||
"TotalFileSize": "Tamanho Total do Arquivo",
|
||||
"Torrents": "Torrents",
|
||||
"FocusSearchBox": "Focar no Campo de Busca",
|
||||
"CloseCurrentModal": "Fechar Pop-up Atual",
|
||||
"AcceptConfirmationModal": "Aceitar Pop-up de Confirmação",
|
||||
"AcceptConfirmationModal": "Aceitar pop-up de confirmação",
|
||||
"OpenThisModal": "Abrir este Pop-up",
|
||||
"SaveSettings": "Salvar Ajustes",
|
||||
"MovieIndexScrollTop": "Índice de Filmes: Rolar para Cima",
|
||||
@@ -848,5 +848,77 @@
|
||||
"Digital": "Digital",
|
||||
"CancelProcessing": "Cancelar Processamento",
|
||||
"AddRestriction": "Adicionar Restrição",
|
||||
"AddMovie": "Adicionar Filme"
|
||||
"AddMovie": "Adicionar Filme",
|
||||
"SettingsConsoleLogLevel": "Nível de log do console",
|
||||
"SearchIndexers": "Pesquisar indexadores",
|
||||
"NewznabVipCheckExpiringClientMessage": "Os benefícios VIP do indexador estão prestes a expirar: {0}",
|
||||
"NewznabVipCheckExpiredClientMessage": "Os benefícios VIP do indexador expiraram: {0}",
|
||||
"IndexersSelectedInterp": "{0} indexador(es) selecionado(s)",
|
||||
"IndexerRss": "RSS do indexador",
|
||||
"IndexerQuery": "Consulta do indexador",
|
||||
"IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao Prowlarr",
|
||||
"IndexerLongTermStatusCheckSingleClientMessage": "Indexadores indisponíveis devido a erros por mais de 6 horas: {0}",
|
||||
"IndexerLongTermStatusCheckAllClientMessage": "Todos os indexadores estão indisponíveis devido a erros por mais de 6 horas",
|
||||
"IndexerHealthCheckNoIndexers": "Não há indexadores ativados, o Prowlarr não retornará resultados de pesquisa",
|
||||
"IndexerAuth": "Autenticação do indexador",
|
||||
"EnableRssHelpText": "Ativar feed RSS para o indexador",
|
||||
"EnableIndexer": "Ativar indexador",
|
||||
"EnableRss": "Ativar RSS",
|
||||
"EditAppProfile": "Editar perfil da aplicação",
|
||||
"DevelopmentSettings": "Configurações de desenvolvimento",
|
||||
"DeleteApplicationMessageText": "Tem certeza que deseja excluir a aplicação \"{0}\"?",
|
||||
"DeleteApplication": "Excluir aplicação",
|
||||
"ClearHistoryMessageText": "Tem certeza que deseja limpar todo o histórico do Prowlarr?",
|
||||
"ClearHistory": "Limpar histórico",
|
||||
"AppProfiles": "Perfis de aplicações",
|
||||
"ApplicationStatusCheckSingleClientMessage": "Aplicações indisponíveis devido a falhas: {0}",
|
||||
"ApplicationStatusCheckAllClientMessage": "Todas as aplicações estão indisponíveis devido a falhas",
|
||||
"AllIndexersHiddenDueToFilter": "Todos os indexadores estão ocultos devido ao filtro aplicado.",
|
||||
"AddToDownloadClient": "Adicionar lançamento ao cliente de download",
|
||||
"AddNewIndexer": "Adicionar novo indexador",
|
||||
"AddedToDownloadClient": "Lançamento adicionado ao cliente",
|
||||
"AppProfile": "Perfil da aplicação",
|
||||
"AddAppProfile": "Adicionar perfil de sincronização da aplicação",
|
||||
"SettingsFilterSentryEventsHelpText": "Filtrar eventos de erro de utilizador conhecidos para que não sejam enviados para análise",
|
||||
"Yesterday": "Ontem",
|
||||
"Wiki": "Wiki",
|
||||
"UnableToLoadDevelopmentSettings": "Não foi possível carregar as configurações de desenvolvimento",
|
||||
"Tomorrow": "Amanhã",
|
||||
"Today": "Hoje",
|
||||
"TestAllApps": "Testar todos os aplicativos",
|
||||
"SyncAppIndexers": "Sincronizar indexadores do aplicativo",
|
||||
"SettingsSqlLoggingHelpText": "Registrar todas as consultas de SQL do Prowlarr",
|
||||
"SettingsLogSql": "Registrar SQL",
|
||||
"SettingsLogRotateHelpText": "Quantidade máxima de arquivos de log a manter na pasta",
|
||||
"SettingsLogRotate": "Rotação de logs",
|
||||
"SettingsIndexerLoggingHelpText": "Registrar dados adicionar do indexador, incluindo resposta",
|
||||
"SettingsIndexerLogging": "Registro em log avançado do indexador",
|
||||
"SettingsFilterSentryEvents": "Filtrar eventos de análises",
|
||||
"RSS": "RSS",
|
||||
"RedirectHelpText": "Redirecionar as solicitações de download de entrada para o indexador, em vez de por proxy usando o Prowlarr",
|
||||
"Redirect": "Redirecionar",
|
||||
"Reddit": "Reddit",
|
||||
"HomePage": "Página inicial",
|
||||
"FeatureRequests": "Solicitações de recursos",
|
||||
"AppProfileSelectHelpText": "Os perfis de aplicações são utilizados para controlar as definições de RSS, Pesquisa automática e Pesquisa interativa ao sincronizar a aplicação",
|
||||
"Discord": "Discord",
|
||||
"Presets": "Pré-sintonizações",
|
||||
"NotificationTriggersHelpText": "Selecione os eventos que acionarão esta notificação",
|
||||
"Id": "ID",
|
||||
"Grabs": "Capturas",
|
||||
"Encoding": "Codificação",
|
||||
"Enabled": "Ativado",
|
||||
"Donations": "Doações",
|
||||
"Description": "Descrição",
|
||||
"DeleteAppProfile": "Eliminar perfil de aplicação",
|
||||
"Custom": "Personalizado",
|
||||
"Category": "Categoria",
|
||||
"Auth": "Autenticação",
|
||||
"Apps": "Aplicações",
|
||||
"AppProfileInUse": "Perfil da aplicação em uso",
|
||||
"AppProfileDeleteConfirm": "Tem a certeza que quer eliminar {0}?",
|
||||
"Applications": "Aplicações",
|
||||
"AddDownloadClient": "Adicionar cliente de transferências",
|
||||
"CouldNotConnectSignalR": "Não é possível conectar-se ao SignalR, a IU não será atualizada",
|
||||
"PrioritySettings": "Prioridade"
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
"AddingTag": "Adicionando tag",
|
||||
"AddNewIndexer": "Adicionar novo indexador",
|
||||
"AddToDownloadClient": "Adicionar lançamento ao cliente de download",
|
||||
"Age": "Idade",
|
||||
"Age": "Tempo de vida",
|
||||
"All": "Todos",
|
||||
"Analytics": "Análises",
|
||||
"ApiKey": "Chave da API",
|
||||
@@ -297,7 +297,7 @@
|
||||
"SettingsFilterSentryEventsHelpText": "Filtrar eventos de erro de usuário conhecidos para que não sejam enviados para análise",
|
||||
"SettingsIndexerLogging": "Registro em log avançado do indexador",
|
||||
"SettingsIndexerLoggingHelpText": "Registrar dados adicionar do indexador, incluindo resposta",
|
||||
"SettingsLogRotate": "Registrar rotação",
|
||||
"SettingsLogRotate": "Rotação de logs",
|
||||
"SettingsLogSql": "Registrar SQL",
|
||||
"SettingsLongDateFormat": "Formato longo da data",
|
||||
"SettingsShortDateFormat": "Formato curto da data",
|
||||
@@ -366,5 +366,55 @@
|
||||
"View": "Exibir",
|
||||
"Warn": "Avisar",
|
||||
"YesCancel": "Sim, cancelar",
|
||||
"Yesterday": "Ontem"
|
||||
"Yesterday": "Ontem",
|
||||
"EnableRssHelpText": "Habilitar feed RSS para o indexador",
|
||||
"EnableRss": "Habilitar RSS",
|
||||
"EditAppProfile": "Editar perfil do aplicativo",
|
||||
"AppProfiles": "Perfis de aplicativo",
|
||||
"AddAppProfile": "Adicionar perfil de sincronização do aplicativo",
|
||||
"AppProfile": "Perfil do aplicativo",
|
||||
"Wiki": "Wiki",
|
||||
"RSS": "RSS",
|
||||
"RedirectHelpText": "Redirecionar as solicitações de download de entrada para o indexador, em vez de por proxy usando o Prowlarr",
|
||||
"Redirect": "Redirecionar",
|
||||
"Reddit": "Reddit",
|
||||
"InteractiveSearch": "Pesquisa interativa",
|
||||
"HomePage": "Página inicial",
|
||||
"FeatureRequests": "Solicitações de recursos",
|
||||
"Discord": "Discord",
|
||||
"AutomaticSearch": "Pesquisa automática",
|
||||
"AppProfileSelectHelpText": "Os perfis de aplicativos são usados para controlar as configurações de RSS, Pesquisa automática e Pesquisa interativa ao sincronizar o aplicativo",
|
||||
"UnableToLoadDownloadClients": "Não foi possível carregar os clientes de download",
|
||||
"UnableToLoadAppProfiles": "Não foi possível carregar os perfis de aplicativos",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "Não foi possível adicionar um novo cliente de download, tente novamente.",
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "Não foi possível adicionar um novo perfil de aplicativo, tente novamente.",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Não foi possível adicionar um novo aplicativo, tente novamente.",
|
||||
"Torrents": "Torrents",
|
||||
"Torrent": "Torrent",
|
||||
"Stats": "Estatísticas",
|
||||
"Query": "Consulta",
|
||||
"Privacy": "Privacidade",
|
||||
"Presets": "Predefinições",
|
||||
"NotificationTriggersHelpText": "Selecione quais eventos devem acionar esta notificação",
|
||||
"Id": "ID",
|
||||
"Grabs": "Obtenções",
|
||||
"Failed": "Falhou",
|
||||
"Encoding": "Codificação",
|
||||
"Enabled": "Habilitado",
|
||||
"Donations": "Doações",
|
||||
"Description": "Descrição",
|
||||
"DeleteDownloadClientMessageText": "Tem certeza que deseja excluir o cliente de download \"{0}\"?",
|
||||
"DeleteDownloadClient": "Excluir cliente de download",
|
||||
"DeleteAppProfile": "Excluir perfil do aplicativo",
|
||||
"Custom": "Personalizado",
|
||||
"CloneProfile": "Clonar perfil",
|
||||
"Category": "Categoria",
|
||||
"Auth": "Autenticação",
|
||||
"Apps": "Aplicativos",
|
||||
"AppProfileInUse": "Perfil de aplicativo em uso",
|
||||
"AppProfileDeleteConfirm": "Tem certeza que deseja excluir {0}?",
|
||||
"Applications": "Aplicativos",
|
||||
"AddDownloadClient": "Adicionar cliente de download",
|
||||
"CouldNotConnectSignalR": "Não é possível conectar ao SignalR, a interface não atualizará",
|
||||
"PrioritySettings": "Prioridade"
|
||||
}
|
||||
|
||||
@@ -1 +1,24 @@
|
||||
{}
|
||||
{
|
||||
"ApplyTagsHelpTexts1": "如何应用标签到已选择索引器",
|
||||
"ApplyTags": "应用标签",
|
||||
"Apply": "应用",
|
||||
"ApplicationStatusCheckSingleClientMessage": "由于故障应用程序不可用",
|
||||
"ApplicationStatusCheckAllClientMessage": "由于故障所用应用程序都不可用",
|
||||
"AppDataDirectory": "AppData 路径",
|
||||
"ApiKey": "API 密钥",
|
||||
"AnalyticsEnabledHelpText": "发送匿名操作和错误信息到 Prowlarr 服务器。包括你浏览器中与 Prowlarr WebUI、错误报告、操作系统和运行环境的信息。我们将这些信息用于确定功能优先级和 Bug 修复。",
|
||||
"Analytics": "分析图表",
|
||||
"AllIndexersHiddenDueToFilter": "隐藏所有索引器直至应用筛选器",
|
||||
"All": "全部",
|
||||
"Age": "年龄",
|
||||
"AddToDownloadClient": "添加发布到下载客户端",
|
||||
"AddNewIndexer": "添加新的索引器",
|
||||
"AddingTag": "添加便签",
|
||||
"AddIndexer": "添加索引器",
|
||||
"AddedToDownloadClient": "发布已添加档案到客户端",
|
||||
"Added": "已添加",
|
||||
"AddAppProfile": "添加应用同步档案",
|
||||
"AppProfile": "应用档案",
|
||||
"Actions": "动作",
|
||||
"About": "关于"
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace NzbDrone.Core.Notifications.Notifiarr
|
||||
var variables = new StringDictionary();
|
||||
|
||||
variables.Add("Prowlarr_EventType", "HealthIssue");
|
||||
variables.Add("Prowlarr_Health_Issue_Level", nameof(healthCheck.Type));
|
||||
variables.Add("Prowlarr_Health_Issue_Level", healthCheck.Type.ToString() ?? string.Empty);
|
||||
variables.Add("Prowlarr_Health_Issue_Message", healthCheck.Message);
|
||||
variables.Add("Prowlarr_Health_Issue_Type", healthCheck.Source.Name);
|
||||
variables.Add("Prowlarr_Health_Issue_Wiki", healthCheck.WikiUrl.ToString() ?? string.Empty);
|
||||
|
||||
@@ -11,6 +11,7 @@ namespace NzbDrone.Core.Parser.Model
|
||||
public ReleaseInfo()
|
||||
{
|
||||
IndexerFlags = new List<IndexerFlag>();
|
||||
Categories = new List<IndexerCategory>();
|
||||
}
|
||||
|
||||
public string Guid { get; set; }
|
||||
@@ -37,7 +38,7 @@ namespace NzbDrone.Core.Parser.Model
|
||||
public string Container { get; set; }
|
||||
public string Codec { get; set; }
|
||||
public string Resolution { get; set; }
|
||||
public ICollection<IndexerCategory> Category { get; set; }
|
||||
public ICollection<IndexerCategory> Categories { get; set; }
|
||||
|
||||
public ICollection<IndexerFlag> IndexerFlags { get; set; }
|
||||
|
||||
|
||||
@@ -39,20 +39,6 @@ namespace NzbDrone.Core.Parser
|
||||
|
||||
public static bool TryCoerceLong(string str, out long result) => long.TryParse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture, out result);
|
||||
|
||||
/*
|
||||
public static string GetArgumentFromQueryString(string url, string argument)
|
||||
{
|
||||
if (url == null || argument == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var qsStr = url.Split(new char[] { '?' }, 2)[1];
|
||||
qsStr = qsStr.Split(new char[] { '#' }, 2)[0];
|
||||
var qs = QueryHelpers.ParseQuery(qsStr);
|
||||
return qs[argument].FirstOrDefault();
|
||||
}*/
|
||||
|
||||
public static long? GetLongFromString(string str)
|
||||
{
|
||||
if (str == null)
|
||||
@@ -87,7 +73,7 @@ namespace NzbDrone.Core.Parser
|
||||
return int.Parse(match.Groups[1].Value, NumberStyles.Any, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
public static string GetFullImdbID(string imdbstr)
|
||||
public static string GetFullImdbId(string imdbstr)
|
||||
{
|
||||
var imdbid = GetImdbID(imdbstr);
|
||||
if (imdbid == null)
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
@@ -47,6 +48,13 @@ namespace NzbDrone.Host
|
||||
b.AddNLog();
|
||||
});
|
||||
|
||||
services.Configure<ForwardedHeadersOptions>(options =>
|
||||
{
|
||||
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
|
||||
options.KnownNetworks.Clear();
|
||||
options.KnownProxies.Clear();
|
||||
});
|
||||
|
||||
services.AddRouting(options => options.LowercaseUrls = true);
|
||||
|
||||
services.AddResponseCompression();
|
||||
@@ -143,6 +151,7 @@ namespace NzbDrone.Host
|
||||
firewallAdapter.MakeAccessible();
|
||||
}
|
||||
|
||||
app.UseForwardedHeaders();
|
||||
app.UseMiddleware<LoggingMiddleware>();
|
||||
app.UsePathBase(new PathString(configFileProvider.UrlBase));
|
||||
app.UseExceptionHandler(new ExceptionHandlerOptions
|
||||
|
||||
@@ -10,6 +10,7 @@ using NzbDrone.Common.Http;
|
||||
using NzbDrone.Core.Download;
|
||||
using NzbDrone.Core.Indexers;
|
||||
using NzbDrone.Core.IndexerSearch;
|
||||
using NzbDrone.Core.Parser;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using Prowlarr.Http.Extensions;
|
||||
using Prowlarr.Http.REST;
|
||||
@@ -51,6 +52,16 @@ namespace NzbDrone.Api.V1.Indexers
|
||||
throw new BadRequestException("Missing Function Parameter");
|
||||
}
|
||||
|
||||
request.imdbid = request.imdbid?.TrimStart('t') ?? null;
|
||||
|
||||
if (request.imdbid.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
if (!int.TryParse(request.imdbid, out var imdb) || imdb == 0)
|
||||
{
|
||||
throw new BadRequestException("Invalid Value for ImdbId");
|
||||
}
|
||||
}
|
||||
|
||||
var indexer = _indexerFactory.Get(id);
|
||||
|
||||
if (indexer == null)
|
||||
|
||||
@@ -78,19 +78,14 @@ namespace Prowlarr.Api.V1.Search
|
||||
[HttpGet]
|
||||
public Task<List<SearchResource>> GetAll(string query, [FromQuery] List<int> indexerIds, [FromQuery] List<int> categories)
|
||||
{
|
||||
if (query.IsNotNullOrWhiteSpace())
|
||||
if (indexerIds.Any())
|
||||
{
|
||||
if (indexerIds.Any())
|
||||
{
|
||||
return GetSearchReleases(query, indexerIds, categories);
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetSearchReleases(query, null, categories);
|
||||
}
|
||||
return GetSearchReleases(query, indexerIds, categories);
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetSearchReleases(query, null, categories);
|
||||
}
|
||||
|
||||
return Task.FromResult(new List<SearchResource>());
|
||||
}
|
||||
|
||||
private async Task<List<SearchResource>> GetSearchReleases(string query, List<int> indexerIds, List<int> categories)
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace Prowlarr.Api.V1.Search
|
||||
CommentUrl = releaseInfo.CommentUrl,
|
||||
DownloadUrl = releaseInfo.DownloadUrl,
|
||||
InfoUrl = releaseInfo.InfoUrl,
|
||||
Categories = releaseInfo.Category,
|
||||
Categories = releaseInfo.Categories,
|
||||
|
||||
//ReleaseWeight
|
||||
MagnetUrl = torrentInfo.MagnetUrl,
|
||||
|
||||
Reference in New Issue
Block a user