Try to fix XmlTvListingsProvider

This commit is contained in:
Bond_009 2019-07-08 14:50:15 +02:00 committed by Joshua M. Boniface
parent 4f17ed961e
commit b294b802a8
3 changed files with 47 additions and 34 deletions

View File

@ -336,7 +336,7 @@ namespace Emby.Server.Implementations.HttpClientManager
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,
@ -358,7 +358,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,
@ -428,7 +428,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,7 +2,9 @@ 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;
@ -52,7 +54,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 +68,38 @@ 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,
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"
},
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);
} }
@ -159,20 +175,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 +271,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 +283,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

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