Pārlūkot izejas kodu

improve xmltv gz support

Luke Pulverenti 7 gadi atpakaļ
vecāks
revīzija
c4ceeae889

+ 18 - 0
Emby.Server.Implementations/Archiving/ZipClient.cs

@@ -89,6 +89,24 @@ namespace Emby.Server.Implementations.Archiving
             }
         }
 
+        public void ExtractFirstFileFromGz(Stream source, string targetPath, string defaultFileName)
+        {
+            using (var reader = GZipReader.Open(source))
+            {
+                if (reader.MoveToNextEntry())
+                {
+                    var entry = reader.Entry;
+
+                    var filename = entry.Key;
+                    if (string.IsNullOrWhiteSpace(filename))
+                    {
+                        filename = defaultFileName;
+                    }
+                    reader.WriteEntryToFile(Path.Combine(targetPath, filename));
+                }
+            }
+        }
+
         /// <summary>
         /// Extracts all from7z.
         /// </summary>

+ 53 - 17
Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs

@@ -105,31 +105,64 @@ namespace Emby.Server.Implementations.LiveTv.Listings
 
             if (string.Equals(ext, ".gz", StringComparison.OrdinalIgnoreCase))
             {
-                using (var stream = _fileSystem.OpenRead(file))
+                try
                 {
-                    var tempFolder = Path.Combine(_config.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString());
-                    _fileSystem.CreateDirectory(tempFolder);
-
-                    try
-                    {
-                        _zipClient.ExtractAllFromGz(stream, tempFolder, true);
-                    }
-                    catch
-                    {
-                        // If the extraction fails just return the original file, it could be a gz
-                        return file;
-                    }
+                    var tempFolder = ExtractGz(file);
+                    return FindXmlFile(tempFolder);
+                }
+                catch (Exception ex)
+                {
+                    //_logger.ErrorException("Error extracting from gz file {0}", ex, file);
+                }
 
-                    return _fileSystem.GetFiles(tempFolder, true)
-                        .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase))
-                        .Select(i => i.FullName)
-                        .FirstOrDefault();
+                try
+                {
+                    var tempFolder = ExtractFirstFileFromGz(file);
+                    return FindXmlFile(tempFolder);
+                }
+                catch (Exception ex)
+                {
+                    //_logger.ErrorException("Error extracting from zip file {0}", ex, file);
                 }
             }
 
             return file;
         }
 
+        private string ExtractFirstFileFromGz(string file)
+        {
+            using (var stream = _fileSystem.OpenRead(file))
+            {
+                var tempFolder = Path.Combine(_config.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString());
+                _fileSystem.CreateDirectory(tempFolder);
+
+                _zipClient.ExtractFirstFileFromGz(stream, tempFolder, "data.xml");
+
+                return tempFolder;
+            }
+        }
+
+        private string ExtractGz(string file)
+        {
+            using (var stream = _fileSystem.OpenRead(file))
+            {
+                var tempFolder = Path.Combine(_config.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString());
+                _fileSystem.CreateDirectory(tempFolder);
+
+                _zipClient.ExtractAllFromGz(stream, tempFolder, true);
+
+                return tempFolder;
+            }
+        }
+
+        private string FindXmlFile(string directory)
+        {
+            return _fileSystem.GetFiles(directory, true)
+                .Where(i => string.Equals(i.Extension, ".xml", StringComparison.OrdinalIgnoreCase))
+                .Select(i => i.FullName)
+                .FirstOrDefault();
+        }
+
         public async Task<IEnumerable<ProgramInfo>> GetProgramsAsync(ListingsProviderInfo info, string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
         {
             if (string.IsNullOrWhiteSpace(channelId))
@@ -149,6 +182,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             _logger.Debug("Getting xmltv programs for channel {0}", channelId);
 
             var path = await GetXml(info.Path, cancellationToken).ConfigureAwait(false);
+            _logger.Debug("Opening XmlTvReader for {0}", path);
             var reader = new XmlTvReader(path, GetLanguage(info));
 
             var results = reader.GetProgrammes(channelId, startDateUtc, endDateUtc, cancellationToken);
@@ -251,6 +285,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
         {
             // In theory this should never be called because there is always only one lineup
             var path = await GetXml(info.Path, CancellationToken.None).ConfigureAwait(false);
+            _logger.Debug("Opening XmlTvReader for {0}", path);
             var reader = new XmlTvReader(path, GetLanguage(info));
             var results = reader.GetChannels();
 
@@ -262,6 +297,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
         {
             // In theory this should never be called because there is always only one lineup
             var path = await GetXml(info.Path, cancellationToken).ConfigureAwait(false);
+            _logger.Debug("Opening XmlTvReader for {0}", path);
             var reader = new XmlTvReader(path, GetLanguage(info));
             var results = reader.GetChannels();
 

+ 1 - 0
MediaBrowser.Model/IO/IZipClient.cs

@@ -24,6 +24,7 @@ namespace MediaBrowser.Model.IO
         void ExtractAll(Stream source, string targetPath, bool overwriteExistingFiles);
 
         void ExtractAllFromGz(Stream source, string targetPath, bool overwriteExistingFiles);
+        void ExtractFirstFileFromGz(Stream source, string targetPath, string defaultFileName);
 
         /// <summary>
         /// Extracts all from zip.