|
@@ -2,14 +2,15 @@ using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Globalization;
|
|
|
using System.IO;
|
|
|
+using System.IO.Compression;
|
|
|
using System.Linq;
|
|
|
+using System.Net.Http;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using Emby.XmlTv.Classes;
|
|
|
using Emby.XmlTv.Entities;
|
|
|
using MediaBrowser.Common.Extensions;
|
|
|
using MediaBrowser.Common.Net;
|
|
|
-using MediaBrowser.Common.Progress;
|
|
|
using MediaBrowser.Controller.Configuration;
|
|
|
using MediaBrowser.Controller.LiveTv;
|
|
|
using MediaBrowser.Model.Dto;
|
|
@@ -27,7 +28,12 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
|
|
private readonly IFileSystem _fileSystem;
|
|
|
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;
|
|
|
_httpClient = httpClient;
|
|
@@ -52,7 +58,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
|
|
|
|
|
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))
|
|
|
{
|
|
@@ -66,24 +72,33 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
|
|
return UnzipIfNeeded(path, cacheFile);
|
|
|
}
|
|
|
|
|
|
- _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);
|
|
|
+ _logger.LogInformation("Downloading xmltv listings from {Path}", path);
|
|
|
|
|
|
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);
|
|
|
}
|
|
@@ -101,7 +116,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- _logger.LogError(ex, "Error extracting from gz file {file}", file);
|
|
|
+ _logger.LogError(ex, "Error extracting from gz file {File}", file);
|
|
|
}
|
|
|
|
|
|
try
|
|
@@ -111,7 +126,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
|
|
}
|
|
|
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));
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- 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);
|
|
|
+ _logger.LogDebug("Getting xmltv programs for channel {Id}", channelId);
|
|
|
|
|
|
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));
|
|
|
|
|
|
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
|
|
|
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));
|
|
|
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
|
|
|
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 results = reader.GetChannels();
|
|
|
|