Browse Source

Merge pull request #4986 from Bond-009/readalllines

Use new ReadAllLines extensions
Bond-009 4 years ago
parent
commit
4b31c007e3

+ 3 - 4
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -10,6 +10,7 @@ using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Json;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
@@ -307,13 +308,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
             {
                 using (var reader = new StreamReader(source))
                 {
-                    while (!reader.EndOfStream)
+                    await foreach (var line in reader.ReadAllLinesAsync().ConfigureAwait(false))
                     {
-                        var line = await reader.ReadLineAsync().ConfigureAwait(false);
-
                         var bytes = Encoding.UTF8.GetBytes(Environment.NewLine + line);
 
-                        await target.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
+                        await target.WriteAsync(bytes.AsMemory()).ConfigureAwait(false);
                         await target.FlushAsync().ConfigureAwait(false);
                     }
                 }

+ 7 - 7
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs

@@ -182,16 +182,16 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
             await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
             using var sr = new StreamReader(stream, System.Text.Encoding.UTF8);
             var tuners = new List<LiveTvTunerInfo>();
-            while (!sr.EndOfStream)
+            await foreach (var line in sr.ReadAllLinesAsync().ConfigureAwait(false))
             {
-                string line = StripXML(sr.ReadLine());
-                if (line.Contains("Channel", StringComparison.Ordinal))
+                string stripedLine = StripXML(line);
+                if (stripedLine.Contains("Channel", StringComparison.Ordinal))
                 {
                     LiveTvTunerStatus status;
-                    var index = line.IndexOf("Channel", StringComparison.OrdinalIgnoreCase);
-                    var name = line.Substring(0, index - 1);
-                    var currentChannel = line.Substring(index + 7);
-                    if (currentChannel != "none")
+                    var index = stripedLine.IndexOf("Channel", StringComparison.OrdinalIgnoreCase);
+                    var name = stripedLine.Substring(0, index - 1);
+                    var currentChannel = stripedLine.Substring(index + 7);
+                    if (string.Equals(currentChannel, "none", StringComparison.Ordinal))
                     {
                         status = LiveTvTunerStatus.LiveTv;
                     }

+ 12 - 22
Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs

@@ -35,16 +35,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
             // Read the file and display it line by line.
             using (var reader = new StreamReader(await GetListingsStream(info, cancellationToken).ConfigureAwait(false)))
             {
-                return GetChannels(reader, channelIdPrefix, info.Id);
-            }
-        }
-
-        public List<ChannelInfo> ParseString(string text, string channelIdPrefix, string tunerHostId)
-        {
-            // Read the file and display it line by line.
-            using (var reader = new StringReader(text))
-            {
-                return GetChannels(reader, channelIdPrefix, tunerHostId);
+                return await GetChannelsAsync(reader, channelIdPrefix, info.Id).ConfigureAwait(false);
             }
         }
 
@@ -70,43 +61,42 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
 
         private const string ExtInfPrefix = "#EXTINF:";
 
-        private List<ChannelInfo> GetChannels(TextReader reader, string channelIdPrefix, string tunerHostId)
+        private async Task<List<ChannelInfo>> GetChannelsAsync(TextReader reader, string channelIdPrefix, string tunerHostId)
         {
             var channels = new List<ChannelInfo>();
-            string line;
             string extInf = string.Empty;
 
-            while ((line = reader.ReadLine()) != null)
+            await foreach (var line in reader.ReadAllLinesAsync().ConfigureAwait(false))
             {
-                line = line.Trim();
-                if (string.IsNullOrWhiteSpace(line))
+                var trimmedLine = line.Trim();
+                if (string.IsNullOrWhiteSpace(trimmedLine))
                 {
                     continue;
                 }
 
-                if (line.StartsWith("#EXTM3U", StringComparison.OrdinalIgnoreCase))
+                if (trimmedLine.StartsWith("#EXTM3U", StringComparison.OrdinalIgnoreCase))
                 {
                     continue;
                 }
 
-                if (line.StartsWith(ExtInfPrefix, StringComparison.OrdinalIgnoreCase))
+                if (trimmedLine.StartsWith(ExtInfPrefix, StringComparison.OrdinalIgnoreCase))
                 {
-                    extInf = line.Substring(ExtInfPrefix.Length).Trim();
+                    extInf = trimmedLine.Substring(ExtInfPrefix.Length).Trim();
                     _logger.LogInformation("Found m3u channel: {0}", extInf);
                 }
-                else if (!string.IsNullOrWhiteSpace(extInf) && !line.StartsWith('#'))
+                else if (!string.IsNullOrWhiteSpace(extInf) && !trimmedLine.StartsWith('#'))
                 {
-                    var channel = GetChannelnfo(extInf, tunerHostId, line);
+                    var channel = GetChannelnfo(extInf, tunerHostId, trimmedLine);
                     if (string.IsNullOrWhiteSpace(channel.Id))
                     {
-                        channel.Id = channelIdPrefix + line.GetMD5().ToString("N", CultureInfo.InvariantCulture);
+                        channel.Id = channelIdPrefix + trimmedLine.GetMD5().ToString("N", CultureInfo.InvariantCulture);
                     }
                     else
                     {
                         channel.Id = channelIdPrefix + channel.Id.GetMD5().ToString("N", CultureInfo.InvariantCulture);
                     }
 
-                    channel.Path = line;
+                    channel.Path = trimmedLine;
                     channels.Add(channel);
                     extInf = string.Empty;
                 }

+ 4 - 6
Emby.Server.Implementations/Localization/LocalizationManager.cs

@@ -7,6 +7,7 @@ using System.Linq;
 using System.Reflection;
 using System.Text.Json;
 using System.Threading.Tasks;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Json;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Model.Entities;
@@ -72,8 +73,7 @@ namespace Emby.Server.Implementations.Localization
                 using (var str = _assembly.GetManifestResourceStream(resource))
                 using (var reader = new StreamReader(str))
                 {
-                    string line;
-                    while ((line = await reader.ReadLineAsync().ConfigureAwait(false)) != null)
+                    await foreach (var line in reader.ReadAllLinesAsync().ConfigureAwait(false))
                     {
                         if (string.IsNullOrWhiteSpace(line))
                         {
@@ -118,10 +118,8 @@ namespace Emby.Server.Implementations.Localization
             using (var stream = _assembly.GetManifestResourceStream(ResourcePath))
             using (var reader = new StreamReader(stream))
             {
-                while (!reader.EndOfStream)
+                await foreach (var line in reader.ReadAllLinesAsync().ConfigureAwait(false))
                 {
-                    var line = await reader.ReadLineAsync().ConfigureAwait(false);
-
                     if (string.IsNullOrWhiteSpace(line))
                     {
                         continue;
@@ -179,7 +177,7 @@ namespace Emby.Server.Implementations.Localization
         /// <inheritdoc />
         public IEnumerable<CountryInfo> GetCountries()
         {
-            StreamReader reader = new StreamReader(_assembly.GetManifestResourceStream("Emby.Server.Implementations.Localization.countries.json"));
+            using StreamReader reader = new StreamReader(_assembly.GetManifestResourceStream("Emby.Server.Implementations.Localization.countries.json"));
 
             return JsonSerializer.Deserialize<IEnumerable<CountryInfo>>(reader.ReadToEnd(), _jsonOptions);
         }

+ 1 - 4
Jellyfin.Api/Helpers/HlsHelpers.cs

@@ -118,10 +118,7 @@ namespace Jellyfin.Api.Helpers
         /// <returns>The playlist text as a string.</returns>
         public static string GetLivePlaylistText(string path, StreamState state)
         {
-            using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
-            using var reader = new StreamReader(stream);
-
-            var text = reader.ReadToEnd();
+            var text = File.ReadAllText(path);
 
             var segmentFormat = EncodingHelper.GetSegmentFileExtension(state.Request.SegmentContainer).TrimStart('.');
             if (string.Equals(segmentFormat, "mp4", StringComparison.OrdinalIgnoreCase))

+ 17 - 3
MediaBrowser.Common/Extensions/StreamExtensions.cs

@@ -35,11 +35,11 @@ namespace MediaBrowser.Common.Extensions
         }
 
         /// <summary>
-        /// Reads all lines in the <see cref="StreamReader" />.
+        /// Reads all lines in the <see cref="TextReader" />.
         /// </summary>
-        /// <param name="reader">The <see cref="StreamReader" /> to read from.</param>
+        /// <param name="reader">The <see cref="TextReader" /> to read from.</param>
         /// <returns>All lines in the stream.</returns>
-        public static IEnumerable<string> ReadAllLines(this StreamReader reader)
+        public static IEnumerable<string> ReadAllLines(this TextReader reader)
         {
             string? line;
             while ((line = reader.ReadLine()) != null)
@@ -47,5 +47,19 @@ namespace MediaBrowser.Common.Extensions
                 yield return line;
             }
         }
+
+        /// <summary>
+        /// Reads all lines in the <see cref="TextReader" />.
+        /// </summary>
+        /// <param name="reader">The <see cref="TextReader" /> to read from.</param>
+        /// <returns>All lines in the stream.</returns>
+        public static async IAsyncEnumerable<string> ReadAllLinesAsync(this TextReader reader)
+        {
+            string? line;
+            while ((line = await reader.ReadLineAsync().ConfigureAwait(false)) != null)
+            {
+                yield return line;
+            }
+        }
     }
 }

+ 4 - 5
MediaBrowser.Providers/Studios/StudiosImageProvider.cs

@@ -8,6 +8,7 @@ using System.Linq;
 using System.Net.Http;
 using System.Threading;
 using System.Threading.Tasks;
+using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
@@ -177,13 +178,11 @@ namespace MediaBrowser.Providers.Studios
                 {
                     var lines = new List<string>();
 
-                    while (!reader.EndOfStream)
+                    foreach (var line in reader.ReadAllLines())
                     {
-                        var text = reader.ReadLine();
-
-                        if (!string.IsNullOrWhiteSpace(text))
+                        if (!string.IsNullOrWhiteSpace(line))
                         {
-                            lines.Add(text);
+                            lines.Add(line);
                         }
                     }