Compare commits

...

34 commits

Author SHA1 Message Date
bakerboy448
089e0fa4e6 Fixed: Add missing translation keys 2025-09-03 12:10:24 +01:00
bakerboy448
f22ba73fd4 New: UI Note that Filters are for movie properties only
Co-authored-by: PearsonFlyer <john@theediguy.com>

Closes #11200
2025-09-03 12:10:24 +01:00
Weblate
45527b7561 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Gallyam Biktashev <gallyamb@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Xoores <servarr-35466@xoores.cz>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/tr/
Translation: Servarr/Radarr
2025-09-03 12:10:24 +01:00
Weblate
c668c6de9a Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ReDFiRe <wwsoft@abv.bg>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: rtme <pps.kmg@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ru/
Translation: Servarr/Radarr
2025-09-03 12:10:24 +01:00
grapexy
242a3876b5 New: Georgian language support (#11209) 2025-09-03 12:10:24 +01:00
bakerboy448
4aec00f2fa Bump to 5.27.5 2025-09-03 12:10:24 +01:00
bakerboy448
3b7ff51931 Fixed: Parse UHDBDRip as BluRay quality 2025-09-03 12:10:24 +01:00
bakerboy448
7345cf6b29 Fixed: TMDb List Paging (#11201) 2025-09-03 12:10:24 +01:00
Mark McDowall
fcdd356b03 New: Move auth success logging to debug
Closes #7978

(cherry picked from commit 9ebe043bd94d036fe2ab45f3bb3f882cda48e211)
2025-09-03 12:10:24 +01:00
Luigi
a013ffe23a New: Select with poster click in movie selection (#11187) 2025-09-03 12:10:24 +01:00
jkhsjdhjs
bade4275d8 Fixed: Parse HDDVDRip as BluRay 2025-09-03 12:10:24 +01:00
Bwaffles
e88c4bced1 New: Add Year sorting to Discover page 2025-09-03 12:10:24 +01:00
Mark McDowall
1d4c506830 Don't log debug messages for API key validation
(cherry picked from commit 78ca30d1f81361a2dabaddd0036b764859b858af)
2025-09-03 12:10:24 +01:00
Weblate
4b22c43bfc Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ArLab1 <arnaud.laberge@hotmail.com>
Co-authored-by: Ethan Francois <ethanfrancois0@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: adri1m64 <adrien.melle@laposte.net>
Co-authored-by: deamok <deamok@gmail.com>
Co-authored-by: dtorner <dtorner@gmail.com>
Co-authored-by: scdani <csonkadancsi@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/id/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2025-09-03 12:10:24 +01:00
bakerboy448
c9f21e505b Bump version to 5.27.4 2025-09-03 12:10:24 +01:00
bakerboy448
5bfe530834 Bump SixLabors.ImageSharp to 3.1.11 2025-09-03 12:10:24 +01:00
bakerboy448
f48eb2b803 Fixed: Prevent using Original names with other movie file tokens (#11175)
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2025-09-03 12:10:24 +01:00
bakerboy448
ada3afe022 Bump version to 5.27.3 2025-09-03 12:10:24 +01:00
Denis Gheorghescu
1f620eab22 New:(Pushcut) Improved Notification Details (#10897) 2025-09-03 12:10:24 +01:00
Mark McDowall
42512cbcae Return error if Manual Import called without items
(cherry picked from commit 4bdb0408f1bafa38b777a41babb1a775f99a94c1)
2025-09-03 12:10:24 +01:00
bakerboy448
3bb4e52078 Bump version to 5.27.2 2025-09-03 12:10:24 +01:00
bakerboy448
2450468e74 New: Improve Reject for Unknown Movie Messaging (#11063) 2025-09-03 12:10:24 +01:00
Mark McDowall
03f53b595e New: Improve stored UI settings for multiple instances under the same host
Closes #10671
Fixes #11146

(cherry picked from commit 6677fd11168de6dbf78d03bfedf67b89dfe1df53)
2025-09-03 12:10:24 +01:00
Weblate
43762f8658 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: ACHN SYPS <achn.syps@gmail.com>
Co-authored-by: EdiTurn <yyxstter@gmail.com>
Co-authored-by: Hugoren Martinako <aumpfbahn@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: josef <josef.holzapfel@proton.me>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/zh_CN/
Translation: Servarr/Radarr
2025-09-03 12:10:24 +01:00
nuxen
2884eae6a8 Fixed: xvid not always detected correctly (#11138) 2025-09-03 12:10:24 +01:00
bakerboy448
c1e66cb674 Fixed: Allow Discover Exclusions of Movies without Year (Year 0)
Fixes #11135
2025-09-03 12:10:24 +01:00
Weblate
4384fcd069 Multiple Translations updated by Weblate
ignore-downstream

Co-authored-by: Gallyam Biktashev <gallyamb@gmail.com>
Co-authored-by: GkhnGRBZ <gkhn.gurbuz@hotmail.com>
Co-authored-by: HanaO00 <lwin24452@gmail.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/radarr/tr/
Translation: Servarr/Radarr
2025-09-03 12:10:24 +01:00
Bogdan
4fbc7d09df Fixed: Deleting tags from UI
Fixes #11131
2025-09-03 12:10:24 +01:00
Servarr
19e55ac198 Automated API Docs update 2025-09-03 12:10:24 +01:00
nuxen
0750379caf New: Support for multiple movieIds in Rename API endpoint 2025-09-03 12:10:24 +01:00
Bogdan
d2b39921fb Bump version to 5.27.1 2025-09-03 12:10:24 +01:00
Bogdan
6f9e468688 Fixed: Skip title searches for Newznab/Torznab indexers when movie year is missing
Prevents useless text searches of `Movie Title 0` when year is missing.

Fixes #10569
2025-09-03 12:10:24 +01:00
Bogdan
85fbc477ef Bump Polly to 8.6.0 2025-09-03 12:10:24 +01:00
Bogdan
af8061d36c Bump version to 5.27.0 2025-09-03 12:10:24 +01:00
70 changed files with 570 additions and 104 deletions

View file

@ -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)'

View file

@ -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>

View file

@ -304,7 +304,7 @@ function Queue() {
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
label="Refresh"
label={translate('Refresh')}
iconName={icons.REFRESH}
isSpinning={isRefreshing}
onPress={handleRefreshPress}

View file

@ -56,6 +56,8 @@ function CustomFiltersModalContent(props) {
{translate('AddCustomFilter')}
</Button>
</div>
<br />
{translate('FilterMoviePropertiesOnlyNotFileWarning')}
</ModalBody>
<ModalFooter>

View file

@ -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}

View file

@ -36,7 +36,8 @@
.imdbRating,
.rottenTomatoesRating,
.traktRating,
.runtime {
.runtime,
.year {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
flex: 0 0 90px;

View file

@ -22,6 +22,7 @@ interface CssExports {
'studio': string;
'tmdbRating': string;
'traktRating': string;
'year': string;
}
export const cssExports: CssExports;
export default cssExports;

View file

@ -61,7 +61,8 @@
.imdbRating,
.rottenTomatoesRating,
.traktRating,
.runtime {
.runtime,
.year {
composes: cell;
flex: 0 0 90px;

View file

@ -28,6 +28,7 @@ interface CssExports {
'studio': string;
'tmdbRating': string;
'traktRating': string;
'year': string;
}
export const cssExports: CssExports;
export default cssExports;

View file

@ -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

View file

@ -284,7 +284,7 @@ const MovieIndex = withScrollPosition((props: MovieIndexProps) => {
/>
<MovieIndexSelectAllButton
label="SelectAll"
label={translate('SelectAll')}
isSelectMode={isSelectMode}
overflowComponent={MovieIndexSelectAllMenuItem}
/>

View file

@ -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}

View file

@ -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
)}`}

View file

@ -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]);

View file

@ -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'),

View file

@ -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);

View file

@ -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);
});
}

View file

@ -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]

View file

@ -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}";

View file

@ -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);
}
}
}

View file

@ -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")]

View file

@ -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);

View file

@ -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
{

View file

@ -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())
{

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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;

View file

@ -75,6 +75,8 @@ public enum TMDbLanguageCodes
[FieldOption(Hint = "Raeto-Romance")]
rm,
[FieldOption(Hint = "Mongolian")]
mn
mn,
[FieldOption(Hint = "Georgian")]
ka
}
}

View file

@ -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);
}

View file

@ -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,

View file

@ -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
};

View file

@ -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}"
}

View file

@ -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"
}

View file

@ -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."
}

View file

@ -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"
}

View file

@ -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",

View file

@ -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"
}

View file

@ -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."
}

View file

@ -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"
}

View file

@ -379,5 +379,7 @@
"IndexerSettingsCategories": "Kategorije",
"IndexerHDBitsSettingsCategories": "Kategorije",
"IndexerHDBitsSettingsCodecs": "Kodek",
"ReleaseProfile": "profil verzije"
"ReleaseProfile": "profil verzije",
"AddANewPath": "Dodaj novu putanju",
"AddCustomFilter": "Dodaj proizvoljan filter"
}

View file

@ -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)"
}

View file

@ -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}"
}

View file

@ -1541,5 +1541,9 @@
"EditMovieCollectionModalHeader": "Modifica - {title}",
"IndexerSettingsRejectBlocklistedTorrentHashesHelpText": "Se un torrent è bloccato tramite hash, potrebbe non essere correttamente rifiutato durante luso 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"
}

View file

@ -1931,5 +1931,6 @@
"FileSize": "파일 크기",
"IndexerSettingsFailDownloadsHelpText": "완료된 다운로드를 처리하는 동안 {appName}는 선택된 파일 유형을 실패한 다운로드로 처리합니다.",
"ImportListsRadarrSettingsFullUrl": "전체 URL",
"DefaultNameCopiedImportList": "{name} - 복사"
"DefaultNameCopiedImportList": "{name} - 복사",
"NotificationsPushcutSettingsMetadataLinksHelpText": "알림을 보낼 때 시리즈 메타데이터에 대한 링크를 추가"
}

View file

@ -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"
}

View file

@ -1173,5 +1173,7 @@
"IndexerHDBitsSettingsCategories": "Categorii",
"IndexerHDBitsSettingsMediums": "Mediu",
"IndexerSettingsCategories": "Categorii",
"DefaultNameCopiedImportList": "{name} - Copie"
"DefaultNameCopiedImportList": "{name} - Copie",
"Warning": "Avertisment",
"YesterdayAt": "Ieri la {time}"
}

View file

@ -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": "Добавляет ссылки на метаданные сериала при отправке уведомлений"
}

View file

@ -1082,5 +1082,6 @@
"ImportListsTraktSettingsCertification": "การรับรอง",
"ImportListsTraktSettingsGenres": "ประเภท",
"ImportListsTraktSettingsRating": "การให้คะแนน",
"IndexerHDBitsSettingsMediums": "ปานกลาง"
"IndexerHDBitsSettingsMediums": "ปานกลาง",
"AddANewPath": "เพิ่มเส้นทางใหม่"
}

View file

@ -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"
}

View file

@ -2008,5 +2008,10 @@
"EditMovieCollectionModalHeader": "Редагувати - {title}",
"NotificationsAppriseSettingsIncludePoster": "Включити постер",
"DefaultNameCopiedImportList": "{name} - Копіювати",
"ReleaseProfile": "Профіль релізу"
"ReleaseProfile": "Профіль релізу",
"DownloadClientItemErrorMessage": "{clientName} повертає помилку: {message}",
"NotificationsPushcutSettingsIncludePoster": "Включити постер",
"NotificationsPushcutSettingsIncludePosterHelpText": "Включити постер з сповіщенням",
"NotificationsPushcutSettingsMetadataLinks": "Посилання на метадані",
"NotificationsPushcutSettingsMetadataLinksHelpText": "Додати посилання на метадані серіалу при надсиланні сповіщень"
}

View file

@ -1878,7 +1878,7 @@
"CustomFormatsSpecificationMinimumSizeHelpText": "必须大于该尺寸才会发布",
"CustomFormatsSpecificationMinimumYear": "最小年份",
"CustomFormatsSpecificationResolution": "分辨率",
"CustomFormatsSpecificationSource": "代码",
"CustomFormatsSpecificationSource": "",
"AutoTaggingSpecificationGenre": "类型",
"AutoTaggingSpecificationMaximumYear": "最大年份",
"Mixed": "混合",
@ -1986,5 +1986,6 @@
"MyComputer": "我的电脑",
"EditMovieCollectionModalHeader": "编辑 - {title}",
"DefaultNameCopiedImportList": "{name} - 复制",
"ReleaseProfile": "发行配置文件"
"ReleaseProfile": "发行配置文件",
"NotificationsPushcutSettingsMetadataLinks": "元数据链接"
}

View file

@ -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";
}

View file

@ -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)

View 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;
}
}
}

View file

@ -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;
}
}

View file

@ -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);
}
}
}

View file

@ -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; }
}
}

View file

@ -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)
{

View file

@ -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));

View file

@ -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);
}
}

View file

@ -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 ()

View file

@ -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);

View file

@ -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)|

View file

@ -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" />

View file

@ -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();
});

View file

@ -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]

View file

@ -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);

View file

@ -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();
}
}
}

View file

@ -7333,10 +7333,13 @@
"name": "movieId",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "integer",
"format": "int32"
}
}
}
],
"responses": {
"200": {

View file

@ -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)