Compare commits

..

No commits in common. "develop" and "v4.0.14.2938" have entirely different histories.

12 changed files with 211 additions and 262 deletions

View file

@ -22,7 +22,7 @@ env:
FRAMEWORK: net6.0 FRAMEWORK: net6.0
RAW_BRANCH_NAME: ${{ github.head_ref || github.ref_name }} RAW_BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
SONARR_MAJOR_VERSION: 4 SONARR_MAJOR_VERSION: 4
VERSION: 4.0.16 VERSION: 4.0.14
jobs: jobs:
backend: backend:

View file

@ -19,7 +19,6 @@
.modal { .modal {
position: relative; position: relative;
display: flex; display: flex;
max-width: 90%;
max-height: 90%; max-height: 90%;
border-radius: 6px; border-radius: 6px;
opacity: 1; opacity: 1;

View file

@ -390,12 +390,5 @@ public virtual HttpRequestBuilder AddFormUpload(string name, string fileName, by
return this; return this;
} }
public virtual HttpRequestBuilder AllowRedirect(bool allowAutoRedirect = true)
{
AllowAutoRedirect = allowAutoRedirect;
return this;
}
} }
} }

View file

@ -1,9 +0,0 @@
using System.IO;
using System.Text;
namespace NzbDrone.Common;
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}

View file

@ -213,16 +213,5 @@ public void should_use_runtime_from_episode_over_series()
Subject.IsSample(_localEpisode).Should().Be(DetectSampleResult.Sample); Subject.IsSample(_localEpisode).Should().Be(DetectSampleResult.Sample);
} }
[Test]
public void should_default_to_45_minutes_if_runtime_is_zero()
{
GivenRuntime(120);
_localEpisode.Series.Runtime = 0;
_localEpisode.Episodes.First().Runtime = 0;
Subject.IsSample(_localEpisode).Should().Be(DetectSampleResult.Sample);
}
} }
} }

View file

@ -425,8 +425,8 @@ private void AuthenticateClient(HttpRequestBuilder requestBuilder, QBittorrentSe
} }
catch (HttpException ex) catch (HttpException ex)
{ {
_logger.Debug(ex, "qbitTorrent authentication failed."); _logger.Debug("qbitTorrent authentication failed.");
if (ex.Response.StatusCode is HttpStatusCode.Unauthorized or HttpStatusCode.Forbidden) if (ex.Response.StatusCode == HttpStatusCode.Forbidden)
{ {
throw new DownloadClientAuthenticationException("Failed to authenticate with qBittorrent.", ex); throw new DownloadClientAuthenticationException("Failed to authenticate with qBittorrent.", ex);
} }
@ -438,7 +438,7 @@ private void AuthenticateClient(HttpRequestBuilder requestBuilder, QBittorrentSe
throw new DownloadClientUnavailableException("Failed to connect to qBittorrent, please check your settings.", ex); throw new DownloadClientUnavailableException("Failed to connect to qBittorrent, please check your settings.", ex);
} }
if (response.Content.IsNotNullOrWhiteSpace() && response.Content != "Ok.") if (response.Content != "Ok.")
{ {
// returns "Fails." on bad login // returns "Fails." on bad login
_logger.Debug("qbitTorrent authentication failed."); _logger.Debug("qbitTorrent authentication failed.");

View file

@ -8,7 +8,6 @@
using System.Xml; using System.Xml;
using System.Xml.Linq; using System.Xml.Linq;
using NLog; using NLog;
using NzbDrone.Common;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
@ -150,7 +149,13 @@ public override MetadataFileResult SeriesMetadata(Series series, SeriesMetadataR
if (Settings.SeriesMetadata) if (Settings.SeriesMetadata)
{ {
_logger.Debug("Generating Series Metadata for: {0}", series.Title); _logger.Debug("Generating Series Metadata for: {0}", series.Title);
var sb = new StringBuilder();
var xws = new XmlWriterSettings();
xws.OmitXmlDeclaration = true;
xws.Indent = false;
using (var xw = XmlWriter.Create(sb, xws))
{
var tvShow = new XElement("tvshow"); var tvShow = new XElement("tvshow");
tvShow.Add(new XElement("title", series.Title)); tvShow.Add(new XElement("title", series.Title));
@ -243,23 +248,11 @@ public override MetadataFileResult SeriesMetadata(Series series, SeriesMetadataR
tvShow.Add(new XElement("episodeguide", JsonSerializer.Serialize(episodeGuide, serializerSettings))); tvShow.Add(new XElement("episodeguide", JsonSerializer.Serialize(episodeGuide, serializerSettings)));
} }
var doc = new XDocument(tvShow) var doc = new XDocument(tvShow);
{
Declaration = new XDeclaration("1.0", "UTF-8", "yes"),
};
var sb = new StringBuilder();
using var sw = new Utf8StringWriter();
using var xw = XmlWriter.Create(sw, new XmlWriterSettings
{
Encoding = Encoding.UTF8,
Indent = true
});
doc.Save(xw); doc.Save(xw);
xw.Flush();
xmlResult += sw.ToString(); xmlResult += doc.ToString();
}
} }
if (Settings.SeriesMetadataUrl) if (Settings.SeriesMetadataUrl)
@ -287,19 +280,16 @@ public override MetadataFileResult EpisodeMetadata(Series series, EpisodeFile ep
var watched = GetExistingWatchedStatus(series, episodeFile.RelativePath); var watched = GetExistingWatchedStatus(series, episodeFile.RelativePath);
var xmlResult = string.Empty; var xmlResult = string.Empty;
var xws = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
Indent = true
};
foreach (var episode in episodeFile.Episodes.Value) foreach (var episode in episodeFile.Episodes.Value)
{ {
var doc = new XDocument var sb = new StringBuilder();
{ var xws = new XmlWriterSettings();
Declaration = new XDeclaration("1.0", "UTF-8", "yes") xws.OmitXmlDeclaration = true;
}; xws.Indent = false;
using (var xw = XmlWriter.Create(sb, xws))
{
var doc = new XDocument();
var image = episode.Images.SingleOrDefault(i => i.CoverType == MediaCoverTypes.Screenshot); var image = episode.Images.SingleOrDefault(i => i.CoverType == MediaCoverTypes.Screenshot);
var details = new XElement("episodedetails"); var details = new XElement("episodedetails");
@ -391,16 +381,13 @@ public override MetadataFileResult EpisodeMetadata(Series series, EpisodeFile ep
// details.Add(new XElement("credits", tvdbEpisode.Writer.FirstOrDefault())); // details.Add(new XElement("credits", tvdbEpisode.Writer.FirstOrDefault()));
// details.Add(new XElement("director", tvdbEpisode.Directors.FirstOrDefault())); // details.Add(new XElement("director", tvdbEpisode.Directors.FirstOrDefault()));
using var sw = new Utf8StringWriter();
using var xw = XmlWriter.Create(sw, xws);
doc.Add(details); doc.Add(details);
doc.Save(xw); doc.Save(xw);
xw.Flush();
xmlResult += sw.ToString(); xmlResult += doc.ToString();
xmlResult += Environment.NewLine; xmlResult += Environment.NewLine;
} }
}
return new MetadataFileResult(GetEpisodeMetadataFilename(episodeFile.RelativePath), xmlResult.Trim(Environment.NewLine.ToCharArray())); return new MetadataFileResult(GetEpisodeMetadataFilename(episodeFile.RelativePath), xmlResult.Trim(Environment.NewLine.ToCharArray()));
} }

View file

@ -72,7 +72,7 @@ private List<TResource> Execute<TResource>(CustomSettings settings)
} }
var baseUrl = settings.BaseUrl.TrimEnd('/'); var baseUrl = settings.BaseUrl.TrimEnd('/');
var request = new HttpRequestBuilder(baseUrl).Accept(HttpAccept.Json).AllowRedirect().Build(); var request = new HttpRequestBuilder(baseUrl).Accept(HttpAccept.Json).Build();
var response = _httpClient.Get(request); var response = _httpClient.Get(request);
var results = JsonConvert.DeserializeObject<List<TResource>>(response.Content); var results = JsonConvert.DeserializeObject<List<TResource>>(response.Content);

View file

@ -305,7 +305,7 @@ private void CleanLibrary()
{ {
var seriesExists = allListItems.Where(l => var seriesExists = allListItems.Where(l =>
l.TvdbId == series.TvdbId || l.TvdbId == series.TvdbId ||
(l.ImdbId.IsNotNullOrWhiteSpace() && series.ImdbId.IsNotNullOrWhiteSpace() && l.ImdbId == series.ImdbId) || l.ImdbId == series.ImdbId ||
l.TmdbId == series.TmdbId || l.TmdbId == series.TmdbId ||
series.MalIds.Contains(l.MalId) || series.MalIds.Contains(l.MalId) ||
series.AniListIds.Contains(l.AniListId)).ToList(); series.AniListIds.Contains(l.AniListId)).ToList();

View file

@ -1,5 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Newtonsoft.Json; using System.Text.Json.Serialization;
namespace NzbDrone.Core.ImportLists.Trakt namespace NzbDrone.Core.ImportLists.Trakt
{ {
@ -17,7 +17,7 @@ public class TraktSeriesResource
public string Title { get; set; } public string Title { get; set; }
public int? Year { get; set; } public int? Year { get; set; }
public TraktSeriesIdsResource Ids { get; set; } public TraktSeriesIdsResource Ids { get; set; }
[JsonProperty("aired_episodes")] [JsonPropertyName("aired_episodes")]
public int AiredEpisodes { get; set; } public int AiredEpisodes { get; set; }
} }
@ -44,11 +44,11 @@ public class TraktWatchedResponse : TraktResponse
public class RefreshRequestResponse public class RefreshRequestResponse
{ {
[JsonProperty("access_token")] [JsonPropertyName("access_token")]
public string AccessToken { get; set; } public string AccessToken { get; set; }
[JsonProperty("expires_in")] [JsonPropertyName("expires_in")]
public int ExpiresIn { get; set; } public int ExpiresIn { get; set; }
[JsonProperty("refresh_token")] [JsonPropertyName("refresh_token")]
public string RefreshToken { get; set; } public string RefreshToken { get; set; }
} }

View file

@ -66,12 +66,6 @@ public DetectSampleResult IsSample(LocalEpisode localEpisode)
return DetectSampleResult.Indeterminate; return DetectSampleResult.Indeterminate;
} }
if (runtime == 0)
{
_logger.Debug("Series runtime is 0, defaulting runtime to 45 minutes");
runtime = 45;
}
return IsSample(localEpisode.Path, localEpisode.MediaInfo.RunTime, runtime); return IsSample(localEpisode.Path, localEpisode.MediaInfo.RunTime, runtime);
} }

View file

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Net;
using DryIoc; using DryIoc;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
@ -60,11 +59,8 @@ public void ConfigureServices(IServiceCollection services)
services.Configure<ForwardedHeadersOptions>(options => services.Configure<ForwardedHeadersOptions>(options =>
{ {
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost;
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 8)); options.KnownNetworks.Clear();
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.16.0.0"), 12)); options.KnownProxies.Clear();
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("192.168.0.0"), 16));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("fc00::"), 7));
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("fe80::"), 10));
}); });
services.AddRouting(options => options.LowercaseUrls = true); services.AddRouting(options => options.LowercaseUrls = true);