Merge pull request #1560 from jellyfin/release-10.3.z

Backmerge for 10.3.7
This commit is contained in:
Bond-009 2019-07-24 19:10:04 +02:00 committed by GitHub
commit e8028de4d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 75 additions and 106 deletions

View File

@ -21,7 +21,7 @@ RUN apt-get update \
COPY --from=ffmpeg / / COPY --from=ffmpeg / /
COPY --from=builder /jellyfin /jellyfin COPY --from=builder /jellyfin /jellyfin
ARG JELLYFIN_WEB_VERSION=10.3.6 ARG JELLYFIN_WEB_VERSION=10.3.7
RUN curl -L https://github.com/jellyfin/jellyfin-web/archive/v${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \ RUN curl -L https://github.com/jellyfin/jellyfin-web/archive/v${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
&& rm -rf /jellyfin/jellyfin-web \ && rm -rf /jellyfin/jellyfin-web \
&& mv jellyfin-web-${JELLYFIN_WEB_VERSION} /jellyfin/jellyfin-web && mv jellyfin-web-${JELLYFIN_WEB_VERSION} /jellyfin/jellyfin-web

View File

@ -26,7 +26,7 @@ RUN apt-get update \
&& chmod 777 /cache /config /media && chmod 777 /cache /config /media
COPY --from=builder /jellyfin /jellyfin COPY --from=builder /jellyfin /jellyfin
ARG JELLYFIN_WEB_VERSION=10.3.6 ARG JELLYFIN_WEB_VERSION=10.3.7
RUN curl -L https://github.com/jellyfin/jellyfin-web/archive/v${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \ RUN curl -L https://github.com/jellyfin/jellyfin-web/archive/v${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
&& rm -rf /jellyfin/jellyfin-web \ && rm -rf /jellyfin/jellyfin-web \
&& mv jellyfin-web-${JELLYFIN_WEB_VERSION} /jellyfin/jellyfin-web && mv jellyfin-web-${JELLYFIN_WEB_VERSION} /jellyfin/jellyfin-web

View File

@ -26,7 +26,7 @@ RUN apt-get update \
&& chmod 777 /cache /config /media && chmod 777 /cache /config /media
COPY --from=builder /jellyfin /jellyfin COPY --from=builder /jellyfin /jellyfin
ARG JELLYFIN_WEB_VERSION=10.3.6 ARG JELLYFIN_WEB_VERSION=10.3.7
RUN curl -L https://github.com/jellyfin/jellyfin-web/archive/v${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \ RUN curl -L https://github.com/jellyfin/jellyfin-web/archive/v${JELLYFIN_WEB_VERSION}.tar.gz | tar zxf - \
&& rm -rf /jellyfin/jellyfin-web \ && rm -rf /jellyfin/jellyfin-web \
&& mv jellyfin-web-${JELLYFIN_WEB_VERSION} /jellyfin/jellyfin-web && mv jellyfin-web-${JELLYFIN_WEB_VERSION} /jellyfin/jellyfin-web

View File

@ -155,7 +155,6 @@ namespace Emby.Dlna.PlayTo
} }
options.RequestContentType = "text/xml"; options.RequestContentType = "text/xml";
options.AppendCharsetToMimeType = true;
options.RequestContent = postData; options.RequestContent = postData;
return _httpClient.Post(options); return _httpClient.Post(options);

View File

@ -179,10 +179,7 @@ namespace Emby.Server.Implementations.HttpClientManager
/// <param name="httpMethod">The HTTP method.</param> /// <param name="httpMethod">The HTTP method.</param>
/// <returns>Task{HttpResponseInfo}.</returns> /// <returns>Task{HttpResponseInfo}.</returns>
public Task<HttpResponseInfo> SendAsync(HttpRequestOptions options, string httpMethod) public Task<HttpResponseInfo> SendAsync(HttpRequestOptions options, string httpMethod)
{ => SendAsync(options, new HttpMethod(httpMethod));
var httpMethod2 = GetHttpMethod(httpMethod);
return SendAsync(options, httpMethod2);
}
/// <summary> /// <summary>
/// send as an asynchronous operation. /// send as an asynchronous operation.
@ -218,40 +215,6 @@ namespace Emby.Server.Implementations.HttpClientManager
return response; return response;
} }
private HttpMethod GetHttpMethod(string httpMethod)
{
if (httpMethod.Equals("DELETE", StringComparison.OrdinalIgnoreCase))
{
return HttpMethod.Delete;
}
else if (httpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase))
{
return HttpMethod.Get;
}
else if (httpMethod.Equals("HEAD", StringComparison.OrdinalIgnoreCase))
{
return HttpMethod.Head;
}
else if (httpMethod.Equals("OPTIONS", StringComparison.OrdinalIgnoreCase))
{
return HttpMethod.Options;
}
else if (httpMethod.Equals("POST", StringComparison.OrdinalIgnoreCase))
{
return HttpMethod.Post;
}
else if (httpMethod.Equals("PUT", StringComparison.OrdinalIgnoreCase))
{
return HttpMethod.Put;
}
else if (httpMethod.Equals("TRACE", StringComparison.OrdinalIgnoreCase))
{
return HttpMethod.Trace;
}
throw new ArgumentException("Invalid HTTP method", nameof(httpMethod));
}
private HttpResponseInfo GetCachedResponse(string responseCachePath, TimeSpan cacheLength, string url) private HttpResponseInfo GetCachedResponse(string responseCachePath, TimeSpan cacheLength, string url)
{ {
if (File.Exists(responseCachePath) if (File.Exists(responseCachePath)
@ -303,23 +266,15 @@ namespace Emby.Server.Implementations.HttpClientManager
} }
else if (options.RequestContent != null) else if (options.RequestContent != null)
{ {
httpWebRequest.Content = new StringContent(options.RequestContent); httpWebRequest.Content = new StringContent(
options.RequestContent,
null,
options.RequestContentType);
} }
else else
{ {
httpWebRequest.Content = new ByteArrayContent(Array.Empty<byte>()); httpWebRequest.Content = new ByteArrayContent(Array.Empty<byte>());
} }
// TODO: add correct content type
/*
var contentType = options.RequestContentType ?? "application/x-www-form-urlencoded";
if (options.AppendCharsetToMimeType)
{
contentType = contentType.TrimEnd(';') + "; charset=\"utf-8\"";
}
httpWebRequest.Headers.Add(HeaderNames.ContentType, contentType);*/
} }
if (options.LogRequest) if (options.LogRequest)
@ -331,24 +286,24 @@ namespace Emby.Server.Implementations.HttpClientManager
if (!options.BufferContent) if (!options.BufferContent)
{ {
var response = await client.SendAsync(httpWebRequest, options.CancellationToken).ConfigureAwait(false); var response = await client.SendAsync(httpWebRequest, HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false);
await EnsureSuccessStatusCode(response, options).ConfigureAwait(false); await EnsureSuccessStatusCode(response, options).ConfigureAwait(false);
options.CancellationToken.ThrowIfCancellationRequested(); options.CancellationToken.ThrowIfCancellationRequested();
var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
return new HttpResponseInfo(response.Headers) return new HttpResponseInfo(response.Headers, response.Content.Headers)
{ {
Content = stream, Content = stream,
StatusCode = response.StatusCode, StatusCode = response.StatusCode,
ContentType = response.Content.Headers.ContentType?.MediaType, ContentType = response.Content.Headers.ContentType?.MediaType,
ContentLength = stream.Length, ContentLength = response.Content.Headers.ContentLength,
ResponseUrl = response.Content.Headers.ContentLocation?.ToString() ResponseUrl = response.Content.Headers.ContentLocation?.ToString()
}; };
} }
using (var response = await client.SendAsync(httpWebRequest, options.CancellationToken).ConfigureAwait(false)) using (var response = await client.SendAsync(httpWebRequest, HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false))
{ {
await EnsureSuccessStatusCode(response, options).ConfigureAwait(false); await EnsureSuccessStatusCode(response, options).ConfigureAwait(false);
@ -360,7 +315,7 @@ namespace Emby.Server.Implementations.HttpClientManager
await stream.CopyToAsync(memoryStream, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false); await stream.CopyToAsync(memoryStream, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false);
memoryStream.Position = 0; memoryStream.Position = 0;
return new HttpResponseInfo(response.Headers) return new HttpResponseInfo(response.Headers, response.Content.Headers)
{ {
Content = memoryStream, Content = memoryStream,
StatusCode = response.StatusCode, StatusCode = response.StatusCode,
@ -430,7 +385,7 @@ namespace Emby.Server.Implementations.HttpClientManager
options.Progress.Report(100); options.Progress.Report(100);
var responseInfo = new HttpResponseInfo(response.Headers) var responseInfo = new HttpResponseInfo(response.Headers, response.Content.Headers)
{ {
TempFilePath = tempFile, TempFilePath = tempFile,
StatusCode = response.StatusCode, StatusCode = response.StatusCode,

View File

@ -2,14 +2,15 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Linq; using System.Linq;
using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Emby.XmlTv.Classes; using Emby.XmlTv.Classes;
using Emby.XmlTv.Entities; using Emby.XmlTv.Entities;
using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Common.Progress;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Dto; using MediaBrowser.Model.Dto;
@ -27,7 +28,12 @@ namespace Emby.Server.Implementations.LiveTv.Listings
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly IZipClient _zipClient; private readonly IZipClient _zipClient;
public XmlTvListingsProvider(IServerConfigurationManager config, IHttpClient httpClient, ILogger logger, IFileSystem fileSystem, IZipClient zipClient) public XmlTvListingsProvider(
IServerConfigurationManager config,
IHttpClient httpClient,
ILogger logger,
IFileSystem fileSystem,
IZipClient zipClient)
{ {
_config = config; _config = config;
_httpClient = httpClient; _httpClient = httpClient;
@ -52,7 +58,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
private async Task<string> GetXml(string path, CancellationToken cancellationToken) private async Task<string> GetXml(string path, CancellationToken cancellationToken)
{ {
_logger.LogInformation("xmltv path: {path}", path); _logger.LogInformation("xmltv path: {Path}", path);
if (!path.StartsWith("http", StringComparison.OrdinalIgnoreCase)) if (!path.StartsWith("http", StringComparison.OrdinalIgnoreCase))
{ {
@ -66,24 +72,33 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return UnzipIfNeeded(path, cacheFile); return UnzipIfNeeded(path, cacheFile);
} }
_logger.LogInformation("Downloading xmltv listings from {path}", path); _logger.LogInformation("Downloading xmltv listings from {Path}", path);
string tempFile = await _httpClient.GetTempFile(new HttpRequestOptions
{
CancellationToken = cancellationToken,
Url = path,
Progress = new SimpleProgress<double>(),
// It's going to come back gzipped regardless of this value
// So we need to make sure the decompression method is set to gzip
DecompressionMethod = CompressionMethod.Gzip,
UserAgent = "Emby/3.0"
}).ConfigureAwait(false);
Directory.CreateDirectory(Path.GetDirectoryName(cacheFile)); Directory.CreateDirectory(Path.GetDirectoryName(cacheFile));
File.Copy(tempFile, cacheFile, true); using (var res = await _httpClient.SendAsync(
new HttpRequestOptions
{
CancellationToken = cancellationToken,
Url = path,
DecompressionMethod = CompressionMethod.Gzip,
},
HttpMethod.Get).ConfigureAwait(false))
using (var stream = res.Content)
using (var fileStream = new FileStream(cacheFile, FileMode.CreateNew))
{
if (res.ContentHeaders.ContentEncoding.Contains("gzip"))
{
using (var gzStream = new GZipStream(stream, CompressionMode.Decompress))
{
await gzStream.CopyToAsync(fileStream).ConfigureAwait(false);
}
}
else
{
await stream.CopyToAsync(fileStream).ConfigureAwait(false);
}
}
return UnzipIfNeeded(path, cacheFile); return UnzipIfNeeded(path, cacheFile);
} }
@ -101,7 +116,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error extracting from gz file {file}", file); _logger.LogError(ex, "Error extracting from gz file {File}", file);
} }
try try
@ -111,7 +126,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error extracting from zip file {file}", file); _logger.LogError(ex, "Error extracting from zip file {File}", file);
} }
} }
@ -159,20 +174,10 @@ namespace Emby.Server.Implementations.LiveTv.Listings
throw new ArgumentNullException(nameof(channelId)); throw new ArgumentNullException(nameof(channelId));
} }
/* _logger.LogDebug("Getting xmltv programs for channel {Id}", channelId);
if (!await EmbyTV.EmbyTVRegistration.Instance.EnableXmlTv().ConfigureAwait(false))
{
var length = endDateUtc - startDateUtc;
if (length.TotalDays > 1)
{
endDateUtc = startDateUtc.AddDays(1);
}
}*/
_logger.LogDebug("Getting xmltv programs for channel {id}", channelId);
string path = await GetXml(info.Path, cancellationToken).ConfigureAwait(false); string path = await GetXml(info.Path, cancellationToken).ConfigureAwait(false);
_logger.LogDebug("Opening XmlTvReader for {path}", path); _logger.LogDebug("Opening XmlTvReader for {Path}", path);
var reader = new XmlTvReader(path, GetLanguage(info)); var reader = new XmlTvReader(path, GetLanguage(info));
return reader.GetProgrammes(channelId, startDateUtc, endDateUtc, cancellationToken) return reader.GetProgrammes(channelId, startDateUtc, endDateUtc, cancellationToken)
@ -265,7 +270,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
{ {
// In theory this should never be called because there is always only one lineup // In theory this should never be called because there is always only one lineup
string path = await GetXml(info.Path, CancellationToken.None).ConfigureAwait(false); string path = await GetXml(info.Path, CancellationToken.None).ConfigureAwait(false);
_logger.LogDebug("Opening XmlTvReader for {path}", path); _logger.LogDebug("Opening XmlTvReader for {Path}", path);
var reader = new XmlTvReader(path, GetLanguage(info)); var reader = new XmlTvReader(path, GetLanguage(info));
IEnumerable<XmlTvChannel> results = reader.GetChannels(); IEnumerable<XmlTvChannel> results = reader.GetChannels();
@ -277,7 +282,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
{ {
// In theory this should never be called because there is always only one lineup // In theory this should never be called because there is always only one lineup
string path = await GetXml(info.Path, cancellationToken).ConfigureAwait(false); string path = await GetXml(info.Path, cancellationToken).ConfigureAwait(false);
_logger.LogDebug("Opening XmlTvReader for {path}", path); _logger.LogDebug("Opening XmlTvReader for {Path}", path);
var reader = new XmlTvReader(path, GetLanguage(info)); var reader = new XmlTvReader(path, GetLanguage(info));
var results = reader.GetChannels(); var results = reader.GetChannels();

View File

@ -91,8 +91,6 @@ namespace MediaBrowser.Common.Net
public bool EnableDefaultUserAgent { get; set; } public bool EnableDefaultUserAgent { get; set; }
public bool AppendCharsetToMimeType { get; set; }
private string GetHeaderValue(string name) private string GetHeaderValue(string name)
{ {
RequestHeaders.TryGetValue(name, out var value); RequestHeaders.TryGetValue(name, out var value);

View File

@ -52,14 +52,21 @@ namespace MediaBrowser.Common.Net
/// <value>The headers.</value> /// <value>The headers.</value>
public HttpResponseHeaders Headers { get; set; } public HttpResponseHeaders Headers { get; set; }
/// <summary>
/// Gets or sets the content headers.
/// </summary>
/// <value>The content headers.</value>
public HttpContentHeaders ContentHeaders { get; set; }
public HttpResponseInfo() public HttpResponseInfo()
{ {
} }
public HttpResponseInfo(HttpResponseHeaders headers) public HttpResponseInfo(HttpResponseHeaders headers, HttpContentHeaders contentHeader)
{ {
Headers = headers; Headers = headers;
ContentHeaders = contentHeader;
} }
public void Dispose() public void Dispose()

@ -1 +1 @@
Subproject commit c9e70d95643e84437189dd500b0380ec0fbbf659 Subproject commit 1d0fd79eb1e4d0bf6a9f62f769a951970383bcf0

View File

@ -57,10 +57,9 @@ namespace Mono.Nat.Upnp
req.Url = ss; req.Url = ss;
req.EnableKeepAlive = false; req.EnableKeepAlive = false;
req.RequestContentType = "text/xml"; req.RequestContentType = "text/xml";
req.AppendCharsetToMimeType = true;
req.RequestHeaders.Add("SOAPACTION", "\"" + device.ServiceType + "#" + upnpMethod + "\""); req.RequestHeaders.Add("SOAPACTION", "\"" + device.ServiceType + "#" + upnpMethod + "\"");
string bodyString = "<s:Envelope " req.RequestContent = "<s:Envelope "
+ "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " + "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
+ "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" + "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<s:Body>" + "<s:Body>"
@ -70,8 +69,6 @@ namespace Mono.Nat.Upnp
+ "</u:" + upnpMethod + ">" + "</u:" + upnpMethod + ">"
+ "</s:Body>" + "</s:Body>"
+ "</s:Envelope>\r\n\r\n"; + "</s:Envelope>\r\n\r\n";
req.RequestContentBytes = System.Text.Encoding.UTF8.GetBytes(bodyString);
return req; return req;
} }

View File

@ -1,4 +1,4 @@
using System.Reflection; using System.Reflection;
[assembly: AssemblyVersion("10.3.6")] [assembly: AssemblyVersion("10.3.7")]
[assembly: AssemblyFileVersion("10.3.6")] [assembly: AssemblyFileVersion("10.3.7")]

View File

@ -1,7 +1,7 @@
--- ---
# We just wrap `build` so this is really it # We just wrap `build` so this is really it
name: "jellyfin" name: "jellyfin"
version: "10.3.6" version: "10.3.7"
packages: packages:
- debian-package-x64 - debian-package-x64
- debian-package-armhf - debian-package-armhf

View File

@ -1,3 +1,9 @@
jellyfin (10.3.7-1) unstable; urgency=medium
* New upstream version 10.3.7; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.3.7
-- Jellyfin Packaging Team <packaging@jellyfin.org> Wed, 24 Jul 2019 10:48:28 -0400
jellyfin (10.3.6-1) unstable; urgency=medium jellyfin (10.3.6-1) unstable; urgency=medium
* New upstream version 10.3.6; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.3.6 * New upstream version 10.3.6; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.3.6

View File

@ -7,7 +7,7 @@
%endif %endif
Name: jellyfin Name: jellyfin
Version: 10.3.6 Version: 10.3.7
Release: 1%{?dist} Release: 1%{?dist}
Summary: The Free Software Media Browser Summary: The Free Software Media Browser
License: GPLv2 License: GPLv2
@ -140,6 +140,8 @@ fi
%systemd_postun_with_restart jellyfin.service %systemd_postun_with_restart jellyfin.service
%changelog %changelog
* Wed Jul 24 2019 Jellyfin Packaging Team <packaging@jellyfin.org>
- New upstream version 10.3.7; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.3.7
* Sat Jul 06 2019 Jellyfin Packaging Team <packaging@jellyfin.org> * Sat Jul 06 2019 Jellyfin Packaging Team <packaging@jellyfin.org>
- New upstream version 10.3.6; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.3.6 - New upstream version 10.3.6; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.3.6
* Sun Jun 09 2019 Jellyfin Packaging Team <packaging@jellyfin.org> * Sun Jun 09 2019 Jellyfin Packaging Team <packaging@jellyfin.org>