mirror of
https://github.com/Radarr/Radarr
synced 2025-12-06 16:32:36 +01:00
Compare commits
34 commits
develop
...
v5.27.5.10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
089e0fa4e6 | ||
|
|
f22ba73fd4 | ||
|
|
45527b7561 | ||
|
|
c668c6de9a | ||
|
|
242a3876b5 | ||
|
|
4aec00f2fa | ||
|
|
3b7ff51931 | ||
|
|
7345cf6b29 | ||
|
|
fcdd356b03 | ||
|
|
a013ffe23a | ||
|
|
bade4275d8 | ||
|
|
e88c4bced1 | ||
|
|
1d4c506830 | ||
|
|
4b22c43bfc | ||
|
|
c9f21e505b | ||
|
|
5bfe530834 | ||
|
|
f48eb2b803 | ||
|
|
ada3afe022 | ||
|
|
1f620eab22 | ||
|
|
42512cbcae | ||
|
|
3bb4e52078 | ||
|
|
2450468e74 | ||
|
|
03f53b595e | ||
|
|
43762f8658 | ||
|
|
2884eae6a8 | ||
|
|
c1e66cb674 | ||
|
|
4384fcd069 | ||
|
|
4fbc7d09df | ||
|
|
19e55ac198 | ||
|
|
0750379caf | ||
|
|
d2b39921fb | ||
|
|
6f9e468688 | ||
|
|
85fbc477ef | ||
|
|
af8061d36c |
70 changed files with 570 additions and 104 deletions
|
|
@ -9,7 +9,7 @@ variables:
|
|||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '5.26.2'
|
||||
majorVersion: '5.27.5'
|
||||
minorVersion: $[counter('minorVersion', 2000)]
|
||||
radarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ function BlocklistDetailsModal(props: BlocklistDetailsModalProps) {
|
|||
return (
|
||||
<Modal isOpen={isOpen} onModalClose={onModalClose}>
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>Details</ModalHeader>
|
||||
<ModalHeader>{translate('Details')}</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
<DescriptionList>
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ function Queue() {
|
|||
<PageToolbar>
|
||||
<PageToolbarSection>
|
||||
<PageToolbarButton
|
||||
label="Refresh"
|
||||
label={translate('Refresh')}
|
||||
iconName={icons.REFRESH}
|
||||
isSpinning={isRefreshing}
|
||||
onPress={handleRefreshPress}
|
||||
|
|
|
|||
|
|
@ -56,6 +56,8 @@ function CustomFiltersModalContent(props) {
|
|||
{translate('AddCustomFilter')}
|
||||
</Button>
|
||||
</div>
|
||||
<br />
|
||||
{translate('FilterMoviePropertiesOnlyNotFileWarning')}
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
|
|
|
|||
|
|
@ -47,6 +47,15 @@ function DiscoverMovieSortMenu(props) {
|
|||
{translate('Studio')}
|
||||
</SortMenuItem>
|
||||
|
||||
<SortMenuItem
|
||||
name="year"
|
||||
sortKey={sortKey}
|
||||
sortDirection={sortDirection}
|
||||
onPress={onSortSelect}
|
||||
>
|
||||
{translate('Year')}
|
||||
</SortMenuItem>
|
||||
|
||||
<SortMenuItem
|
||||
name="inCinemas"
|
||||
sortKey={sortKey}
|
||||
|
|
|
|||
|
|
@ -36,7 +36,8 @@
|
|||
.imdbRating,
|
||||
.rottenTomatoesRating,
|
||||
.traktRating,
|
||||
.runtime {
|
||||
.runtime,
|
||||
.year {
|
||||
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
|
||||
|
||||
flex: 0 0 90px;
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ interface CssExports {
|
|||
'studio': string;
|
||||
'tmdbRating': string;
|
||||
'traktRating': string;
|
||||
'year': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,8 @@
|
|||
.imdbRating,
|
||||
.rottenTomatoesRating,
|
||||
.traktRating,
|
||||
.runtime {
|
||||
.runtime,
|
||||
.year {
|
||||
composes: cell;
|
||||
|
||||
flex: 0 0 90px;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ interface CssExports {
|
|||
'studio': string;
|
||||
'tmdbRating': string;
|
||||
'traktRating': string;
|
||||
'year': string;
|
||||
}
|
||||
export const cssExports: CssExports;
|
||||
export default cssExports;
|
||||
|
|
|
|||
|
|
@ -167,6 +167,14 @@ class DiscoverMovieRow extends Component {
|
|||
);
|
||||
}
|
||||
|
||||
if (name === 'year') {
|
||||
return (
|
||||
<VirtualTableRowCell key={name} className={styles[name]}>
|
||||
{year}
|
||||
</VirtualTableRowCell>
|
||||
);
|
||||
}
|
||||
|
||||
if (name === 'collection') {
|
||||
return (
|
||||
<VirtualTableRowCell
|
||||
|
|
|
|||
|
|
@ -284,7 +284,7 @@ const MovieIndex = withScrollPosition((props: MovieIndexProps) => {
|
|||
/>
|
||||
|
||||
<MovieIndexSelectAllButton
|
||||
label="SelectAll"
|
||||
label={translate('SelectAll')}
|
||||
isSelectMode={isSelectMode}
|
||||
overflowComponent={MovieIndexSelectAllMenuItem}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import React, { useCallback, useState } from 'react';
|
||||
import React, { SyntheticEvent, useCallback, useState } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import { useSelect } from 'App/SelectContext';
|
||||
import { MOVIE_SEARCH, REFRESH_MOVIE } from 'Commands/commandNames';
|
||||
import Icon from 'Components/Icon';
|
||||
import ImdbRating from 'Components/ImdbRating';
|
||||
|
|
@ -141,8 +142,31 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
|
|||
setIsDeleteMovieModalOpen(false);
|
||||
}, [setIsDeleteMovieModalOpen]);
|
||||
|
||||
const [selectState, selectDispatch] = useSelect();
|
||||
|
||||
const onSelectPress = useCallback(
|
||||
(event: SyntheticEvent<HTMLElement, MouseEvent>) => {
|
||||
if (event.nativeEvent.ctrlKey || event.nativeEvent.metaKey) {
|
||||
window.open(`/movie/${tmdbId}`, '_blank');
|
||||
return;
|
||||
}
|
||||
|
||||
const shiftKey = event.nativeEvent.shiftKey;
|
||||
|
||||
selectDispatch({
|
||||
type: 'toggleSelected',
|
||||
id: movieId,
|
||||
isSelected: !selectState.selectedState[movieId],
|
||||
shiftKey,
|
||||
});
|
||||
},
|
||||
[movieId, selectState.selectedState, selectDispatch, tmdbId]
|
||||
);
|
||||
|
||||
const link = `/movie/${tmdbId}`;
|
||||
|
||||
const linkProps = isSelectMode ? { onPress: onSelectPress } : { to: link };
|
||||
|
||||
const elementStyle = {
|
||||
width: `${posterWidth}px`,
|
||||
height: `${posterHeight}px`,
|
||||
|
|
@ -196,7 +220,7 @@ function MovieIndexPoster(props: MovieIndexPosterProps) {
|
|||
<div className={styles.deleted} title={translate('Deleted')} />
|
||||
) : null}
|
||||
|
||||
<Link className={styles.link} style={elementStyle} to={link}>
|
||||
<Link className={styles.link} style={elementStyle} {...linkProps}>
|
||||
<MoviePoster
|
||||
style={elementStyle}
|
||||
images={images}
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ function ImportList({
|
|||
<TagList tags={tags} tagList={tagList} />
|
||||
|
||||
<div className={styles.enabled}>
|
||||
<Label kind={kinds.DEFAULT} title="List Refresh Interval">
|
||||
<Label kind={kinds.DEFAULT} title={translate('ListRefreshInterval')}>
|
||||
{`${translate('Refresh')}: ${formatShortTimeSpan(
|
||||
minRefreshInterval
|
||||
)}`}
|
||||
|
|
|
|||
|
|
@ -54,11 +54,11 @@ function Tag({ id, label }: TagProps) {
|
|||
setIsDeleteTagModalOpen(true);
|
||||
}, []);
|
||||
|
||||
const handleConfirmDeleteTag = useCallback(() => {
|
||||
const handleDeleteTagModalClose = useCallback(() => {
|
||||
setIsDeleteTagModalOpen(false);
|
||||
}, []);
|
||||
|
||||
const handleDeleteTagModalClose = useCallback(() => {
|
||||
const handleConfirmDeleteTag = useCallback(() => {
|
||||
dispatch(deleteTag({ id }));
|
||||
}, [id, dispatch]);
|
||||
|
||||
|
|
|
|||
|
|
@ -133,6 +133,12 @@ export const defaultState = {
|
|||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'year',
|
||||
label: () => translate('Year'),
|
||||
isSortable: true,
|
||||
isVisible: false
|
||||
},
|
||||
{
|
||||
name: 'inCinemas',
|
||||
label: () => translate('InCinemas'),
|
||||
|
|
|
|||
|
|
@ -96,14 +96,22 @@ function merge(initialState, persistedState) {
|
|||
return computedState;
|
||||
}
|
||||
|
||||
const KEY = 'radarr';
|
||||
|
||||
const config = {
|
||||
slicer,
|
||||
serialize,
|
||||
merge,
|
||||
key: 'radarr'
|
||||
key: window.Radarr.instanceName.toLowerCase().replace(/ /g, '_') || KEY
|
||||
};
|
||||
|
||||
export default function createPersistState() {
|
||||
// Migrate existing local storage value to new key if it does not already exist.
|
||||
// Leave old value as-is in case there are multiple instances using the same key.
|
||||
if (config.key !== KEY && localStorage.getItem(KEY) && !localStorage.getItem(config.key)) {
|
||||
localStorage.setItem(config.key, localStorage.getItem(KEY));
|
||||
}
|
||||
|
||||
// Migrate existing local storage before proceeding
|
||||
const persistedState = JSON.parse(localStorage.getItem(config.key));
|
||||
migrate(persistedState);
|
||||
|
|
|
|||
|
|
@ -202,6 +202,7 @@ private static void RegisterGlobalFilters()
|
|||
c.ForLogger("Microsoft.*").WriteToNil(LogLevel.Warn);
|
||||
c.ForLogger("Microsoft.Hosting.Lifetime*").WriteToNil(LogLevel.Info);
|
||||
c.ForLogger("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware").WriteToNil(LogLevel.Fatal);
|
||||
c.ForLogger("Radarr.Http.Authentication.ApiKeyAuthenticationHandler").WriteToNil(LogLevel.Info);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,7 +68,8 @@ public class LanguageFixture : CoreTest
|
|||
new object[] { 53, Language.Tagalog },
|
||||
new object[] { 54, Language.Urdu },
|
||||
new object[] { 55, Language.Romansh },
|
||||
new object[] { 56, Language.Mongolian }
|
||||
new object[] { 56, Language.Mongolian },
|
||||
new object[] { 57, Language.Georgian }
|
||||
};
|
||||
|
||||
public static object[] ToIntCases =
|
||||
|
|
@ -131,7 +132,8 @@ public class LanguageFixture : CoreTest
|
|||
new object[] { Language.Tagalog, 53 },
|
||||
new object[] { Language.Urdu, 54 },
|
||||
new object[] { Language.Romansh, 55 },
|
||||
new object[] { Language.Mongolian, 56 }
|
||||
new object[] { Language.Mongolian, 56 },
|
||||
new object[] { Language.Georgian, 57 }
|
||||
};
|
||||
|
||||
[Test]
|
||||
|
|
|
|||
|
|
@ -407,6 +407,8 @@ public void should_format_mediainfo_properly()
|
|||
[TestCase("nor", "NO")]
|
||||
[TestCase("khk", "MN")]
|
||||
[TestCase("mvf", "MN")]
|
||||
[TestCase("geo", "KA")]
|
||||
[TestCase("kat", "KA")]
|
||||
public void should_format_languagecodes_properly(string language, string code)
|
||||
{
|
||||
_namingConfig.StandardMovieFormat = "{Movie.Title}.{MEDIAINFO.FULL}";
|
||||
|
|
|
|||
|
|
@ -119,5 +119,15 @@ public void should_return_bengali(string isoCode)
|
|||
var result = IsoLanguages.Find(isoCode);
|
||||
result.Language.Should().Be(Language.Bengali);
|
||||
}
|
||||
|
||||
[TestCase("ka")]
|
||||
[TestCase("geo")]
|
||||
[TestCase("kat")]
|
||||
[TestCase("ka-GE")]
|
||||
public void should_return_georgian(string isoCode)
|
||||
{
|
||||
var result = IsoLanguages.Find(isoCode);
|
||||
result.Language.Should().Be(Language.Georgian);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -521,6 +521,16 @@ public void should_parse_language_mongolian(string postTitle)
|
|||
result.Should().Contain(Language.Mongolian);
|
||||
}
|
||||
|
||||
[TestCase("Movie.Title.1994.Georgian.WEB-DL.h264")]
|
||||
[TestCase("Movie.Title.2016.Geo.WEB-DL.h264")]
|
||||
[TestCase("Movie.Title.2016.KA.WEB-DL.h264")]
|
||||
[TestCase("Movie.Title.2016.RU-KA.WEB-DL.h264")]
|
||||
public void should_parse_language_georgian(string postTitle)
|
||||
{
|
||||
var result = LanguageParser.ParseLanguages(postTitle);
|
||||
result.Should().Contain(Language.Georgian);
|
||||
}
|
||||
|
||||
[TestCase("Movie.Title.en.sub")]
|
||||
[TestCase("Movie Title.eng.sub")]
|
||||
[TestCase("Movie.Title.eng.forced.sub")]
|
||||
|
|
|
|||
|
|
@ -294,6 +294,11 @@ public void should_parse_bluray720p_quality(string title, bool proper)
|
|||
[TestCase("Movie.Name.2016.German.DTS.DL.1080p.UHDBD.x265-TDO.mkv", false)]
|
||||
[TestCase("Movie.Name.2021.1080p.BDLight.x265-AVCDVD", false)]
|
||||
[TestCase("Movie.Title.2012.German.DL.1080p.UHD2BD.x264-QfG", false)]
|
||||
[TestCase("Movie.Title.2005.1080p.HDDVDRip.x264", false)]
|
||||
[TestCase("Movie.Title.2019.German.DL.1080p.HDR.UHDBDRip.AV1-GROUP", false)]
|
||||
[TestCase("Movie.Title.2014.German.OPUS.DL.1080p.UHDBDRiP.HDR.AV1-GROUP", false)]
|
||||
[TestCase("Movie.Title.1999.German.DL.1080p.HDR.UHDBDRip.AV1-GROUP", false)]
|
||||
[TestCase("Movie.Title.1993.Uncut.German.DL.1080p.HDR.UHDBDRip.h265-GROUP", false)]
|
||||
public void should_parse_bluray1080p_quality(string title, bool proper)
|
||||
{
|
||||
ParseAndVerifyQuality(title, QualitySource.BLURAY, proper, Resolution.R1080p);
|
||||
|
|
@ -312,6 +317,8 @@ public void should_parse_bluray1080p_quality(string title, bool proper)
|
|||
[TestCase("Movie.Name.2020.German.UHDBD.2160p.HDR10.HEVC.EAC3.DL-pmHD.mkv", false)]
|
||||
[TestCase("Movie.Title.2014.2160p.UHD.BluRay.X265-IAMABLE.mkv", false)]
|
||||
[TestCase("Movie.Title.2014.2160p.BDRip.AAC.7.1.HDR10.x265.10bit-Markll", false)]
|
||||
[TestCase("Movie.Title.1956.German.DL.2160p.HDR.UHDBDRip.h266-GROUP", false)]
|
||||
[TestCase("Movie.Title.2021.4K.HDR.2160P.UHDBDRip.HEVC-10bit.GROUP", false)]
|
||||
public void should_parse_bluray2160p_quality(string title, bool proper)
|
||||
{
|
||||
ParseAndVerifyQuality(title, QualitySource.BLURAY, proper, Resolution.R2160p);
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ private IEnumerable<DownloadDecision> GetDecisions(List<ReleaseInfo> reports, bo
|
|||
|
||||
if (remoteMovie.Movie == null)
|
||||
{
|
||||
decision = new DownloadDecision(remoteMovie, new DownloadRejection(DownloadRejectionReason.UnknownMovie, "Unknown Movie. Unable to identify correct movie using release name."));
|
||||
decision = new DownloadDecision(remoteMovie, new DownloadRejection(DownloadRejectionReason.UnknownMovie, pushedRelease ? "Unknown Movie. Unable to match to existing movie in Library using release title." : "Unknown Movie. Unable to match to correct movie using release title."));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@ public abstract class HttpImportListBase<TSettings> : ImportListBase<TSettings>
|
|||
public virtual int PageSize => 0;
|
||||
public virtual TimeSpan RateLimit => TimeSpan.FromSeconds(2);
|
||||
|
||||
protected virtual bool UsePreGeneratedPages => false;
|
||||
|
||||
public abstract IImportListRequestGenerator GetRequestGenerator();
|
||||
public abstract IParseImportListResponse GetParser();
|
||||
|
||||
|
|
@ -79,7 +81,7 @@ protected virtual ImportListFetchResult FetchMovies(Func<IImportListRequestGener
|
|||
break;
|
||||
}
|
||||
|
||||
if (!IsFullPage(page))
|
||||
if (!UsePreGeneratedPages && !IsFullPage(page))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
|
@ -210,7 +212,26 @@ protected virtual ValidationFailure TestConnection()
|
|||
{
|
||||
var parser = GetParser();
|
||||
var generator = GetRequestGenerator();
|
||||
var releases = FetchPage(generator.GetMovies().GetAllTiers().First().First(), parser);
|
||||
var pageableRequests = generator.GetMovies();
|
||||
|
||||
var allTiers = pageableRequests.GetAllTiers();
|
||||
if (!allTiers.Any())
|
||||
{
|
||||
return new NzbDroneValidationFailure(string.Empty,
|
||||
"No pages were returned from your import list, please check your settings and the log for details.")
|
||||
{ IsWarning = true };
|
||||
}
|
||||
|
||||
var firstTier = allTiers.First();
|
||||
if (!firstTier.Any())
|
||||
{
|
||||
return new NzbDroneValidationFailure(string.Empty,
|
||||
"No data could be retrieved from your import list, please check your settings.")
|
||||
{ IsWarning = true };
|
||||
}
|
||||
|
||||
var firstRequest = firstTier.First();
|
||||
var releases = FetchPage(firstRequest, parser);
|
||||
|
||||
if (releases.Empty())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ public virtual ImportListPageableRequestChain GetMovies()
|
|||
|
||||
private IEnumerable<ImportListRequest> GetMoviesRequest()
|
||||
{
|
||||
Logger.Info("Importing TMDb movies from list: {0}", Settings.ListId);
|
||||
Logger.Info("TMDb List {0}: Importing movies", Settings.ListId);
|
||||
|
||||
var requestBuilder = RequestBuilder.Create()
|
||||
.SetSegment("api", "4")
|
||||
|
|
@ -32,19 +32,25 @@ private IEnumerable<ImportListRequest> GetMoviesRequest()
|
|||
.SetSegment("id", Settings.ListId)
|
||||
.SetSegment("secondaryRoute", "");
|
||||
|
||||
Logger.Debug("Getting total pages that TMDb List: {0} consists of", Settings.ListId);
|
||||
Logger.Trace("TMDb List {0}: Getting total pages", Settings.ListId);
|
||||
|
||||
var jsonResponse = JsonConvert.DeserializeObject<MovieSearchResource>(HttpClient.Execute(requestBuilder.Build()).Content);
|
||||
|
||||
MaxPages = jsonResponse.TotalPages;
|
||||
|
||||
if (jsonResponse.TotalPages > 1)
|
||||
{
|
||||
Logger.Debug("TMDb List {0}: processing {1} pages", Settings.ListId, MaxPages);
|
||||
}
|
||||
|
||||
for (var pageNumber = 1; pageNumber <= MaxPages; pageNumber++)
|
||||
{
|
||||
requestBuilder.AddQueryParam("page", pageNumber, true);
|
||||
|
||||
var request = requestBuilder.Build();
|
||||
|
||||
Logger.Debug("Importing TMDb movies from: {0}", request.Url);
|
||||
Logger.Debug("TMDb List {0}: Processing page {1} of {2}", Settings.ListId, pageNumber, MaxPages);
|
||||
Logger.Trace("TMDb List {0}: Request URL: {1}", Settings.ListId, request.Url);
|
||||
|
||||
yield return new ImportListRequest(request);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,7 +119,8 @@ private IEnumerable<ImportListRequest> GetMoviesRequests()
|
|||
|
||||
var request = requestBuilder.Build();
|
||||
|
||||
Logger.Debug("Importing TMDb movies from: {0}", request.Url);
|
||||
Logger.Debug("TMDb Popular: Processing page {0} of {1}", pageNumber, MaxPages);
|
||||
Logger.Trace("TMDb Popular: Request URL: {0}", request.Url);
|
||||
|
||||
yield return new ImportListRequest(request);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ public abstract class TMDbImportListBase<TSettings> : HttpImportListBase<TSettin
|
|||
public override ImportListType ListType => ImportListType.TMDB;
|
||||
public override TimeSpan MinRefreshInterval => TimeSpan.FromHours(12);
|
||||
public override int PageSize => 20;
|
||||
protected override bool UsePreGeneratedPages => true;
|
||||
|
||||
public readonly ISearchForNewMovie _skyhookProxy;
|
||||
public readonly IHttpRequestBuilderFactory _requestBuilder;
|
||||
|
|
|
|||
|
|
@ -75,6 +75,8 @@ public enum TMDbLanguageCodes
|
|||
[FieldOption(Hint = "Raeto-Romance")]
|
||||
rm,
|
||||
[FieldOption(Hint = "Mongolian")]
|
||||
mn
|
||||
mn,
|
||||
[FieldOption(Hint = "Georgian")]
|
||||
ka
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,17 +52,25 @@ private IEnumerable<ImportListRequest> GetMoviesRequests()
|
|||
|
||||
requestBuilder.Method = HttpMethod.Get;
|
||||
|
||||
Logger.Trace("TMDb User {0}: Getting total pages", (TMDbUserListType)Settings.ListType);
|
||||
|
||||
var jsonResponse = JsonConvert.DeserializeObject<MovieSearchResource>(HttpClient.Execute(requestBuilder.Build()).Content);
|
||||
|
||||
MaxPages = jsonResponse.TotalPages;
|
||||
|
||||
if (jsonResponse.TotalPages > 1)
|
||||
{
|
||||
Logger.Debug("TMDb User {0}: processing {1} pages", (TMDbUserListType)Settings.ListType, MaxPages);
|
||||
}
|
||||
|
||||
for (var pageNumber = 1; pageNumber <= MaxPages; pageNumber++)
|
||||
{
|
||||
requestBuilder.AddQueryParam("page", pageNumber, true);
|
||||
|
||||
var request = requestBuilder.Build();
|
||||
|
||||
Logger.Debug("Importing TMDb movies from: {0}", request.Url);
|
||||
Logger.Debug("TMDb User {0}: Processing page {1} of {2}", (TMDbUserListType)Settings.ListType, pageNumber, MaxPages);
|
||||
Logger.Trace("TMDb User {0}: Request URL: {1}", (TMDbUserListType)Settings.ListType, request.Url);
|
||||
|
||||
yield return new ImportListRequest(request);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,17 +152,18 @@ private void AddMovieIdPageableRequests(IndexerPageableRequestChain chain, int m
|
|||
}
|
||||
}
|
||||
|
||||
if (SupportsSearch)
|
||||
if (SupportsSearch && searchCriteria.Movie.Year > 0)
|
||||
{
|
||||
chain.AddTier();
|
||||
var queryTitles = TextSearchEngine == "raw" ? searchCriteria.SceneTitles : searchCriteria.CleanSceneTitles;
|
||||
|
||||
foreach (var queryTitle in queryTitles)
|
||||
{
|
||||
var searchQuery = queryTitle;
|
||||
|
||||
if (!Settings.RemoveYear)
|
||||
{
|
||||
searchQuery = $"{searchQuery} {searchCriteria.Movie.Year}";
|
||||
searchQuery += $" {searchCriteria.Movie.Year}";
|
||||
}
|
||||
|
||||
chain.Add(GetPagedRequests(MaxPages,
|
||||
|
|
|
|||
|
|
@ -127,6 +127,7 @@ public override bool Equals(object obj)
|
|||
public static Language Urdu => new Language(54, "Urdu");
|
||||
public static Language Romansh => new Language(55, "Romansh");
|
||||
public static Language Mongolian => new Language(56, "Mongolian");
|
||||
public static Language Georgian => new Language(57, "Georgian");
|
||||
public static Language Any => new Language(-1, "Any");
|
||||
public static Language Original => new Language(-2, "Original");
|
||||
|
||||
|
|
@ -193,6 +194,7 @@ public static List<Language> All
|
|||
Urdu,
|
||||
Romansh,
|
||||
Mongolian,
|
||||
Georgian,
|
||||
Any,
|
||||
Original
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1204,5 +1204,19 @@
|
|||
"IndexerHDBitsSettingsCategories": "Категории",
|
||||
"IndexerHDBitsSettingsMediums": "Среден",
|
||||
"IndexerSettingsCategories": "Категории",
|
||||
"ReleaseProfile": "Профил за издания"
|
||||
"ReleaseProfile": "Профил за издания",
|
||||
"CinemaRelease": "Пуснат по кината",
|
||||
"BlocklistedAt": "Блокиран на {date}",
|
||||
"Complete": "Завърши",
|
||||
"DeleteSelected": "Изтрийте избраните",
|
||||
"CollectionShowDetailsHelpText": "Покажи статуса и свойствата на колекцията",
|
||||
"AutoTaggingSpecificationStudio": "Студио(я)",
|
||||
"Completed": "Завършено",
|
||||
"DelayMinutes": "{delay} Минути",
|
||||
"Category": "Категория",
|
||||
"AutoTaggingSpecificationKeyword": "Ключова(и) дума(и)",
|
||||
"ChangeCategory": "Промени категорията",
|
||||
"DefaultNotFoundMessage": "Трябва да сте се изгубили, няма какво да видите тук.",
|
||||
"ClearBlocklist": "Изчисти списъка с блокирани",
|
||||
"CountMissingMoviesFromLibrary": "Липсващи филми от библеотеката : {count}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2019,5 +2019,22 @@
|
|||
"NotificationsAppriseSettingsIncludePosterHelpText": "Inclou el pòster al missatge",
|
||||
"CloneImportList": "Clonar llista d'importació",
|
||||
"DefaultNameCopiedImportList": "{name} - Còpia",
|
||||
"ReleaseProfile": "Perfil de llançament"
|
||||
"ReleaseProfile": "Perfil de llançament",
|
||||
"CountMissingMoviesFromLibrary": "{count} pel·lícules que manquen de la biblioteca",
|
||||
"ShowPhysicalReleaseCalendarHelpText": "Mostra els llançaments físics en els esdeveniments del calendari",
|
||||
"CinemaRelease": "Llançament en cinemes",
|
||||
"ShowDigitalRelease": "Mostra la versió digital",
|
||||
"ICalReleaseTypesMoviesHelpText": "Inclou només pel·lícules amb tipus de llançament específics al canal iCal. Si no s'especifica, s'utilitzen totes les opcions.",
|
||||
"ShowDigitalReleaseCalendarHelpText": "Mostra els llançaments digitals en els esdeveniments del calendari",
|
||||
"RemoveRootFolderMoviesMessageText": "Esteu segur que voleu eliminar la carpeta arrel '{path}'? Els fitxers i carpetes no s'eliminaran del disc, i les pel·lícules d'aquesta carpeta arrel no s'eliminaran de {appName}.",
|
||||
"ICalReleaseTypes": "Tipus de llançament",
|
||||
"Keywords": "Paraules clau",
|
||||
"ShowPhysicalRelease": "Mostra la versió física",
|
||||
"ShowCinemaRelease": "Mostra el llançament del cinema",
|
||||
"ShowCinemaReleaseCalendarHelpText": "Mostra els llançaments de cinema en els esdeveniments del calendari",
|
||||
"AutoTaggingSpecificationKeyword": "Paraula(es) clau",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Inclou el cartell",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Inclou el cartell amb notificació",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Enllaços de metadades",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Afegeix un enllaç a les metadades de les sèries quan s'enviïn notificacions"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@
|
|||
"DeleteRestrictionHelpText": "Opravdu chcete toto omezení smazat?",
|
||||
"DeleteTagMessageText": "Opravdu chcete smazat značku „{0}“?",
|
||||
"DetailedProgressBar": "Podrobný ukazatel průběhu",
|
||||
"Discord": "Svár",
|
||||
"Discord": "Discord",
|
||||
"DownloadClients": "Stáhnout klienty",
|
||||
"DownloadClientsSettingsSummary": "Stahování klientů, zpracování stahování a mapování vzdálených cest",
|
||||
"DownloadPropersAndRepacks": "Sponzoři a přebalení",
|
||||
|
|
@ -190,7 +190,7 @@
|
|||
"DeleteCustomFormat": "Odstranit vlastní formát",
|
||||
"DeletedMovieDescription": "Film byl odstraněn z TMDb",
|
||||
"DeleteMovieFolder": "Odstranit složku filmu",
|
||||
"DockerUpdater": "aktualizujte kontejner dockeru, abyste aktualizaci obdrželi",
|
||||
"DockerUpdater": "Pro získání aktualizace je třeba aktualizovat docker kontejner",
|
||||
"AddToDownloadQueue": "Přidat stahování do fronty",
|
||||
"AfterManualRefresh": "Po manuálním obnovení",
|
||||
"AllFiles": "Všechny soubory",
|
||||
|
|
@ -347,12 +347,12 @@
|
|||
"Local": "Místní",
|
||||
"ManualImport": "Ruční import",
|
||||
"MarkAsFailed": "Označit jako neúspěšné",
|
||||
"MaximumSizeHelpText": "Maximální velikost uvolnění, která se má zachytit v MB. Nastavit na nulu nastavit na neomezený",
|
||||
"MaximumSizeHelpText": "Maximální velikost vydání, která se mají stahovat v MB. Nula znamená bez omezení",
|
||||
"Mechanism": "Mechanismus",
|
||||
"MediaInfo": "Informace o médiích",
|
||||
"MediaManagement": "Správa médií",
|
||||
"MediaManagementSettings": "Nastavení správy médií",
|
||||
"MediaManagementSettingsSummary": "Nastavení pojmenování a správy souborů",
|
||||
"MediaManagementSettingsSummary": "Nastavení jmenné konvence a správy souborů",
|
||||
"Hostname": "Název hostitele",
|
||||
"Missing": "Chybějící",
|
||||
"Month": "Měsíc",
|
||||
|
|
@ -436,7 +436,7 @@
|
|||
"RestartRequiredHelpTextWarning": "Vyžaduje restart, aby se projevilo",
|
||||
"Restore": "Obnovit",
|
||||
"RestoreBackup": "Obnovit zálohu",
|
||||
"RootFolder": "Kořenový adresář",
|
||||
"RootFolder": "Kořenová složka",
|
||||
"RootFolderCheckMultipleMessage": "Chybí více kořenových složek: {rootFolderPaths}",
|
||||
"SendAnonymousUsageData": "Odesílejte anonymní údaje o používání",
|
||||
"FileBrowserPlaceholderText": "Začněte psát nebo vyberte cestu níže",
|
||||
|
|
@ -495,7 +495,7 @@
|
|||
"CustomFormatsSettingsSummary": "Vlastní formáty a nastavení",
|
||||
"CustomFormatUnknownConditionOption": "Neznámá možnost „{key}“ pro podmínku „{implementation}“",
|
||||
"Cutoff": "Odříznout",
|
||||
"UpgradeUntilMovieHelpText": "Jakmile je této kvality dosaženo, {appName} již nebude stahovat filmy",
|
||||
"UpgradeUntilMovieHelpText": "Jakmile stažený film dosáhne nebo překročí nastavenou kvalitu, {appName} nebude dále stahovat další vydání",
|
||||
"CutoffUnmet": "Mezní hodnota nesplněna",
|
||||
"Days": "Dny",
|
||||
"Debug": "Ladit",
|
||||
|
|
@ -503,7 +503,7 @@
|
|||
"DefaultDelayProfileMovie": "Toto je výchozí profil. Platí pro všechny filmy, které nemají explicitní profil.",
|
||||
"DelayProfile": "Zpožděný profil",
|
||||
"DelayProfiles": "Profily zpoždění",
|
||||
"Delete": "Vymazat",
|
||||
"Delete": "Smazat",
|
||||
"DeleteBackupMessageText": "Opravdu chcete odstranit zálohu '{name}'?",
|
||||
"Deleted": "Smazáno",
|
||||
"DeleteDelayProfile": "Smazat profil zpoždění",
|
||||
|
|
@ -649,7 +649,7 @@
|
|||
"LinkHere": "tady",
|
||||
"Links": "Odkazy",
|
||||
"ImportLists": "Seznamy",
|
||||
"ImportListSettings": "Nastavení seznamu",
|
||||
"ImportListSettings": "Nastavení seznamu pro import",
|
||||
"ListSyncLevelHelpText": "Filmy v knihovně budou zpracovány na základě vašeho výběru, pokud vypadnou nebo se neobjeví na vašich seznamech",
|
||||
"LogFiles": "Záznam souborů",
|
||||
"Logging": "Protokolování",
|
||||
|
|
@ -836,7 +836,7 @@
|
|||
"SourcePath": "Cesta zdroje",
|
||||
"SourceRelativePath": "Cesta relativního zdroje",
|
||||
"SourceTitle": "Název zdroje",
|
||||
"SslCertPassword": "Heslo SSL Cert",
|
||||
"SslCertPassword": "Heslo SSL Certifikátu",
|
||||
"SslCertPasswordHelpText": "Heslo pro soubor pfx",
|
||||
"SslCertPath": "Cesta certifikátu SSL",
|
||||
"SslCertPathHelpText": "Cesta k souboru pfx",
|
||||
|
|
@ -979,7 +979,7 @@
|
|||
"DeleteDelayProfileMessageText": "Opravdu chcete smazat tento profil zpoždění?",
|
||||
"DeleteFormatMessageText": "Opravdu chcete smazat značku formátu {0}?",
|
||||
"RemoveSelectedItemQueueMessageText": "Opravdu chcete odebrat {0} položku {1} z fronty?",
|
||||
"RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {selectedCount} položky z fronty?",
|
||||
"RemoveSelectedItemsQueueMessageText": "Opravdu chcete odebrat {selectedCount} položek z fronty?",
|
||||
"ApplyTagsHelpTextAdd": "Přidat: Přidat štítky do existujícího seznamu štítků",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Jak použít štítky na vybrané indexery",
|
||||
"ApplyTagsHelpTextRemove": "Odebrat: Odebrat zadané štítky",
|
||||
|
|
@ -1037,7 +1037,7 @@
|
|||
"CollectionShowPostersHelpText": "Zobrazit plakáty položek v kolekci",
|
||||
"ConnectionLostReconnect": "{appName} se pokusí připojit automaticky, nebo můžete kliknout na tlačítko znovunačtení níže.",
|
||||
"ConnectionLostToBackend": "{appName} ztratil spojení s backendem a pro obnovení funkčnosti bude potřeba ho znovu načíst.",
|
||||
"CountDownloadClientsSelected": "{count} vybraných klientů pro stahování",
|
||||
"CountDownloadClientsSelected": "{count} klientů ke stahování vybráno",
|
||||
"DefaultNameCopiedProfile": "{name} - Kopírovat",
|
||||
"DefaultNameCopiedSpecification": "{name} - Kopírovat",
|
||||
"DelayingDownloadUntil": "Odložení stahování do {date} v {time}",
|
||||
|
|
@ -1078,7 +1078,7 @@
|
|||
"CountImportListsSelected": "{count} vybraných seznamů pro import",
|
||||
"CollectionShowDetailsHelpText": "Zobrazit stav a vlastnosti kolekce",
|
||||
"AutoTaggingNegateHelpText": "Pokud je zaškrtnuto, pravidlo automatického označování se nepoužije, pokud odpovídá této podmínce {implementationName}.",
|
||||
"DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorii {appName}. Ve svém klientovi pro stahování byste měli třídění zakázat, abyste se vyhnuli problémům s importem.",
|
||||
"DownloadClientSortingCheckMessage": "Klient pro stahování {downloadClientName} má nastaveno třídění {sortingMode} pro kategorie {appName}. Je doporučeno toto třídění vypnout, abyste se vyhli případným problémům s importem.",
|
||||
"EditSelectedImportLists": "Upravit vybrané seznamy k importu",
|
||||
"EditSelectedIndexers": "Upravit vybrané indexery",
|
||||
"DisabledForLocalAddresses": "Zakázáno pro místní adresy",
|
||||
|
|
@ -1278,7 +1278,7 @@
|
|||
"CutoffUnmetLoadError": "Chybné načítání nesplněných položek",
|
||||
"CutoffUnmetNoItems": "Žádné neodpovídající nesplněné položky",
|
||||
"ClickToChangeIndexerFlags": "Kliknutím změníte značky indexeru",
|
||||
"RecycleBinUnableToWriteHealthCheck": "Nelze zapisovat do nakonfigurované složky koše: {path}. Ujistěte se, že tato cesta existuje a že do ní může zapisovat uživatel se spuštěnou {appName}",
|
||||
"RecycleBinUnableToWriteHealthCheck": "Nelze zapisovat do nakonfigurované složky koše: {path}. Ujistěte se, že tato cesta existuje a že do ní může zapisovat uživatel, pod kterým běží {appName}",
|
||||
"AutoTaggingSpecificationMaximumYear": "Maximální Rok",
|
||||
"AutoTaggingSpecificationMinimumYear": "Minimální Rok",
|
||||
"ChangeCategoryHint": "Změní stahování do kategorie „Post-Import“ z aplikace Download Client",
|
||||
|
|
@ -1366,5 +1366,25 @@
|
|||
"DownloadClientItemErrorMessage": "{clientName} hlásí chybu: {message}",
|
||||
"CloneImportList": "Klonovat seznam Importu",
|
||||
"DefaultNameCopiedImportList": "{name} - Kopírovat",
|
||||
"ReleaseProfile": "profil vydání"
|
||||
"ReleaseProfile": "profil vydání",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Zahrnout plakát",
|
||||
"RemotePathMappingCheckFilesLocalWrongOSPath": "Lokální klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Zkontrolujte nastavení klienta pro stahování.",
|
||||
"RemotePathMappingCheckLocalWrongOSPath": "Lokální klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka v {osName} neexistuje. Ověřte nastavení klienta pro stahování.",
|
||||
"TaskUserAgentTooltip": "User-Agent je poskytován aplikací, která volá API",
|
||||
"RemotePathMappingCheckFilesGenericPermissions": "Klient pro stahování {downloadClientName} hlásí soubory v {path}, ale {appName} tento adresář nevidí. Možná je nutné upravit práva této složky.",
|
||||
"RemotePathMappingCheckGenericPermissions": "Klient pro stahování {downloadClientName} ukládá soubory do {path}, ale {appName} tento adresář nevidí. Možná je nutné upravit práva této složky.",
|
||||
"RemotePathMappingCheckFileRemoved": "Soubor {path} byl smazán v průběhu zpracování.",
|
||||
"RemotePathMappingCheckWrongOSPath": "Vzdálený klient pro stahování {downloadClientName}ukládá stažené soubory do {path}, ale toto není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
|
||||
"Loading": "Načítání",
|
||||
"NotificationsEmbySettingsSendNotificationsHelpText": "Nechat Emby poslat notifikace nastaveným poskytovatelům. Nefunguje s Jellyfin.",
|
||||
"RemotePathMappingCheckImportFailed": "{appName} nemohl importovat film. Detaily naleznete v logu.",
|
||||
"RemotePathMappingCheckBadDockerPath": "Používáte docker; klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale to není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
|
||||
"RemotePathMappingCheckFolderPermissions": "{appName} vidí, ale nemůže přistupovat do adresáře stahování {path}. Pravděpodobně jde o chybně nastavené oprávnění.{appName}.",
|
||||
"RemotePathMappingCheckLocalFolderMissing": "Vzdálený klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka neexistuje. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
|
||||
"IndexerJackettAll": "Indexery, které používají nepodporovaný Jackett endpoint 'all': {indexerNames}",
|
||||
"RemotePathMappingCheckFilesWrongOSPath": "Vzdálený klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Zkontrolujte mapování vzdálených cest a nastavení klienta pro stahování.",
|
||||
"RemotePathMappingCheckFilesBadDockerPath": "Používáte docker; klient pro stahování {downloadClientName} hlásí soubory v {path}, ale to není validní cesta pro {osName}. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
|
||||
"RemotePathMappingCheckDockerFolderMissing": "Používáte docker; klient pro stahování {downloadClientName} ukládá stažené soubory do {path}, ale vypadá to, že taková složka v tomto konejneru neexistuje. Ověřte nastavení mapování vzdálených cest a klientů pro stahování.",
|
||||
"RemotePathMappingsInfo": "Mapování vzdálených cest je potřeba pouze ve výjimečných případech. Pokud {appName} a klient pro stahování je na stejném systému, je lepší cesty tak, aby byly všude stejné. Více informací naleznete na [wiki]({wikiLink}).",
|
||||
"RemotePathMappingCheckRemoteDownloadClient": "Vzdálený klient pro stahování {downloadClientName} hlásí soubory v {path}, ale vypadá to, že taková složka neexistuje. Pravděpodobně chybí nastavení mapování vzdálených cest."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1976,5 +1976,42 @@
|
|||
"EditMovieCollectionModalHeader": "Bearbeiten - {title}",
|
||||
"DownloadClientUTorrentProviderMessage": "uTorrent ist dafür bekannt, dass es Kryptominer, Malware und Werbung enthält. Wir empfehlen dringend einen anderen Client zu wählen.",
|
||||
"DefaultNameCopiedImportList": "{name} – Kopieren",
|
||||
"ReleaseProfile": "Release-Profil"
|
||||
"ReleaseProfile": "Release-Profil",
|
||||
"ImportListsTraktSettingsCertificationMovieHelpText": "Filtriere Filme nach einem Zertifikat(NR,G,PG,PG-13,R,NC-17)(Beistrich getrennt)",
|
||||
"ImportListsTraktSettingsRatingMovieHelpText": "Sortiere Filme nach Bewertung (0-100)",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesByWeek": "Empfohlene Filme nach Woche",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesByYear": "Empfohlene Filme nach Jahr",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByMonth": "Am meisten geschaute Filme nach Monat",
|
||||
"IndexerSettingsBaseUrl": "Basis-Url",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByWeek": "Am meisten geschaute Filme nach Woche",
|
||||
"ImportListsTraktSettingsYearsMovieHelpText": "Filme nach Jahr oder Jahresspanne filtern",
|
||||
"IndexerNewznabSettingsCategoriesHelpText": "Dropdown-Liste, mindestens eine Kategorie muss ausgewählt werden.",
|
||||
"GrabbedAt": "Geholt am {date}",
|
||||
"CinemaRelease": "Kinostart",
|
||||
"FailedAt": "Fehlgeschlagen am {date}",
|
||||
"ImportListsTraktSettingsLimitMovieHelpText": "Die Anzahl der abzurufenden Filme begrenzen",
|
||||
"ImportListsTraktSettingsPopularListTypePopularMovies": "Beliebte Filme",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesByMonth": "Empfohlene Filme nach Monat",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesOfAllTime": "Empfohlene Filme aller Zeiten",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByYear": "Am meisten geschaute Filme nach Jahr",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesOfAllTime": "Am meisten geschaute Filme aller Zeiten",
|
||||
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Filme im Trend",
|
||||
"IndexerSettingsRemoveYear": "Entferne Jahr vom Suchfilter",
|
||||
"AutoTaggingSpecificationStudio": "Filmstudio(s)",
|
||||
"ImportListsRadarrSettingsApiKeyHelpText": "API-KEY von der {appName} Instanz für den Import von (Radarr 3.0 oder älter)",
|
||||
"ImportListsRadarrSettingsFullUrlHelpText": "URL, mit Port von der {appName} Instanz für den Import von (Radarr 3.0 oder älter)",
|
||||
"AutoTaggingSpecificationKeyword": "Schlüsselwort(e)",
|
||||
"BlocklistedAt": "Zur Sperrliste hinzugefügt am {date}",
|
||||
"CloneImportList": "Import Liste importieren",
|
||||
"FileSize": "Dateigröße",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Metadaten-Links",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Füge Links zu den Serienmetadaten hinzu, wenn Benachrichtigungen gesendet werden",
|
||||
"DownloadClientItemErrorMessage": "{clientName} meldet einen Fehler: {message}",
|
||||
"ImportListsTraktSettingsPopularListTypeTopBoxOfficeMovies": "Top-Kinokassenfilme",
|
||||
"ImportListsTraktSettingsPopularListTypeTopAnticipatedMovies": "Meist erwartete Filme",
|
||||
"CountMissingMoviesFromLibrary": "{count} fehlende(r) Film(e) in der Bibliothek",
|
||||
"ICalReleaseTypes": "Veröffentlichungstypen",
|
||||
"ICalReleaseTypesMoviesHelpText": "Nur Filme mit bestimmten Veröffentlichungstypen im iCal-Feed einbeziehen. Wenn nicht angegeben, werden alle Optionen verwendet.",
|
||||
"IndexerFileListSettingsCategoriesHelpText": "Kategorien zur Verwendung in Suche und Feeds. Wenn nicht angegeben, werden alle Optionen verwendet.",
|
||||
"ImportListsTraktSettingsGenresMovieHelpText": "Filme nach Trakt-Genre-Slug filtern (durch Kommas getrennt) – nur für beliebte Listen"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -698,6 +698,7 @@
|
|||
"FilterNotInNext": "not in the next",
|
||||
"FilterStartsWith": "starts with",
|
||||
"Filters": "Filters",
|
||||
"FilterMoviePropertiesOnlyNotFileWarning": "Filters are available only for the properties of a movie, they are not available for properties of the file(s) you may have for that movie.",
|
||||
"FirstDayOfWeek": "First Day of Week",
|
||||
"Fixed": "Fixed",
|
||||
"Folder": "Folder",
|
||||
|
|
@ -1328,6 +1329,10 @@
|
|||
"NotificationsPushBulletSettingsDeviceIds": "Device IDs",
|
||||
"NotificationsPushBulletSettingsDeviceIdsHelpText": "List of device IDs (leave blank to send to all devices)",
|
||||
"NotificationsPushcutSettingsApiKeyHelpText": "API Keys can be managed in the Account view of the Pushcut app",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Include Poster",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Include poster with notification",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Metadata Links",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Add a links to series metadata when sending notifications",
|
||||
"NotificationsPushcutSettingsNotificationName": "Notification Name",
|
||||
"NotificationsPushcutSettingsNotificationNameHelpText": "Notification name from Notifications tab of the Pushcut app",
|
||||
"NotificationsPushcutSettingsTimeSensitive": "Time Sensitive",
|
||||
|
|
|
|||
|
|
@ -997,7 +997,7 @@
|
|||
"OriginalTitle": "Título original",
|
||||
"OriginalLanguage": "Idioma original",
|
||||
"Rating": "Valoración",
|
||||
"RemoveFailed": "Fallo al eliminar",
|
||||
"RemoveFailed": "Eliminar Fallidas",
|
||||
"RemotePathMappingCheckFolderPermissions": "{appName} puede ver pero no acceder al directorio de descarga {path}. Probablemente sea un error de permisos.",
|
||||
"RemotePathMappingCheckGenericPermissions": "El cliente de descarga {downloadClientName} coloca las descargas en {path} pero {appName} no puede ver este directorio. Es posible que tengas que ajustar los permisos de la carpeta.",
|
||||
"RemoveDownloadsAlert": "Las opciones de eliminación fueron trasladadas a las opciones del cliente de descarga individual en la tabla anterior.",
|
||||
|
|
@ -2032,5 +2032,9 @@
|
|||
"DefaultNameCopiedImportList": "{name} - Copia",
|
||||
"ReleaseProfile": "Perfil de lanzamiento",
|
||||
"CountMissingMoviesFromLibrary": "{count} película(s) faltante(s) en la biblioteca",
|
||||
"RemoveRootFolderMoviesMessageText": "¿Estás seguro que quieres eliminar la carpeta raíz '{path}'? Los archivos y carpetas no serán borrados del disco, y las películas en esta carpeta raíz no serán eliminadas de {appName}."
|
||||
"RemoveRootFolderMoviesMessageText": "¿Estás seguro que quieres eliminar la carpeta raíz '{path}'? Los archivos y carpetas no serán borrados del disco, y las películas en esta carpeta raíz no serán eliminadas de {appName}.",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Incluir póster",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Incluir póster con notificación",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Enlaces de metadatos",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Añade un enlace a los metadatos de las series cuando se envían notificaciones"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@
|
|||
"AuthenticationMethodHelpText": "Vaadi {appName}in käyttöön käyttäjätunnus ja salasana.",
|
||||
"AuthForm": "Lomake (kirjautumissivu)",
|
||||
"Automatic": "Automaattinen",
|
||||
"UnmonitorDeletedMoviesHelpText": "{appName} lopettaa levyltä poistettujen elokuvien valvonan automaattisesti.",
|
||||
"UnmonitorDeletedMoviesHelpText": "{appName} lopettaa levyltä poistettujen elokuvien valvonnan automaattisesti.",
|
||||
"BackupRetentionHelpText": "Säilytysaikaa vanhemmat varmuuskopiot siivotaan automaattisesti.",
|
||||
"Backups": "Varmuuskopiot",
|
||||
"BindAddress": "Sidososoite",
|
||||
|
|
@ -2021,5 +2021,20 @@
|
|||
"Keywords": "Avainsanat",
|
||||
"CloneImportList": "Monista tuontilista",
|
||||
"DefaultNameCopiedImportList": "{name} (kopio)",
|
||||
"ReleaseProfile": "Julkaisuprofiili"
|
||||
"ReleaseProfile": "Julkaisuprofiili",
|
||||
"CinemaRelease": "Teatterijulkaisu",
|
||||
"ShowPhysicalReleaseCalendarHelpText": "Näytä fyysiset julkaisut kalenterin tapahtumissa.",
|
||||
"CountMissingMoviesFromLibrary": "Kirjastosta puuttuu {count} elokuva(a)",
|
||||
"RemoveRootFolderMoviesMessageText": "Haluatko varmasti poistaa juurikansion \"{path}\"? Tiedostoja ja kansioita ei poisteta levyltä, eikä tämän juurikansion elokuvia poisteta {appName}ista.",
|
||||
"ShowCinemaReleaseCalendarHelpText": "Näytä teatterijulkaisut kalenterin tapahtumissa.",
|
||||
"ShowCinemaRelease": "Näytä teatterijulkaisu",
|
||||
"ICalReleaseTypes": "Julkaisutyypit",
|
||||
"ICalReleaseTypesMoviesHelpText": "Sisällytä iCal-syötteeseen vain tiettyjen julkaisutyyppien elokuvat. Jos ei määritetty käytetään kaikkia.",
|
||||
"ShowDigitalReleaseCalendarHelpText": "Näytä digitaalijulkaisut kalenterin tapahtumissa.",
|
||||
"ShowDigitalRelease": "Näytä digitaalijulkaisu",
|
||||
"ShowPhysicalRelease": "Näytä fyysinen julkaisu",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Sisällytä juliste",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Näytä juliste ilmoituksessa.",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Metatietolinkit",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Lisää lähetettäviin ilmoituksiin linkit median metatietoihin."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,7 +170,7 @@
|
|||
"Week": "Semaine",
|
||||
"Wanted": "Recherché",
|
||||
"View": "Vues",
|
||||
"UpdateSelected": "Mise à jour sélectionnée",
|
||||
"UpdateSelected": "Mettre à jour la sélection",
|
||||
"Updates": "Mises à jour",
|
||||
"UpdateAll": "Tout mettre à jour",
|
||||
"UnmappedFolders": "Dossiers non mappés",
|
||||
|
|
@ -668,7 +668,7 @@
|
|||
"RemovedFromTaskQueue": "Supprimé de la file d'attente des tâches",
|
||||
"RemoveCompletedDownloadsHelpText": "Supprimer les téléchargements importés de l'historique du client de téléchargement",
|
||||
"Remove": "Retirer",
|
||||
"ReleaseRejected": "Libération rejetée",
|
||||
"ReleaseRejected": "Release rejetée",
|
||||
"ReleaseDates": "Date de sortie",
|
||||
"RegularExpressionsCanBeTested": "Les expressions régulières peuvent être testées [ici]({url}).",
|
||||
"RefreshMovie": "Actualiser le film",
|
||||
|
|
@ -976,7 +976,7 @@
|
|||
"RemotePathMappingCheckLocalWrongOSPath": "Le client de téléchargement {downloadClientName} met les téléchargements dans {path} mais il ne s'agit pas d'un chemin {osName} valide. Vérifiez les paramètres de votre client de téléchargement.",
|
||||
"RemotePathMappingCheckFilesGenericPermissions": "Le client de téléchargement {downloadClientName} met les téléchargements dans {path} mais {appName} ne peut voir ce répertoire. Il est possible que vous ayez besoin d'ajuster les permissions de ce dossier.",
|
||||
"RemotePathMappingCheckFilesLocalWrongOSPath": "Le client de téléchargement {downloadClientName} met les téléchargements dans {path} mais il ne s'agit pas d'un chemin {osName} valide. Vérifiez les paramètres de votre client de téléchargement.",
|
||||
"BypassDelayIfHighestQualityHelpText": "Ignorer le délai lorsque la libération a la qualité activée la plus élevée dans le profil de qualité avec le protocole préféré",
|
||||
"BypassDelayIfHighestQualityHelpText": "Ignorer le délai lorsque la release a la qualité activée la plus élevée dans le profil de qualité avec le protocole préféré",
|
||||
"ClickToChangeReleaseGroup": "Cliquez pour changer de groupe de diffusion",
|
||||
"AnnouncedMovieDescription": "Le film est annoncé",
|
||||
"Filters": "Filtres",
|
||||
|
|
@ -1116,7 +1116,7 @@
|
|||
"IMDbId": "Identifiant TMDb",
|
||||
"DisabledForLocalAddresses": "Désactivée pour les adresses IP locales",
|
||||
"BypassDelayIfAboveCustomFormatScore": "Ignorer si le score du format personnalisé est supérieur",
|
||||
"BypassDelayIfAboveCustomFormatScoreHelpText": "Activer le contournement lorsque la libération a un score supérieur au score minimum configuré pour le format personnalisé",
|
||||
"BypassDelayIfAboveCustomFormatScoreHelpText": "Activer le contournement lorsque la release a un score supérieur au score minimum configuré pour le format personnalisé",
|
||||
"BypassDelayIfAboveCustomFormatScoreMinimumScore": "Score minimum pour le format personnalisé",
|
||||
"AuthenticationRequired": "Authentification requise",
|
||||
"AuthenticationRequiredHelpText": "Modifier les demandes pour lesquelles l'authentification est requise. Ne rien modifier si vous n'en comprenez pas les risques.",
|
||||
|
|
@ -1504,7 +1504,7 @@
|
|||
"IgnoreDownloads": "Ignorer les téléchargements",
|
||||
"IgnoreDownloadsHint": "Empêche {appName} de poursuivre le traitement de ces téléchargements",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Si un torrent est bloqué par le hachage, il peut ne pas être correctement rejeté pendant le RSS/recherche pour certains indexeurs. L'activation de cette fonction permet de le rejeter après que le torrent a été saisi, mais avant qu'il ne soit envoyé au client.",
|
||||
"RemoveQueueItemsRemovalMethodHelpTextWarning": "Supprimer du client de téléchargement\" supprimera les téléchargements et les fichiers du client de téléchargement.",
|
||||
"RemoveQueueItemsRemovalMethodHelpTextWarning": "“Supprimer du client de téléchargement\" supprimera les téléchargements et les fichiers du client de téléchargement.",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Emplacement facultatif pour les téléchargements, laisser vide pour utiliser l'emplacement par défaut Aria2",
|
||||
"RemoveFromDownloadClientHint": "Supprime le téléchargement et le(s) fichier(s) du client de téléchargement",
|
||||
"AddAutoTagError": "Impossible d'ajouter un nouveau tag automatique, veuillez réessayer.",
|
||||
|
|
@ -1967,14 +1967,14 @@
|
|||
"IndexerSettingsCookieHelpText": "Si votre site nécessite un cookie de connexion pour accéder au flux RSS, vous devrez le récupérer via un navigateur.",
|
||||
"BlocklistedAt": "Mis sur liste noire le {date}",
|
||||
"FailedAt": "Échoué le {date}",
|
||||
"IndexerSettingsFailDownloads": "Échec des téléchargements",
|
||||
"IndexerSettingsFailDownloads": "Échouer les téléchargements",
|
||||
"FileSize": "Taille de fichier",
|
||||
"DownloadClientItemErrorMessage": "{clientName} signale une erreur : {message}",
|
||||
"GrabbedAt": "Capturé le {date}",
|
||||
"IndexerSettingsFailDownloadsHelpText": "Lors du traitement des téléchargements terminés, {appName} traitera ces types de fichiers sélectionnés comme des téléchargements ayant échoué.",
|
||||
"DownloadClientUTorrentProviderMessage": "uTorrent a un historique d'inclusion de cryptomineurs, de logiciels malveillants et de publicités. Nous vous recommandons fortement de choisir un autre client.",
|
||||
"MyComputer": "Mon ordinateur",
|
||||
"UpdatePath": "Chemin de mise à jour",
|
||||
"UpdatePath": "Mettre à jour le chemin",
|
||||
"ImportListsRadarrSettingsFullUrl": "URL complète",
|
||||
"ImportListsRadarrSettingsRootFoldersHelpText": "Dossiers racine de l'instance source à partir de laquelle l'importation doit être effectuée",
|
||||
"ImportListsRadarrSettingsTagsHelpText": "Tags de l'instance source à importer",
|
||||
|
|
@ -1982,5 +1982,59 @@
|
|||
"EditMovieCollectionModalHeader": "Modifier - {title}",
|
||||
"AutoTaggingSpecificationKeyword": "clavier",
|
||||
"DefaultNameCopiedImportList": "{name} - Copier",
|
||||
"ReleaseProfile": "Profil de version"
|
||||
"ReleaseProfile": "Profil de version",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesByWeek": "Films recommandés par semaine",
|
||||
"IndexerSettingsRemoveYearHelpText": "{appName} devrait-il retirer l'année du titre lors d'une recherche avec cet indexeur ?",
|
||||
"IndexerSettingsRequiredFlags": "Indicateurs requis",
|
||||
"CloneImportList": "Cloner la liste d'importation",
|
||||
"CountMissingMoviesFromLibrary": "{count} film(s) manquant(s) dans la bibliothèque",
|
||||
"ImportListsTraktSettingsYearsMovieHelpText": "Filtrer les films par année ou par tranche d'années",
|
||||
"IndexerFileListSettingsCategoriesHelpText": "Catégories a utiliser pour la recherche et les flux. Si elle n'est pas spécifiée, toutes les options sont utilisées.",
|
||||
"IndexerSettingsRequiredFlagsHelpText": "Sélectionner les drapeaux d'indexeur qui devraient être obligatoires. Laisser blanc pour utiliser avec tous les drapeaux.",
|
||||
"Keywords": "Mots clés",
|
||||
"ImportListsTraktSettingsPopularListTypeTopAnticipatedMovies": "Films les plus attendus",
|
||||
"MovieFolderFormatHelpTextDeprecatedWarning": "Les jetons associés au propriétés de fichier du film sont obsolètes and ne seront plus supportés dans la prochaine mise à jour majeure.",
|
||||
"NamingConfigMovieFolderFormatDeprecatedHealthCheckMessage": "Le format des dossiers de films ne peuvent pas contenir de jetons de fichiers obsolètes : {tokens}",
|
||||
"NotificationsAppriseSettingsIncludePosterHelpText": "Inclure l'affiche dans les messages",
|
||||
"ImportListsTraktSettingsCertificationMovieHelpText": "Filtrer les films par certification (NR,G,PG,PG-13,R,NC-17) (Séparé par une virgule)",
|
||||
"ImportListsTraktSettingsLimitMovieHelpText": "Limiter le nombre de films à obtenir",
|
||||
"ImportListsTraktSettingsPopularListTypePopularMovies": "Films populaires",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesByYear": "Films recommandés par année",
|
||||
"CinemaRelease": "Sorties cinéma",
|
||||
"ICalReleaseTypes": "Types de versions",
|
||||
"ICalReleaseTypesMoviesHelpText": "Inclure seulement les films avec un type de version spécifique dans le flux iCal. S'il n'est pas spécifié, toutes les options sont utilisées.",
|
||||
"ImportListsRadarrSettingsFullUrlHelpText": "URL, incluant le port, de l'instance {appName} à importer (Radarr 3.0 or higher)",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesByMonth": "Films recommandés par mois",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByMonth": "Films les plus écoutés par mois",
|
||||
"ImportListsTraktSettingsPopularListTypeTrendingMovies": "Films tendance",
|
||||
"ImportListsTraktSettingsRatingMovieHelpText": "Filtrer les films par plage de classement (0-100)",
|
||||
"IndexerNewznabSettingsCategoriesHelpText": "List déroulante, au moins une catégorie doit être spécifié.",
|
||||
"MetadataMediaBrowserDeprecated": "Les métadonnées de navigateur multimédia sont obsolètes. Leurs support sera retiré entièrement dans la version {version}.",
|
||||
"MovieEditRootFolderHelpText": "Déplacer les films dans le même dossier racine peut être utilisé pour renommer les dossiers de films pour correspondre à un nouveau titre ou une convention de nom",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByWeek": "Films les plus écoutés par semaine",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesByYear": "Films les plus écoutés par année",
|
||||
"ImportListsTraktSettingsPopularListTypeTopWatchedMoviesOfAllTime": "Films les plus écoutés de tous les temps",
|
||||
"IndexerSettingsBaseUrl": "URL de base",
|
||||
"IndexerSettingsRemoveYear": "Retirer l'année des paramètres de recherche",
|
||||
"ImportListsRadarrSettingsApiKeyHelpText": "Clé API de l'instance {appName} à importer (Radarr 3.0 or higher)",
|
||||
"ImportListsTraktSettingsPopularListTypeRecommendedMoviesOfAllTime": "Films recommandés de tous les temps",
|
||||
"ImportListsTraktSettingsPopularListTypeTopBoxOfficeMovies": "Meilleurs films au box-office",
|
||||
"NotificationsAppriseSettingsIncludePoster": "Inclure l'affiche",
|
||||
"AutoTaggingSpecificationStudio": "Studio(s)",
|
||||
"RemoveRootFolderMoviesMessageText": "Êtes-vous sûre que vous voulez supprimer le dossier racine '{path}' ? Les fichiers et les dossiers ne seront pas supprimés du disque et les films dans ce dossier racine ne seront pas retiré de {appName}.",
|
||||
"ShowCinemaReleaseCalendarHelpText": "Afficher les sorties cinéma dans le calendrier des événements",
|
||||
"SelectMovieModalTitle": "{modalTitle} - Sélectionner le film",
|
||||
"ShowCinemaRelease": "Afficher les sorties cinéma",
|
||||
"ShowDigitalReleaseCalendarHelpText": "Afficher les sorties digitales dans le calendrier des événements",
|
||||
"ShowPhysicalReleaseCalendarHelpText": "Afficher les sorties physiques dans le calendrier des événements",
|
||||
"ReleaseSource": "Source de version",
|
||||
"UpdateMoviePath": "Mettre à jour le chemin du film",
|
||||
"ShowDigitalRelease": "Afficher les sorties digitales",
|
||||
"ShowPhysicalRelease": "Afficher les sorties physiques",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Inclure l'affiche",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Inclure l'affiche avec les notifications",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Lien de métadonnées",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Ajouter un lien vers les métadonnées de la série lors de l'envoi de notifications",
|
||||
"ImportListsTraktSettingsGenresMovieHelpText": "Filtrer les films par genre Trakt (séparés par des virgules) Uniquement pour les listes populaires",
|
||||
"ReleasePush": "Poussée de version"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -379,5 +379,7 @@
|
|||
"IndexerSettingsCategories": "Kategorije",
|
||||
"IndexerHDBitsSettingsCategories": "Kategorije",
|
||||
"IndexerHDBitsSettingsCodecs": "Kodek",
|
||||
"ReleaseProfile": "profil verzije"
|
||||
"ReleaseProfile": "profil verzije",
|
||||
"AddANewPath": "Dodaj novu putanju",
|
||||
"AddCustomFilter": "Dodaj proizvoljan filter"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1503,5 +1503,7 @@
|
|||
"MyComputer": "A számítógépem",
|
||||
"EditMovieCollectionModalHeader": "Szerkesztés – {title}",
|
||||
"DefaultNameCopiedImportList": "{name} - Másolat",
|
||||
"ReleaseProfile": "Release profil"
|
||||
"ReleaseProfile": "Release profil",
|
||||
"AutoTaggingSpecificationKeyword": "Kulcsszavak",
|
||||
"AutoTaggingSpecificationStudio": "Stúdió(k)"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -182,5 +182,14 @@
|
|||
"CustomFormatsSpecificationLanguage": "Bahasa",
|
||||
"IndexerHDBitsSettingsCategories": "Kategori",
|
||||
"IndexerHDBitsSettingsCodecs": "Codec",
|
||||
"IndexerSettingsCategories": "Kategori"
|
||||
"IndexerSettingsCategories": "Kategori",
|
||||
"AddConditionError": "tidak dapat menambahkan persyaratan baru, coba lagi..",
|
||||
"AddAutoTagError": "tidak dapat menambahkan label otomatis, coba lagi..",
|
||||
"AddANewPath": "tambah path baru",
|
||||
"AddCustomFilter": "tambah filter khusus",
|
||||
"AddAutoTag": "tambah label otomatis",
|
||||
"AddCondition": "tambah persyaratan",
|
||||
"AddConditionImplementation": "tambah persyaratan {implementationName}",
|
||||
"AddConnection": "tambah koneksi",
|
||||
"AddConnectionImplementation": "tambah koneksi - {implementationName}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1541,5 +1541,9 @@
|
|||
"EditMovieCollectionModalHeader": "Modifica - {title}",
|
||||
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Se un torrent è bloccato tramite hash, potrebbe non essere correttamente rifiutato durante l’uso di RSS/Ricerca con alcuni indexer. Abilitando questa opzione, il torrent verrà rifiutato dopo essere stato acquisito, ma prima di essere inviato al client.",
|
||||
"DefaultNameCopiedImportList": "{name} - Copia",
|
||||
"ReleaseProfile": "profilo release"
|
||||
"ReleaseProfile": "profilo release",
|
||||
"BlocklistAndSearchHint": "Inizia una ricerca per sostituzioni dopo l'aggiunta alla lista dei blocchi",
|
||||
"BlocklistMultipleOnlyHint": "Aggiungi alla blocklist senza ricerca di sostituti",
|
||||
"BlocklistOnly": "Solo blocklist",
|
||||
"AutomaticUpdatesDisabledDocker": "Gli aggiornamenti automatici non sono supportati direttamente quando si utilizza il meccanismo di aggiornamento Docker. Sarà necessario aggiornare l'immagine del contenitore al di fuori di {appName} o utilizzare uno script"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1931,5 +1931,6 @@
|
|||
"FileSize": "파일 크기",
|
||||
"IndexerSettingsFailDownloadsHelpText": "완료된 다운로드를 처리하는 동안 {appName}는 선택된 파일 유형을 실패한 다운로드로 처리합니다.",
|
||||
"ImportListsRadarrSettingsFullUrl": "전체 URL",
|
||||
"DefaultNameCopiedImportList": "{name} - 복사"
|
||||
"DefaultNameCopiedImportList": "{name} - 복사",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "알림을 보낼 때 시리즈 메타데이터에 대한 링크를 추가"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2032,5 +2032,9 @@
|
|||
"DefaultNameCopiedImportList": "{name} - Cópia",
|
||||
"ReleaseProfile": "Perfil de Lançamento",
|
||||
"CountMissingMoviesFromLibrary": "{count} filme(s) faltando na biblioteca",
|
||||
"RemoveRootFolderMoviesMessageText": "Tem certeza de que deseja remover a pasta raiz '{path}'? Arquivos e pastas não serão excluídos do disco, e os filmes nesta pasta raiz não serão removidos de {appName} ."
|
||||
"RemoveRootFolderMoviesMessageText": "Tem certeza de que deseja remover a pasta raiz '{path}'? Arquivos e pastas não serão excluídos do disco, e os filmes nesta pasta raiz não serão removidos de {appName} .",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Incluir Pôster",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Incluir pôster com notificação",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Links de metadados",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Adicionar links para os metadados da série ao enviar notificações"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1173,5 +1173,7 @@
|
|||
"IndexerHDBitsSettingsCategories": "Categorii",
|
||||
"IndexerHDBitsSettingsMediums": "Mediu",
|
||||
"IndexerSettingsCategories": "Categorii",
|
||||
"DefaultNameCopiedImportList": "{name} - Copie"
|
||||
"DefaultNameCopiedImportList": "{name} - Copie",
|
||||
"Warning": "Avertisment",
|
||||
"YesterdayAt": "Ieri la {time}"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -416,7 +416,7 @@
|
|||
"PrioritySettings": "Приоритет: {priority}",
|
||||
"Priority": "Приоритет",
|
||||
"PreviewRenameHelpText": "Совет: для предварительного просмотра переименования ... выберите \"Отмена\", затем щелкните название любого фильма и используйте",
|
||||
"PreviewRename": "Предпросмотр\nпереименования",
|
||||
"PreviewRename": "Переименовать предпросмотр",
|
||||
"Presets": "Пресеты",
|
||||
"PreferUsenet": "Предпочитать Usenet",
|
||||
"PreferTorrent": "Предпочитать торрент",
|
||||
|
|
@ -1290,7 +1290,7 @@
|
|||
"DownloadClientNzbgetValidationKeepHistoryOverMax": "Для параметра NzbGet KeepHistory должно быть меньше 25000",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Загружать первые и последние части сначала (qBittorrent 4.1.0+)",
|
||||
"DownloadClientRTorrentSettingsDirectoryHelpText": "Необязательное место для сохранения загрузок, оставьте поле пустым, чтобы использовать расположение rTorrent по умолчанию",
|
||||
"DownloadClientQbittorrentTorrentStateStalled": "Загрузка останавливается без подключения",
|
||||
"DownloadClientQbittorrentTorrentStateStalled": "Загрузка не активна, т.к. нет соединений",
|
||||
"DownloadClientSabnzbdValidationUnknownVersion": "Неизвестная версия: {rawVersion}",
|
||||
"DownloadClientSettingsInitialState": "Начальное состояние",
|
||||
"DownloadClientValidationUnableToConnect": "Невозможно подключиться к {clientName}",
|
||||
|
|
@ -2031,5 +2031,10 @@
|
|||
"CloneImportList": "Копировать список импорта",
|
||||
"DefaultNameCopiedImportList": "{name} - Копировать",
|
||||
"ReleaseProfile": "Профиль релиза",
|
||||
"CountMissingMoviesFromLibrary": "{count} отсутствующих фильмов в библиотеке"
|
||||
"CountMissingMoviesFromLibrary": "{count} отсутствующих фильмов в библиотеке",
|
||||
"RemoveRootFolderMoviesMessageText": "Вы уверены, что хотите удалить корневой каталог '{path}'? Файлы и папки не будут удалены с диска, а фильмы в этом корневом каталоге не будут удалены из {appName}.",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Добавить постер",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Добавляет постер в уведомление",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Ссылки на метаданные",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Добавляет ссылки на метаданные сериала при отправке уведомлений"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1082,5 +1082,6 @@
|
|||
"ImportListsTraktSettingsCertification": "การรับรอง",
|
||||
"ImportListsTraktSettingsGenres": "ประเภท",
|
||||
"ImportListsTraktSettingsRating": "การให้คะแนน",
|
||||
"IndexerHDBitsSettingsMediums": "ปานกลาง"
|
||||
"IndexerHDBitsSettingsMediums": "ปานกลาง",
|
||||
"AddANewPath": "เพิ่มเส้นทางใหม่"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1782,7 +1782,7 @@
|
|||
"DeleteMovieFolderMovieCount": "{size} boyutunda {movieFileCount} film dosyası",
|
||||
"NotificationsPlexSettingsServer": "Sunucu",
|
||||
"NotificationsPlexSettingsServerHelpText": "Kimlik doğrulamasından sonra plex.tv hesabından sunucuyu seçin",
|
||||
"UnableToImportAutomatically": "Otomatikman İçe Aktarılamıyor",
|
||||
"UnableToImportAutomatically": "Otomatik Olarak İçe Aktarılamıyor",
|
||||
"ShowTags": "Etiketleri göster",
|
||||
"ShowTagsHelpText": "Etiketleri posterin altında göster",
|
||||
"Any": "Herhangi",
|
||||
|
|
@ -2031,5 +2031,10 @@
|
|||
"CloneImportList": "İçe Aktarma Listesini Klonla",
|
||||
"DefaultNameCopiedImportList": "{name} - Kopyala",
|
||||
"ReleaseProfile": "Sürüm Profili",
|
||||
"CountMissingMoviesFromLibrary": "{count} kitaplıkta eksik film"
|
||||
"CountMissingMoviesFromLibrary": "{count} kitaplıkta eksik film",
|
||||
"RemoveRootFolderMoviesMessageText": "'{path}' kök klasörünü kaldırmak istediğinizden emin misiniz? Dosya ve klasörler diskten silinmez ve bu kök klasördeki filmler {appName} 'dan kaldırılmaz.",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Bildirim içeriğine poster ekleyin",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Meta Veri Bağlantıları",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Poster'i ekle",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Bildirim gönderirken dizi meta verilerine bağlantılar ekleyin"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2008,5 +2008,10 @@
|
|||
"EditMovieCollectionModalHeader": "Редагувати - {title}",
|
||||
"NotificationsAppriseSettingsIncludePoster": "Включити постер",
|
||||
"DefaultNameCopiedImportList": "{name} - Копіювати",
|
||||
"ReleaseProfile": "Профіль релізу"
|
||||
"ReleaseProfile": "Профіль релізу",
|
||||
"DownloadClientItemErrorMessage": "{clientName} повертає помилку: {message}",
|
||||
"NotificationsPushcutSettingsIncludePoster": "Включити постер",
|
||||
"NotificationsPushcutSettingsIncludePosterHelpText": "Включити постер з сповіщенням",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "Посилання на метадані",
|
||||
"NotificationsPushcutSettingsMetadataLinksHelpText": "Додати посилання на метадані серіалу при надсиланні сповіщень"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1878,7 +1878,7 @@
|
|||
"CustomFormatsSpecificationMinimumSizeHelpText": "必须大于该尺寸才会发布",
|
||||
"CustomFormatsSpecificationMinimumYear": "最小年份",
|
||||
"CustomFormatsSpecificationResolution": "分辨率",
|
||||
"CustomFormatsSpecificationSource": "代码",
|
||||
"CustomFormatsSpecificationSource": "源",
|
||||
"AutoTaggingSpecificationGenre": "类型",
|
||||
"AutoTaggingSpecificationMaximumYear": "最大年份",
|
||||
"Mixed": "混合",
|
||||
|
|
@ -1986,5 +1986,6 @@
|
|||
"MyComputer": "我的电脑",
|
||||
"EditMovieCollectionModalHeader": "编辑 - {title}",
|
||||
"DefaultNameCopiedImportList": "{name} - 复制",
|
||||
"ReleaseProfile": "发行配置文件"
|
||||
"ReleaseProfile": "发行配置文件",
|
||||
"NotificationsPushcutSettingsMetadataLinks": "元数据链接"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ public static string FormatVideoCodec(MediaInfoModel mediaInfo, string sceneName
|
|||
|
||||
if (videoFormat == "mpeg4" || videoFormat.Contains("msmpeg4"))
|
||||
{
|
||||
if (videoCodecID == "XVID")
|
||||
if (videoCodecID.ToUpperInvariant() == "XVID")
|
||||
{
|
||||
return "XviD";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ namespace NzbDrone.Core.MediaFiles
|
|||
{
|
||||
public interface IRenameMovieFileService
|
||||
{
|
||||
List<RenameMovieFilePreview> GetRenamePreviews(int movieId);
|
||||
List<RenameMovieFilePreview> GetRenamePreviews(List<int> movieIds);
|
||||
}
|
||||
|
||||
public class RenameMovieFileService : IRenameMovieFileService,
|
||||
|
|
@ -49,12 +49,18 @@ public RenameMovieFileService(IMovieService movieService,
|
|||
_logger = logger;
|
||||
}
|
||||
|
||||
public List<RenameMovieFilePreview> GetRenamePreviews(int movieId)
|
||||
public List<RenameMovieFilePreview> GetRenamePreviews(List<int> movieIds)
|
||||
{
|
||||
var movie = _movieService.GetMovie(movieId);
|
||||
var file = _mediaFileService.GetFilesByMovie(movieId);
|
||||
var movies = _movieService.GetMovies(movieIds);
|
||||
var movieFiles = _mediaFileService.GetFilesByMovies(movieIds).ToLookup(f => f.MovieId);
|
||||
|
||||
return GetPreviews(movie, file).OrderByDescending(m => m.MovieId).ToList(); // TODO: Would really like to not have these be lists
|
||||
return movies.SelectMany(movie =>
|
||||
{
|
||||
var files = movieFiles[movie.Id].ToList();
|
||||
|
||||
return GetPreviews(movie, files);
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
private IEnumerable<RenameMovieFilePreview> GetPreviews(Movie movie, List<MovieFile> files)
|
||||
|
|
|
|||
16
src/NzbDrone.Core/Notifications/NotificationMetadataLink.cs
Normal file
16
src/NzbDrone.Core/Notifications/NotificationMetadataLink.cs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
namespace NzbDrone.Core.Notifications
|
||||
{
|
||||
public class NotificationMetadataLink
|
||||
{
|
||||
public MetadataLinkType? Type { get; set; }
|
||||
public string Label { get; set; }
|
||||
public string Link { get; set; }
|
||||
|
||||
public NotificationMetadataLink(MetadataLinkType? type, string label, string link)
|
||||
{
|
||||
Type = type;
|
||||
Label = label;
|
||||
Link = link;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
using System.Collections.Generic;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.Movies;
|
||||
|
||||
namespace NzbDrone.Core.Notifications;
|
||||
|
||||
public static class NotificationMetadataLinkGenerator
|
||||
{
|
||||
public static List<NotificationMetadataLink> GenerateLinks(Movie movie, IEnumerable<int> metadataLinks)
|
||||
{
|
||||
var links = new List<NotificationMetadataLink>();
|
||||
|
||||
if (movie == null)
|
||||
{
|
||||
return links;
|
||||
}
|
||||
|
||||
foreach (var type in metadataLinks)
|
||||
{
|
||||
var linkType = (MetadataLinkType)type;
|
||||
|
||||
if (linkType == MetadataLinkType.Imdb && movie.ImdbId.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
links.Add(new NotificationMetadataLink(MetadataLinkType.Imdb, "IMDb", $"https://www.imdb.com/title/{movie.ImdbId}"));
|
||||
}
|
||||
|
||||
if (linkType == MetadataLinkType.Tmdb && movie.TmdbId > 0)
|
||||
{
|
||||
links.Add(new NotificationMetadataLink(MetadataLinkType.Tmdb, "TMDb", $"https://www.themoviedb.org/movie/{movie.TmdbId}"));
|
||||
}
|
||||
}
|
||||
|
||||
return links;
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
using System.Linq;
|
||||
using FluentValidation.Results;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Core.MediaCover;
|
||||
using NzbDrone.Core.Movies;
|
||||
|
||||
namespace NzbDrone.Core.Notifications.Pushcut
|
||||
|
|
@ -30,47 +31,57 @@ public override ValidationResult Test()
|
|||
|
||||
public override void OnGrab(GrabMessage grabMessage)
|
||||
{
|
||||
_proxy.SendNotification(MOVIE_GRABBED_TITLE, grabMessage?.Message, Settings);
|
||||
_proxy.SendNotification(MOVIE_GRABBED_TITLE, grabMessage?.Message, GetPosterUrl(grabMessage.Movie), GetLinks(grabMessage.Movie), Settings);
|
||||
}
|
||||
|
||||
public override void OnDownload(DownloadMessage downloadMessage)
|
||||
{
|
||||
_proxy.SendNotification(downloadMessage.OldMovieFiles.Any() ? MOVIE_UPGRADED_TITLE : MOVIE_DOWNLOADED_TITLE, downloadMessage.Message, Settings);
|
||||
_proxy.SendNotification(downloadMessage.OldMovieFiles.Any() ? MOVIE_UPGRADED_TITLE : MOVIE_DOWNLOADED_TITLE, downloadMessage.Message, GetPosterUrl(downloadMessage.Movie), GetLinks(downloadMessage.Movie), Settings);
|
||||
}
|
||||
|
||||
public override void OnMovieAdded(Movie movie)
|
||||
{
|
||||
_proxy.SendNotification(MOVIE_ADDED_TITLE, $"{movie.Title} added to library", Settings);
|
||||
_proxy.SendNotification(MOVIE_ADDED_TITLE, $"{movie.Title} added to library", GetPosterUrl(movie), GetLinks(movie), Settings);
|
||||
}
|
||||
|
||||
public override void OnMovieFileDelete(MovieFileDeleteMessage deleteMessage)
|
||||
{
|
||||
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, Settings);
|
||||
_proxy.SendNotification(MOVIE_FILE_DELETED_TITLE, deleteMessage.Message, GetPosterUrl(deleteMessage.Movie), GetLinks(deleteMessage.Movie), Settings);
|
||||
}
|
||||
|
||||
public override void OnMovieDelete(MovieDeleteMessage deleteMessage)
|
||||
{
|
||||
_proxy.SendNotification(MOVIE_DELETED_TITLE, deleteMessage.Message, Settings);
|
||||
_proxy.SendNotification(MOVIE_DELETED_TITLE, deleteMessage.Message, GetPosterUrl(deleteMessage.Movie), GetLinks(deleteMessage.Movie), Settings);
|
||||
}
|
||||
|
||||
public override void OnHealthIssue(HealthCheck.HealthCheck healthCheck)
|
||||
{
|
||||
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, Settings);
|
||||
_proxy.SendNotification(HEALTH_ISSUE_TITLE_BRANDED, healthCheck.Message, null, new List<NotificationMetadataLink>(), Settings);
|
||||
}
|
||||
|
||||
public override void OnHealthRestored(HealthCheck.HealthCheck previousCheck)
|
||||
{
|
||||
_proxy.SendNotification(HEALTH_RESTORED_TITLE_BRANDED, $"The following issue is now resolved: {previousCheck.Message}", Settings);
|
||||
_proxy.SendNotification(HEALTH_RESTORED_TITLE_BRANDED, $"The following issue is now resolved: {previousCheck.Message}", null, new List<NotificationMetadataLink>(), Settings);
|
||||
}
|
||||
|
||||
public override void OnApplicationUpdate(ApplicationUpdateMessage updateMessage)
|
||||
{
|
||||
_proxy.SendNotification(APPLICATION_UPDATE_TITLE_BRANDED, updateMessage.Message, Settings);
|
||||
_proxy.SendNotification(APPLICATION_UPDATE_TITLE_BRANDED, updateMessage.Message, null, new List<NotificationMetadataLink>(), Settings);
|
||||
}
|
||||
|
||||
public override void OnManualInteractionRequired(ManualInteractionRequiredMessage manualInteractionRequiredMessage)
|
||||
{
|
||||
_proxy.SendNotification(MANUAL_INTERACTION_REQUIRED_TITLE_BRANDED, manualInteractionRequiredMessage.Message, Settings);
|
||||
_proxy.SendNotification(MANUAL_INTERACTION_REQUIRED_TITLE_BRANDED, manualInteractionRequiredMessage.Message, null, new List<NotificationMetadataLink>(), Settings);
|
||||
}
|
||||
|
||||
private string GetPosterUrl(Movie movie)
|
||||
{
|
||||
return movie.MovieMetadata.Value.Images.FirstOrDefault(x => x.CoverType == MediaCoverTypes.Poster)?.RemoteUrl;
|
||||
}
|
||||
|
||||
private List<NotificationMetadataLink> GetLinks(Movie movie)
|
||||
{
|
||||
return NotificationMetadataLinkGenerator.GenerateLinks(movie, Settings.MetadataLinks);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
using System.Collections.Generic;
|
||||
|
||||
namespace NzbDrone.Core.Notifications.Pushcut
|
||||
{
|
||||
public class PushcutPayload
|
||||
|
|
@ -5,5 +7,13 @@ public class PushcutPayload
|
|||
public string Title { get; set; }
|
||||
public string Text { get; set; }
|
||||
public bool? IsTimeSensitive { get; set; }
|
||||
public string Image { get; set; }
|
||||
public List<PushcutAction> Actions;
|
||||
}
|
||||
|
||||
public class PushcutAction
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Url { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ namespace NzbDrone.Core.Notifications.Pushcut
|
|||
{
|
||||
public interface IPushcutProxy
|
||||
{
|
||||
void SendNotification(string title, string message, PushcutSettings settings);
|
||||
void SendNotification(string title, string message, string posterUrl, List<NotificationMetadataLink> links, PushcutSettings settings);
|
||||
ValidationFailure Test(PushcutSettings settings);
|
||||
}
|
||||
|
||||
|
|
@ -29,20 +29,37 @@ public PushcutProxy(IHttpClient httpClient, ILocalizationService localizationSer
|
|||
_logger = logger;
|
||||
}
|
||||
|
||||
public void SendNotification(string title, string message, PushcutSettings settings)
|
||||
public void SendNotification(string title, string message, string posterUrl, List<NotificationMetadataLink> links, PushcutSettings settings)
|
||||
{
|
||||
if (settings == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var request = new HttpRequestBuilder("https://api.pushcut.io/v1/notifications/{notificationName}")
|
||||
.SetSegment("notificationName", settings?.NotificationName)
|
||||
.SetHeader("API-Key", settings?.ApiKey)
|
||||
.Accept(HttpAccept.Json)
|
||||
.Build();
|
||||
|
||||
var payload = new PushcutPayload
|
||||
{
|
||||
Title = title,
|
||||
Text = message,
|
||||
IsTimeSensitive = settings?.TimeSensitive
|
||||
IsTimeSensitive = settings?.TimeSensitive,
|
||||
Image = settings.IncludePoster ? posterUrl : null,
|
||||
Actions = new List<PushcutAction>()
|
||||
};
|
||||
|
||||
foreach (var link in links)
|
||||
{
|
||||
payload.Actions.Add(new PushcutAction
|
||||
{
|
||||
Name = link.Label,
|
||||
Url = link.Link
|
||||
});
|
||||
}
|
||||
|
||||
request.Method = HttpMethod.Post;
|
||||
request.Headers.ContentType = "application/json";
|
||||
request.SetContent(payload.ToJson());
|
||||
|
|
@ -64,7 +81,7 @@ public ValidationFailure Test(PushcutSettings settings)
|
|||
{
|
||||
const string title = "Radarr Test Title";
|
||||
const string message = "Success! You have properly configured your Pushcut notification settings.";
|
||||
SendNotification(title, message, settings);
|
||||
SendNotification(title, message, null, new List<NotificationMetadataLink>(), settings);
|
||||
}
|
||||
catch (PushcutException pushcutException) when (pushcutException.InnerException is HttpException httpException)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
using System.Collections.Generic;
|
||||
using FluentValidation;
|
||||
using NzbDrone.Core.Annotations;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
|
@ -15,7 +16,7 @@ public PushcutSettingsValidator()
|
|||
|
||||
public class PushcutSettings : NotificationSettingsBase<PushcutSettings>
|
||||
{
|
||||
private static readonly PushcutSettingsValidator Validator = new ();
|
||||
private static readonly PushcutSettingsValidator Validator = new PushcutSettingsValidator();
|
||||
|
||||
[FieldDefinition(0, Label = "NotificationsPushcutSettingsNotificationName", Type = FieldType.Textbox, HelpText = "NotificationsPushcutSettingsNotificationNameHelpText")]
|
||||
public string NotificationName { get; set; }
|
||||
|
|
@ -26,6 +27,12 @@ public class PushcutSettings : NotificationSettingsBase<PushcutSettings>
|
|||
[FieldDefinition(2, Label = "NotificationsPushcutSettingsTimeSensitive", Type = FieldType.Checkbox, HelpText = "NotificationsPushcutSettingsTimeSensitiveHelpText")]
|
||||
public bool TimeSensitive { get; set; }
|
||||
|
||||
[FieldDefinition(3, Label = "NotificationsPushcutSettingsIncludePoster", Type = FieldType.Checkbox, HelpText = "NotificationsPushcutSettingsIncludePosterHelpText")]
|
||||
public bool IncludePoster { get; set; }
|
||||
|
||||
[FieldDefinition(4, Label = "NotificationsPushcutSettingsMetadataLinks", Type = FieldType.Select, SelectOptions = typeof(MetadataLinkType), HelpText = "NotificationsPushcutSettingsMetadataLinksHelpText")]
|
||||
public IEnumerable<int> MetadataLinks { get; set; } = new List<int>();
|
||||
|
||||
public override NzbDroneValidationResult Validate()
|
||||
{
|
||||
return new NzbDroneValidationResult(Validator.Validate(this));
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ public static IRuleBuilderOptions<T, string> ValidMovieFolderFormat<T>(this IRul
|
|||
|
||||
public class ValidMovieFormatValidator : PropertyValidator
|
||||
{
|
||||
protected override string GetDefaultMessageTemplate() => "Must contain movie title and release year OR Original Title";
|
||||
protected override string GetDefaultMessageTemplate() => "Must contain either movie title and release year OR Original Title/Filename";
|
||||
|
||||
protected override bool IsValid(PropertyValidatorContext context)
|
||||
{
|
||||
|
|
@ -43,7 +43,7 @@ protected override bool IsValid(PropertyValidatorContext context)
|
|||
return false;
|
||||
}
|
||||
|
||||
return (FileNameBuilder.MovieTitleRegex.IsMatch(value) && FileNameBuilder.ReleaseYearRegex.IsMatch(value)) ||
|
||||
return (FileNameBuilder.MovieTitleRegex.IsMatch(value) && FileNameBuilder.ReleaseYearRegex.IsMatch(value) && !FileNameValidation.OriginalTokenRegex.IsMatch(value)) ||
|
||||
FileNameValidation.OriginalTokenRegex.IsMatch(value);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,8 @@ public static class IsoLanguages
|
|||
new IsoLanguage("tl", "", "tgl", "Tagalog", Language.Tagalog),
|
||||
new IsoLanguage("ur", "", "urd", "Urdu", Language.Urdu),
|
||||
new IsoLanguage("rm", "", "roh", "Romansh", Language.Romansh),
|
||||
new IsoLanguage("mn", "", "mon", "Mongolian", Language.Mongolian)
|
||||
new IsoLanguage("mn", "", "mon", "Mongolian", Language.Mongolian),
|
||||
new IsoLanguage("ka", "", "kat", "Georgian", Language.Georgian)
|
||||
};
|
||||
|
||||
private static readonly Dictionary<string, Language> AlternateIsoCodeMappings = new ()
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ public static class LanguageParser
|
|||
(?<urdu>\burdu\b)|
|
||||
(?<romansh>\b(?:romansh|rumantsch|romansch)\b)|
|
||||
(?<mongolian>\b(?:mongolian|khalkha)\b)|
|
||||
(?<georgian>\b(?:georgian|geo|ka|kat)\b)|
|
||||
(?<original>\b(?:orig|original)\b)",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);
|
||||
|
||||
|
|
@ -438,6 +439,11 @@ public static List<Language> ParseLanguages(string title)
|
|||
languages.Add(Language.Mongolian);
|
||||
}
|
||||
|
||||
if (match.Groups["georgian"].Success)
|
||||
{
|
||||
languages.Add(Language.Georgian);
|
||||
}
|
||||
|
||||
if (match.Groups["original"].Success)
|
||||
{
|
||||
languages.Add(Language.Original);
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ public class QualityParser
|
|||
(?<webdl>WEB[-_. ]?DL(?:mux)?|AmazonHD|AmazonSD|iTunesHD|MaxdomeHD|NetflixU?HD|WebHD|HBOMaxHD|DisneyHD|[. ]WEB[. ](?:[xh][ .]?26[45]|AVC|HEVC|DDP?5[. ]1)|[. ](?-i:WEB)$|(?:\d{3,4}0p)[-. ](?:Hybrid[-_. ]?)?WEB[-. ]|[-. ]WEB[-. ]\d{3,4}0p|\b\s\/\sWEB\s\/\s\b|(?:AMZN|NF|DP)[. -]WEB[. -](?!Rip))|
|
||||
(?<webrip>WebRip|Web-Rip|WEBMux)|
|
||||
(?<hdtv>HDTV)|
|
||||
(?<bdrip>BDRip|BDLight)|
|
||||
(?<bdrip>BDRip|BDLight|HD[-_. ]?DVDRip|UHDBDRip)|
|
||||
(?<brrip>BRRip)|
|
||||
(?<dvdr>\d?x?M?DVD-?[R59])|
|
||||
(?<dvd>DVD(?!-R)|DVDRip|xvidvd)|
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" />
|
||||
<PackageReference Include="Microsoft.Data.SqlClient" Version="2.1.7" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.10" />
|
||||
<PackageReference Include="Polly" Version="8.5.2" />
|
||||
<PackageReference Include="Polly" Version="8.6.0" />
|
||||
<PackageReference Include="Servarr.FFMpegCore" Version="4.7.0-26" />
|
||||
<PackageReference Include="Servarr.FFprobe" Version="5.1.4.112" />
|
||||
<PackageReference Include="System.Memory" Version="4.6.3" />
|
||||
|
|
@ -21,7 +21,7 @@
|
|||
<PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
|
||||
<PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
|
||||
<PackageReference Include="FluentValidation" Version="9.5.4" />
|
||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.9" />
|
||||
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.11" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="NLog" Version="5.4.0" />
|
||||
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ public void ConfigureServices(IServiceCollection services)
|
|||
b.ClearProviders();
|
||||
b.SetMinimumLevel(LogLevel.Trace);
|
||||
b.AddFilter("Microsoft.AspNetCore", LogLevel.Warning);
|
||||
b.AddFilter("Radarr.Http.Authentication", LogLevel.Information);
|
||||
b.AddFilter("Radarr.Http.Authentication.ApiKeyAuthenticationHandler", LogLevel.Information);
|
||||
b.AddFilter("Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager", LogLevel.Error);
|
||||
b.AddNLog();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ public ImportListExclusionController(IImportListExclusionService importListExclu
|
|||
.SetValidator(importListExclusionExistsValidator);
|
||||
|
||||
SharedValidator.RuleFor(c => c.MovieTitle).NotEmpty();
|
||||
SharedValidator.RuleFor(c => c.MovieYear).GreaterThan(0);
|
||||
SharedValidator.RuleFor(c => c.MovieYear).GreaterThanOrEqualTo(0);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
using Radarr.Api.V3.CustomFormats;
|
||||
using Radarr.Api.V3.Movies;
|
||||
using Radarr.Http;
|
||||
using Radarr.Http.REST;
|
||||
|
||||
namespace Radarr.Api.V3.ManualImport
|
||||
{
|
||||
|
|
@ -37,6 +38,11 @@ public List<ManualImportResource> GetMediaFiles(string folder, string downloadId
|
|||
[Consumes("application/json")]
|
||||
public object ReprocessItems([FromBody] List<ManualImportReprocessResource> items)
|
||||
{
|
||||
if (items is { Count: 0 })
|
||||
{
|
||||
throw new BadRequestException("items must be provided");
|
||||
}
|
||||
|
||||
foreach (var item in items)
|
||||
{
|
||||
var processedItem = _manualImportService.ReprocessItem(item.Path, item.DownloadId, item.MovieId, item.ReleaseGroup, item.Quality, item.Languages, item.IndexerFlags);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using Radarr.Http;
|
||||
using Radarr.Http.REST;
|
||||
|
||||
namespace Radarr.Api.V3.Movies
|
||||
{
|
||||
|
|
@ -16,9 +17,14 @@ public RenameMovieController(IRenameMovieFileService renameMovieFileService)
|
|||
}
|
||||
|
||||
[HttpGet]
|
||||
public List<RenameMovieResource> GetMovies(int movieId)
|
||||
public List<RenameMovieResource> GetMovies([FromQuery(Name = "movieId")] List<int> movieIds)
|
||||
{
|
||||
return _renameMovieFileService.GetRenamePreviews(movieId).ToResource();
|
||||
if (movieIds is not { Count: not 0 })
|
||||
{
|
||||
throw new BadRequestException("movieId must be provided");
|
||||
}
|
||||
|
||||
return _renameMovieFileService.GetRenamePreviews(movieIds).ToResource();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7333,8 +7333,11 @@
|
|||
"name": "movieId",
|
||||
"in": "query",
|
||||
"schema": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ private void LogFailure(HttpRequest context, string username)
|
|||
|
||||
private void LogSuccess(HttpRequest context, string username)
|
||||
{
|
||||
_authLogger.Info("Auth-Success ip {0} username '{1}'", context.GetRemoteIP(), username);
|
||||
_authLogger.Debug("Auth-Success ip {0} username '{1}'", context.GetRemoteIP(), username);
|
||||
}
|
||||
|
||||
private void LogLogout(HttpRequest context, string username)
|
||||
|
|
|
|||
Loading…
Reference in a new issue