1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-15 15:54:47 -04:00

Compare commits

..

23 Commits

Author SHA1 Message Date
ta264
d96dfd228e Ipv6 logging 2022-01-30 04:09:03 +00:00
ta264
e7a8f6332c Fixed: Handle missing category when getting Qbittorrent download path
Fixes RADARR-7HC
Fixes RADARR-V49

(cherry picked from commit 6f97ca9a55471386454457ca52b93733e18e85e4)
Closes #6993
2022-01-25 20:10:52 -06:00
Qstick
b8c92d23f4 Fixed: Ignore case for DIVX VideoCodecID 2022-01-25 19:01:01 -06:00
bakerboy448
093e076db0 Fixed: Clarify Indexer Priority Helptext 2022-01-24 19:35:38 -06:00
Volodymyr Medvid
f6f949415c Fix Ukrainian language mappings 2022-01-24 19:23:12 -06:00
Qstick
ea2576a56c Bump to 4.0.4 2022-01-23 19:03:07 -06:00
Qstick
595acb696d Fixed: Bump FFMpegCore to avoid DivideByZero error 2022-01-23 18:24:28 -06:00
Qstick
38c9534eac Fixed: Webhook fails due to Frames/Analysis property serialization on MediaInfo 2022-01-23 18:24:28 -06:00
bakerboy448
9377ef7942 Fixed: Improved Indexer test failure message when no results are returned
(cherry picked from commit 05b1581b7dfa5bc8a2b38a60179e3472c8134f74)
2022-01-23 16:18:37 -06:00
bakerboy448
c2e5686bcf fixed sonarr ref in UTorrentSettings 2022-01-23 14:44:31 -06:00
Qstick
f08807daf6 Update donation links [common] 2022-01-23 12:12:16 -06:00
bakerboy448
72b3caa72d Fixed: Various Translations 2022-01-21 18:52:46 -06:00
Qstick
589368781b Fixed Incorrect placeholder width on search page
Co-Authored-By: nitsua <8321115+austinwbest@users.noreply.github.com>
2022-01-20 21:12:30 -06:00
Qstick
8fd6101121 New: Add AppName to system status response
Fixes #6952
2022-01-18 23:23:41 -06:00
Mark McDowall
ac9d6cbf0a Fixed: Jump bar on series page not showing when window is made wider
(cherry picked from commit 0cb8d93069d6310abd39ee2fe73219e17aa83fe6)
2022-01-17 11:30:47 -06:00
Qstick
6e0ed36e9f Fixed: Correct queue color for status bars 2022-01-17 08:58:07 -06:00
Qstick
fcb65055ef Bump to 4.0.3 2022-01-15 16:24:50 -06:00
bakerboy448
90456bbfed fixup 2022-01-15 14:51:11 -06:00
bakerboy448
2a74b7b2e1 Fixed: Parse HD.DVD as BluRay
Fixes #6925
2022-01-15 14:51:11 -06:00
Qstick
fc08c39fb8 Fixed: Revert manual import augmentation for unknown items 2022-01-15 14:24:51 -06:00
PearsonFlyer
76d65bf990 Fixed: Translation warning for search all 2022-01-15 07:27:58 -06:00
ta264
de243991dd Support for digest auth with HttpRequests
(cherry picked from commit 1e2d931f9a)
2022-01-13 19:23:30 -06:00
Qstick
4d1f251c1f Bump version 4.0.2 2022-01-10 19:59:16 -06:00
35 changed files with 139 additions and 87 deletions

View File

@@ -7,7 +7,7 @@ variables:
outputFolder: './_output'
artifactsFolder: './_artifacts'
testsFolder: './_tests'
majorVersion: '4.0.1'
majorVersion: '4.0.4'
minorVersion: $[counter('minorVersion', 2000)]
radarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(radarrVersion)'

View File

@@ -86,6 +86,13 @@ class AddNewMovieSearchResult extends Component {
} = this.state;
const linkProps = isExistingMovie ? { to: `/movie/${titleSlug}` } : { onPress: this.onPress };
const posterWidth = 167;
const posterHeight = 250;
const elementStyle = {
width: `${posterWidth}px`,
height: `${posterHeight}px`
};
return (
<div className={styles.searchResult}>
@@ -102,6 +109,7 @@ class AddNewMovieSearchResult extends Component {
<div className={styles.posterContainer}>
<MoviePoster
className={styles.poster}
style={elementStyle}
images={images}
size={250}
overflow={true}
@@ -114,7 +122,7 @@ class AddNewMovieSearchResult extends Component {
monitored={monitored}
hasFile={hasFile}
status={status}
posterWidth={167}
posterWidth={posterWidth}
detailedProgressBar={true}
queueStatus={queueStatus}
queueState={queueState}

View File

@@ -81,7 +81,7 @@ class PageHeader extends Component {
<IconButton
className={styles.donate}
name={icons.HEART}
to="https://opencollective.com/radarr"
to="https://radarr.video/donate"
size={14}
/>
<IconButton

View File

@@ -100,7 +100,9 @@ class PageJumpBar extends Component {
// Listeners
onMeasure = ({ height }) => {
this.setState({ height });
if (height > 0) {
this.setState({ height });
}
}
//

View File

@@ -13,7 +13,7 @@ class Donations extends Component {
return (
<FieldSet legend={translate('Donations')}>
<div className={styles.logoContainer} title="Radarr">
<Link to="https://opencollective.com/radarr">
<Link to="https://radarr.video/donate">
<img
className={styles.logo}
src={`${window.Radarr.urlBase}/Content/Images/Icons/logo-radarr.png`}
@@ -21,7 +21,7 @@ class Donations extends Component {
</Link>
</div>
<div className={styles.logoContainer} title="Lidarr">
<Link to="https://opencollective.com/lidarr">
<Link to="https://lidarr.audio/donate">
<img
className={styles.logo}
src={`${window.Radarr.urlBase}/Content/Images/Icons/logo-lidarr.png`}
@@ -29,7 +29,7 @@ class Donations extends Component {
</Link>
</div>
<div className={styles.logoContainer} title="Readarr">
<Link to="https://opencollective.com/readarr">
<Link to="https://readarr.com/donate">
<img
className={styles.logo}
src={`${window.Radarr.urlBase}/Content/Images/Icons/logo-readarr.png`}
@@ -37,7 +37,7 @@ class Donations extends Component {
</Link>
</div>
<div className={styles.logoContainer} title="Prowlarr">
<Link to="https://opencollective.com/prowlarr">
<Link to="https://prowlarr.com/donate">
<img
className={styles.logo}
src={`${window.Radarr.urlBase}/Content/Images/Icons/logo-prowlarr.png`}
@@ -45,7 +45,7 @@ class Donations extends Component {
</Link>
</div>
<div className={styles.logoContainer} title="Sonarr">
<Link to="https://opencollective.com/sonarr">
<Link to="https://sonarr.tv/donate">
<img
className={styles.logo}
src={`${window.Radarr.urlBase}/Content/Images/Icons/logo-sonarr.png`}

View File

@@ -200,7 +200,7 @@ class QueuedTaskRow extends Component {
{
clientUserAgent ?
<span className={styles.userAgent} title={translate('TaskUserAgentTooltip')}>
{translate('from')}: {clientUserAgent}
{translate('From')}: {clientUserAgent}
</span> :
null
}

View File

@@ -2,7 +2,7 @@ import { kinds } from 'Helpers/Props';
function getStatusStyle(status, monitored, hasFile, isAvailable, returnType, queue = false) {
if (queue) {
return returnType === 'kinds' ? kinds.SUCCESS : 'queue';
return returnType === 'kinds' ? kinds.QUEUE : 'queue';
}
if (hasFile && monitored) {

View File

@@ -0,0 +1,12 @@
using System.Net;
namespace NzbDrone.Common.Http
{
public class BasicNetworkCredential : NetworkCredential
{
public BasicNetworkCredential(string user, string pass)
: base(user, pass)
{
}
}
}

View File

@@ -4,20 +4,24 @@ using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http.Proxy;
using NzbDrone.Common.Instrumentation;
namespace NzbDrone.Common.Http.Dispatchers
{
public class ManagedHttpDispatcher : IHttpDispatcher
{
private const string NO_PROXY_KEY = "no-proxy";
private const int connection_establish_timeout = 2000;
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(ManagedHttpDispatcher));
private static bool useIPv6 = Socket.OSSupportsIPv6;
private static bool hasResolvedIPv6Availability;
@@ -26,12 +30,13 @@ namespace NzbDrone.Common.Http.Dispatchers
private readonly ICertificateValidationService _certificateValidationService;
private readonly IUserAgentBuilder _userAgentBuilder;
private readonly ICached<System.Net.Http.HttpClient> _httpClientCache;
private readonly ICached<CredentialCache> _credentialCache;
public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider,
ICreateManagedWebProxy createManagedWebProxy,
ICertificateValidationService certificateValidationService,
IUserAgentBuilder userAgentBuilder,
ICacheManager cacheManager)
ICreateManagedWebProxy createManagedWebProxy,
ICertificateValidationService certificateValidationService,
IUserAgentBuilder userAgentBuilder,
ICacheManager cacheManager)
{
_proxySettingsProvider = proxySettingsProvider;
_createManagedWebProxy = createManagedWebProxy;
@@ -39,6 +44,7 @@ namespace NzbDrone.Common.Http.Dispatchers
_userAgentBuilder = userAgentBuilder;
_httpClientCache = cacheManager.GetCache<System.Net.Http.HttpClient>(typeof(ManagedHttpDispatcher));
_credentialCache = cacheManager.GetCache<CredentialCache>(typeof(ManagedHttpDispatcher), "credentialcache");
}
public HttpResponse GetResponse(HttpRequest request, CookieContainer cookies)
@@ -64,6 +70,26 @@ namespace NzbDrone.Common.Http.Dispatchers
cts.CancelAfter(TimeSpan.FromSeconds(100));
}
if (request.Credentials != null)
{
if (request.Credentials is BasicNetworkCredential bc)
{
// Manually set header to avoid initial challenge response
var authInfo = bc.UserName + ":" + bc.Password;
authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo));
requestMessage.Headers.Add("Authorization", "Basic " + authInfo);
}
else if (request.Credentials is NetworkCredential nc)
{
var creds = GetCredentialCache();
foreach (var authtype in new[] { "Basic", "Digest" })
{
creds.Remove((Uri)request.Url, authtype);
creds.Add((Uri)request.Url, authtype, nc);
}
}
}
if (request.ContentData != null)
{
requestMessage.Content = new ByteArrayContent(request.ContentData);
@@ -120,6 +146,8 @@ namespace NzbDrone.Common.Http.Dispatchers
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Brotli,
UseCookies = false, // sic - we don't want to use a shared cookie container
AllowAutoRedirect = false,
Credentials = GetCredentialCache(),
PreAuthenticate = true,
MaxConnectionsPerServer = 12,
ConnectCallback = onConnect,
SslOptions = new SslClientAuthenticationOptions
@@ -204,18 +232,28 @@ namespace NzbDrone.Common.Http.Dispatchers
headers.Add(header, value);
}
private CredentialCache GetCredentialCache()
{
return _credentialCache.Get("credentialCache", () => new CredentialCache());
}
private static async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
{
Logger.Trace($"useIPv6: {useIPv6} hasResolvedipv6availability: {hasResolvedIPv6Availability}");
// Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way.
// This issue is being tracked at https://github.com/dotnet/runtime/issues/26177 and expected to be fixed in .NET 6.
if (useIPv6)
{
Logger.Trace("Trying Ipv6");
try
{
var localToken = cancellationToken;
if (!hasResolvedIPv6Availability)
{
Logger.Trace($"Using fast timeout {connection_establish_timeout}");
// to make things move fast, use a very low timeout for the initial ipv6 attempt.
var quickFailCts = new CancellationTokenSource(connection_establish_timeout);
var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, quickFailCts.Token);
@@ -225,8 +263,10 @@ namespace NzbDrone.Common.Http.Dispatchers
return await attemptConnection(AddressFamily.InterNetworkV6, context, localToken);
}
catch
catch (Exception e)
{
Logger.Trace(e, "Error in ipv6 attempt");
// very naively fallback to ipv4 permanently for this execution based on the response of the first connection attempt.
// note that this may cause users to eventually get switched to ipv4 (on a random failure when they are switching networks, for instance)
// but in the interest of keeping this implementation simple, this is acceptable.
@@ -238,6 +278,8 @@ namespace NzbDrone.Common.Http.Dispatchers
}
}
Logger.Trace("Falling back to ipv4");
// fallback to IPv4.
return await attemptConnection(AddressFamily.InterNetwork, context, cancellationToken);
}

View File

@@ -38,6 +38,7 @@ namespace NzbDrone.Common.Http
public HttpHeader Headers { get; set; }
public byte[] ContentData { get; set; }
public string ContentSummary { get; set; }
public ICredentials Credentials { get; set; }
public bool SuppressHttpError { get; set; }
public IEnumerable<HttpStatusCode> SuppressHttpErrorStatusCodes { get; set; }
public bool UseSimplifiedUserAgent { get; set; }
@@ -89,12 +90,5 @@ namespace NzbDrone.Common.Http
var encoding = HttpHeader.GetEncodingFromContentType(Headers.ContentType);
ContentData = encoding.GetBytes(data);
}
public void AddBasicAuthentication(string username, string password)
{
var authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes($"{username}:{password}"));
Headers.Set("Authorization", "Basic " + authInfo);
}
}
}

View File

@@ -26,10 +26,9 @@ namespace NzbDrone.Common.Http
public bool ConnectionKeepAlive { get; set; }
public TimeSpan RateLimit { get; set; }
public bool LogResponseContent { get; set; }
public NetworkCredential NetworkCredential { get; set; }
public ICredentials NetworkCredential { get; set; }
public Dictionary<string, string> Cookies { get; private set; }
public List<HttpFormData> FormData { get; private set; }
public Action<HttpRequest> PostProcess { get; set; }
public HttpRequestBuilder(string baseUrl)
@@ -109,13 +108,7 @@ namespace NzbDrone.Common.Http
request.ConnectionKeepAlive = ConnectionKeepAlive;
request.RateLimit = RateLimit;
request.LogResponseContent = LogResponseContent;
if (NetworkCredential != null)
{
var authInfo = NetworkCredential.UserName + ":" + NetworkCredential.Password;
authInfo = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(authInfo));
request.Headers.Set("Authorization", "Basic " + authInfo);
}
request.Credentials = NetworkCredential;
foreach (var header in Headers)
{

View File

@@ -19,6 +19,8 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo.MediaInfoFormatterTests
[TestCase("wmv1, WMV1", "Droned.wmv", "WMV")]
[TestCase("wmv2, WMV2", "Droned.wmv", "WMV")]
[TestCase("mpeg4, XVID", "", "XviD")]
[TestCase("mpeg4, DIVX", "", "DivX")]
[TestCase("mpeg4, divx", "", "DivX")]
[TestCase("mpeg4, DIV3", "spsm.dvdrip.divx.avi'.", "DivX")]
[TestCase("msmpeg4, DIV3", "Exit the Dragon, Enter the Tiger (1976) 360p MPEG Audio.avi", "DivX")]
[TestCase("msmpeg4v2, DIV3", "Exit the Dragon, Enter the Tiger (1976) 360p MPEG Audio.avi", "DivX")]

View File

@@ -259,6 +259,7 @@ namespace NzbDrone.Core.Test.ParserTests
[TestCase("Movie.Name.2011.1080p.UHD.BluRay.DD5.1.HDR.x265-CtrlHD.mkv", false)]
[TestCase("Movie.Name.2016.German.DTS.DL.1080p.UHDBD.x265-TDO.mkv", false)]
[TestCase("Movie.Name.2021.1080p.BDLight.x265-AVCDVD", false)]
[TestCase("Random.Title.2010.1080p.HD.DVD.AVC.DDP.5.1-GRouP", false)]
public void should_parse_bluray1080p_quality(string title, bool proper)
{
ParseAndVerifyQuality(title, Source.BLURAY, proper, Resolution.R1080p);

View File

@@ -73,7 +73,7 @@ namespace NzbDrone.Core.Download.Clients.Hadouken
baseUrl = HttpUri.CombinePath(baseUrl, "api");
var requestBuilder = new JsonRpcRequestBuilder(baseUrl, method, parameters);
requestBuilder.LogResponseContent = true;
requestBuilder.NetworkCredential = new NetworkCredential(settings.Username, settings.Password);
requestBuilder.NetworkCredential = new BasicNetworkCredential(settings.Username, settings.Password);
requestBuilder.Headers.Add("Accept-Encoding", "gzip,deflate");
var httpRequest = requestBuilder.Build();

View File

@@ -229,7 +229,7 @@ namespace NzbDrone.Core.Download.Clients.Nzbget
var requestBuilder = new JsonRpcRequestBuilder(baseUrl, method, parameters);
requestBuilder.LogResponseContent = true;
requestBuilder.NetworkCredential = new NetworkCredential(settings.Username, settings.Password);
requestBuilder.NetworkCredential = new BasicNetworkCredential(settings.Username, settings.Password);
var httpRequest = requestBuilder.Build();

View File

@@ -368,9 +368,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
if (Settings.MovieCategory.IsNotNullOrWhiteSpace() && version >= Version.Parse("2.0"))
{
var label = Proxy.GetLabels(Settings)[Settings.MovieCategory];
if (label.SavePath.IsNotNullOrWhiteSpace())
if (Proxy.GetLabels(Settings).TryGetValue(Settings.MovieCategory, out var label) && label.SavePath.IsNotNullOrWhiteSpace())
{
var labelDir = new OsPath(label.SavePath);

View File

@@ -293,7 +293,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
var requestBuilder = new HttpRequestBuilder(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase)
{
LogResponseContent = true,
NetworkCredential = new NetworkCredential(settings.Username, settings.Password)
NetworkCredential = new BasicNetworkCredential(settings.Username, settings.Password)
};
return requestBuilder;
}

View File

@@ -335,7 +335,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
var requestBuilder = new HttpRequestBuilder(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase)
{
LogResponseContent = true,
NetworkCredential = new NetworkCredential(settings.Username, settings.Password)
NetworkCredential = new BasicNetworkCredential(settings.Username, settings.Password)
};
return requestBuilder;
}

View File

@@ -200,7 +200,7 @@ namespace NzbDrone.Core.Download.Clients.Transmission
.Accept(HttpAccept.Json);
requestBuilder.LogResponseContent = true;
requestBuilder.NetworkCredential = new NetworkCredential(settings.Username, settings.Password);
requestBuilder.NetworkCredential = new BasicNetworkCredential(settings.Username, settings.Password);
requestBuilder.AllowAutoRedirect = false;
return requestBuilder;

View File

@@ -196,7 +196,7 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
.Accept(HttpAccept.Json);
requestBuilder.LogResponseContent = true;
requestBuilder.NetworkCredential = new NetworkCredential(settings.Username, settings.Password);
requestBuilder.NetworkCredential = new BasicNetworkCredential(settings.Username, settings.Password);
return requestBuilder;
}

View File

@@ -49,7 +49,7 @@ namespace NzbDrone.Core.Download.Clients.UTorrent
[FieldDefinition(6, Label = "Category", Type = FieldType.Textbox, HelpText = "Adding a category specific to Radarr avoids conflicts with unrelated downloads, but it's optional")]
public string MovieCategory { get; set; }
[FieldDefinition(7, Label = "Post-Import Category", Type = FieldType.Textbox, Advanced = true, HelpText = "Category for Radarr to set after it has imported the download. Sonarr will not remove the torrent if seeding has finished. Leave blank to keep same category.")]
[FieldDefinition(7, Label = "Post-Import Category", Type = FieldType.Textbox, Advanced = true, HelpText = "Category for Radarr to set after it has imported the download. Radarr will not remove the torrent if seeding has finished. Leave blank to keep same category.")]
public string MovieImportedCategory { get; set; }
[FieldDefinition(8, Label = "Recent Priority", Type = FieldType.Select, SelectOptions = typeof(UTorrentPriority), HelpText = "Priority to use when grabbing movies that aired within the last 21 days")]

View File

@@ -335,7 +335,7 @@ namespace NzbDrone.Core.Indexers
if (releases.Empty())
{
return new ValidationFailure(string.Empty, "Query successful, but no results were returned from your indexer. This may be an issue with the indexer or your indexer category settings.");
return new ValidationFailure(string.Empty, "Query successful, but no results in the configured categories were returned from your indexer. This may be an issue with the indexer or your indexer category settings.");
}
}
catch (ApiKeyException ex)

View File

@@ -102,7 +102,7 @@ namespace NzbDrone.Core.Languages
public static Language Bulgarian => new Language(29, "Bulgarian");
public static Language PortugueseBR => new Language(30, "Portuguese (Brazil)");
public static Language Arabic => new Language(31, "Arabic");
public static Language Ukrainian => new Language(32, "Unkrainian");
public static Language Ukrainian => new Language(32, "Ukrainian");
public static Language Persian => new Language(33, "Persian");
public static Language Bengali => new Language(34, "Bengali");
public static Language Any => new Language(-1, "Any");

View File

@@ -71,6 +71,7 @@
"Authentication": "Authentication",
"AuthenticationMethodHelpText": "Require Username and Password to access Radarr",
"AuthForm": "Forms (Login Page)",
"Auto": "Auto",
"Automatic": "Automatic",
"AutomaticSearch": "Automatic Search",
"AutoRedownloadFailedHelpText": "Automatically search for and attempt to download a different release",
@@ -226,10 +227,6 @@
"DetailedProgressBar": "Detailed Progress Bar",
"DetailedProgressBarHelpText": "Show text on progress bar",
"Details": "Details",
"TmdbRating": "TMDb Rating",
"TmdbVotes": "TMDb Votes",
"ImdbRating": "IMDb Rating",
"ImdbVotes": "IMDb Votes",
"DigitalRelease": "Digital Release",
"Disabled": "Disabled",
"Discord": "Discord",
@@ -266,6 +263,7 @@
"DownloadPropersAndRepacksHelpTextWarning": "Use custom formats for automatic upgrades to Propers/Repacks",
"DownloadWarning": "Download warning: {0}",
"DownloadWarningCheckDownloadClientForMoreDetails": "Download warning: check download client for more details",
"Duration": "Duration",
"Edit": "Edit",
"EditCustomFormat": "Edit Custom Format",
"EditDelayProfile": "Edit Delay Profile",
@@ -347,7 +345,7 @@
"ForMoreInformationOnTheIndividualImportListsClinkOnTheInfoButtons": "For more information on the individual import lists, click on the info buttons.",
"ForMoreInformationOnTheIndividualIndexers": "For more information on the individual indexers, click on the info buttons.",
"FreeSpace": "Free Space",
"From": "From",
"From": "from",
"General": "General",
"GeneralSettings": "General Settings",
"GeneralSettingsSummary": "Port, SSL, username/password, proxy, analytics and updates",
@@ -386,6 +384,8 @@
"IllRestartLater": "I'll restart later",
"Images": "Images",
"IMDb": "IMDb",
"ImdbRating": "IMDb Rating",
"ImdbVotes": "IMDb Votes",
"Import": "Import",
"ImportCustomFormat": "Import Custom Format",
"Imported": "Imported",
@@ -423,10 +423,11 @@
"Indexer": "Indexer",
"IndexerDownloadClientHelpText": "Specify which download client is used for grabs from this indexer",
"IndexerFlags": "Indexer Flags",
"IndexerJackettAll": "Indexers using the unsupported Jackett 'all' endpoint: {0}",
"IndexerLongTermStatusCheckAllClientMessage": "All indexers are unavailable due to failures for more than 6 hours",
"IndexerLongTermStatusCheckSingleClientMessage": "Indexers unavailable due to failures for more than 6 hours: {0}",
"IndexerPriority": "Indexer Priority",
"IndexerPriorityHelpText": "Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25.",
"IndexerPriorityHelpText": "Indexer Priority from 1 (Highest) to 50 (Lowest). Default: 25. Used when grabbing releases as a tiebreaker for otherwise equal releases, Radarr will still use all enabled indexers for RSS Sync and Searching",
"IndexerRssHealthCheckNoAvailableIndexers": "All rss-capable indexers are temporarily unavailable due to recent indexer errors",
"IndexerRssHealthCheckNoIndexers": "No indexers available with RSS sync enabled, Radarr will not grab new releases automatically",
"Indexers": "Indexers",
@@ -438,7 +439,6 @@
"IndexerStatusCheckAllClientMessage": "All indexers are unavailable due to failures",
"IndexerStatusCheckSingleClientMessage": "Indexers unavailable due to failures: {0}",
"IndexerTagHelpText": "Only use this indexer for movies with at least one matching tag. Leave blank to use with all movies.",
"IndexerJackettAll": "Indexers using the unsupported Jackett 'all' endpoint: {0}",
"Info": "Info",
"InstallLatest": "Install Latest",
"InteractiveImport": "Interactive Import",
@@ -463,6 +463,7 @@
"Level": "Level",
"LinkHere": "here",
"Links": "Links",
"List": "List",
"ListExclusions": "List Exclusions",
"Lists": "Lists",
"ListSettings": "List Settings",
@@ -589,6 +590,7 @@
"Negated": "Negated",
"NegateHelpText": "If checked, the custom format will not apply if this {0} condition matches.",
"NetCore": ".NET",
"Never": "Never",
"New": "New",
"NextExecution": "Next Execution",
"No": "No",
@@ -727,6 +729,7 @@
"RadarrSupportsCustomConditionsAgainstTheReleasePropertiesBelow": "Radarr supports custom conditions against the release properties below.",
"RadarrTags": "Radarr Tags",
"RadarrUpdated": "Radarr Updated",
"Rating": "Rating",
"Ratings": "Ratings",
"ReadTheWikiForMoreInformation": "Read the Wiki for more information",
"Real": "Real",
@@ -943,6 +946,7 @@
"SSLCertPathHelpText": "Path to pfx file",
"SSLPort": "SSL Port",
"StandardMovieFormat": "Standard Movie Format",
"Started": "Started",
"StartImport": "Start Import",
"StartProcessing": "Start Processing",
"StartSearchForMissingMovie": "Start search for missing movie",
@@ -973,7 +977,7 @@
"TestAllIndexers": "Test All Indexers",
"TestAllLists": "Test All Lists",
"TheLogLevelDefault": "The log level defaults to 'Info' and can be changed in",
"ThisCannotBeCancelled": "This cannot be cancelled once started without restarting Radarr.",
"ThisCannotBeCancelled": "This cannot be cancelled once started without disabling all of your indexers.",
"ThisConditionMatchesUsingRegularExpressions": "This condition matches using Regular Expressions. Note that the characters {0} have special meanings and need escaping with a {1}",
"Time": "Time",
"TimeFormat": "Time Format",
@@ -983,6 +987,8 @@
"TMDb": "TMDb",
"TMDBId": "TMDb Id",
"TmdbIdHelpText": "The TMDb Id of the movie to exclude",
"TmdbRating": "TMDb Rating",
"TmdbVotes": "TMDb Votes",
"Today": "Today",
"Tomorrow": "Tomorrow",
"TorrentDelay": "Torrent Delay",
@@ -1088,6 +1094,7 @@
"VideoCodec": "Video Codec",
"View": "View",
"VisitGithubCustomFormatsAphrodite": "Visit the wiki for more details: ",
"Waiting": "Waiting",
"WaitingToImport": "Waiting to Import",
"WaitingToProcess": "Waiting to Process",
"Wanted": "Wanted",
@@ -1106,4 +1113,4 @@
"YesMoveFiles": "Yes, Move the Files",
"Yesterday": "Yesterday",
"YouCanAlsoSearch": "You can also search using TMDb ID or IMDb ID of a movie. e.g. `tmdb:71663`"
}
}

View File

@@ -217,8 +217,8 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
}
if (videoCodecID == "DIV3" ||
videoCodecID == "DIVX" ||
videoCodecID == "DX50")
videoCodecID == "DX50" ||
videoCodecID.ToUpperInvariant() == "DIVX")
{
return "DivX";
}
@@ -256,7 +256,8 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
videoFormat == "rv10" ||
videoFormat == "rv20" ||
videoFormat == "rv30" ||
videoFormat == "rv40")
videoFormat == "rv40" ||
videoFormat == "cinepak")
{
return "";
}

View File

@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using FFMpegCore;
using NzbDrone.Core.Datastore;
@@ -12,12 +11,6 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo
public string RawFrameData { get; set; }
public int SchemaRevision { get; set; }
[JsonIgnore]
public IMediaAnalysis Analysis => FFProbe.Analyse(RawStreamData);
[JsonIgnore]
public IMediaAnalysis Frames => FFProbe.Analyse(RawFrameData);
public string ContainerFormat { get; set; }
public string VideoFormat { get; set; }

View File

@@ -108,7 +108,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual
_logger.Debug("Language couldn't be parsed from release, fallback to movie original language: {0}", movie.OriginalLanguage.Name);
}
var localEpisode = new LocalMovie
var localMovie = new LocalMovie
{
Movie = movie,
FileMovieInfo = Parser.Parser.ParseMoviePath(path),
@@ -122,7 +122,7 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual
ReleaseGroup = releaseGroup.IsNullOrWhiteSpace() ? Parser.Parser.ParseReleaseGroup(path) : releaseGroup,
};
return MapItem(_importDecisionMaker.GetDecision(localEpisode, downloadClientItem), rootFolder, downloadId, null);
return MapItem(_importDecisionMaker.GetDecision(localMovie, downloadClientItem), rootFolder, downloadId, null);
}
private List<ManualImportItem> ProcessFolder(string rootFolder, string baseFolder, string downloadId, int? movieId, bool filterExistingFiles)
@@ -210,10 +210,10 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual
{
var localMovie = new LocalMovie();
localMovie.Path = file;
localMovie.FileMovieInfo = Parser.Parser.ParseMoviePath(file);
localMovie.DownloadClientMovieInfo = trackedDownload?.RemoteMovie?.ParsedMovieInfo;
localMovie = _aggregationService.Augment(localMovie, null, false);
localMovie.ReleaseGroup = Parser.Parser.ParseReleaseGroup(file);
localMovie.Quality = QualityParser.ParseQuality(file);
localMovie.Languages = LanguageParser.ParseLanguages(file);
localMovie.Size = _diskProvider.GetFileSize(file);
return MapItem(new ImportDecision(localMovie, new Rejection("Unknown Movie")), rootFolder, downloadId, null);
}
@@ -246,14 +246,14 @@ namespace NzbDrone.Core.MediaFiles.MovieImport.Manual
foreach (var file in videoFiles)
{
var localEpisode = new LocalMovie();
localEpisode.Path = file;
localEpisode.Quality = new QualityModel(Quality.Unknown);
localEpisode.Languages = new List<Language> { Language.Unknown };
localEpisode.ReleaseGroup = Parser.Parser.ParseReleaseGroup(file);
localEpisode.Size = _diskProvider.GetFileSize(file);
var localMovie = new LocalMovie();
localMovie.Path = file;
localMovie.Quality = new QualityModel(Quality.Unknown);
localMovie.Languages = new List<Language> { Language.Unknown };
localMovie.ReleaseGroup = Parser.Parser.ParseReleaseGroup(file);
localMovie.Size = _diskProvider.GetFileSize(file);
items.Add(MapItem(new ImportDecision(localEpisode), rootFolder, null, null));
items.Add(MapItem(new ImportDecision(localMovie), rootFolder, null, null));
}
return items;

View File

@@ -1,10 +1,8 @@
using System;
using System.Collections.Generic;
using System;
using System.Collections.Specialized;
using System.Net;
using FluentValidation.Results;
using NLog;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Http;
namespace NzbDrone.Core.Notifications.Notifiarr

View File

@@ -102,7 +102,7 @@ namespace NzbDrone.Core.Notifications.PushBullet
var request = requestBuilder.Build();
request.Method = HttpMethod.Get;
request.AddBasicAuthentication(settings.ApiKey, string.Empty);
request.Credentials = new BasicNetworkCredential(settings.ApiKey, string.Empty);
var response = _httpClient.Execute(request);
@@ -198,7 +198,7 @@ namespace NzbDrone.Core.Notifications.PushBullet
var request = requestBuilder.Build();
request.AddBasicAuthentication(settings.ApiKey, string.Empty);
request.Credentials = new BasicNetworkCredential(settings.ApiKey, string.Empty);
_httpClient.Execute(request);
}

View File

@@ -40,7 +40,7 @@ namespace NzbDrone.Core.Notifications.Webhook
if (settings.Username.IsNotNullOrWhiteSpace() || settings.Password.IsNotNullOrWhiteSpace())
{
request.AddBasicAuthentication(settings.Username, settings.Password);
request.Credentials = new BasicNetworkCredential(settings.Username, settings.Password);
}
_httpClient.Execute(request);

View File

@@ -84,7 +84,7 @@ namespace NzbDrone.Core.Notifications.Xbmc
if (!settings.Username.IsNullOrWhiteSpace())
{
request.AddBasicAuthentication(settings.Username, settings.Password);
request.Credentials = new BasicNetworkCredential(settings.Username, settings.Password);
}
var response = _httpClient.Execute(request);

View File

@@ -40,7 +40,7 @@ namespace NzbDrone.Core.Parser
new IsoLanguage("ro", "", "ron", "Romanian", Language.Romanian),
new IsoLanguage("pt", "br", "", "Portuguese (Brazil)", Language.PortugueseBR),
new IsoLanguage("ar", "", "ara", "Arabic", Language.Arabic),
new IsoLanguage("uk", "", "uar", "Ukrainian", Language.Ukrainian),
new IsoLanguage("uk", "", "ukr", "Ukrainian", Language.Ukrainian),
new IsoLanguage("fa", "", "fas", "Persian", Language.Persian),
new IsoLanguage("be", "", "ben", "Bengali", Language.Bengali)
};

View File

@@ -15,7 +15,7 @@ namespace NzbDrone.Core.Parser
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(QualityParser));
private static readonly Regex SourceRegex = new Regex(@"\b(?:
(?<bluray>M?BluRay|Blu-Ray|HDDVD|BD(?!$)|UHDBD|BDISO|BDMux|BD25|BD50|BR.?DISK)|
(?<bluray>M?BluRay|Blu-Ray|HD.?DVD|BD(?!$)|UHDBD|BDISO|BDMux|BD25|BD50|BR.?DISK)|
(?<webdl>WEB[-_. ]DL(?:mux)?|WEBDL|AmazonHD|iTunesHD|MaxdomeHD|NetflixU?HD|WebHD|[. ]WEB[. ](?:[xh]26[45]|DDP?5[. ]1)|[. ](?-i:WEB)$|(?:\d{3,4}0p)[-. ]WEB[-. ]|[-. ]WEB[-. ]\d{3,4}0p|\b\s\/\sWEB\s\/\s\b|AMZN[. -]WEB[. -]|NF[. ]WEB[. ])|
(?<webrip>WebRip|Web-Rip|WEBMux)|
(?<hdtv>HDTV)|

View File

@@ -5,6 +5,7 @@
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.123" />
<PackageReference Include="MailKit" Version="2.15.0" />
<PackageReference Include="Servarr.FFMpegCore" Version="4.5.0-25" />
<PackageReference Include="Servarr.FFprobe" Version="4.4.1.63" />
<PackageReference Include="System.Memory" Version="4.5.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
@@ -19,7 +20,6 @@
<PackageReference Include="System.Data.SQLite.Core.Servarr" Version="1.0.115.5-18" />
<PackageReference Include="System.Text.Json" Version="6.0.1" />
<PackageReference Include="MonoTorrent" Version="2.0.1" />
<PackageReference Include="FFMpegCore" Version="4.6.16" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NzbDrone.Common\Radarr.Common.csproj" />

View File

@@ -58,6 +58,7 @@ namespace Radarr.Api.V3.System
{
return new
{
AppName = BuildInfo.AppName,
Version = BuildInfo.Version.ToString(),
BuildTime = BuildInfo.BuildDateTime,
IsDebug = BuildInfo.IsDebug,