| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | 
							- using System;
 
- using Emby.Naming.Common;
 
- namespace Emby.Naming.Video
 
- {
 
-     /// <summary>
 
-     /// Parse 3D format related flags.
 
-     /// </summary>
 
-     public static class Format3DParser
 
-     {
 
-         // Static default result to save on allocation costs.
 
-         private static readonly Format3DResult _defaultResult = new(false, null);
 
-         /// <summary>
 
-         /// Parse 3D format related flags.
 
-         /// </summary>
 
-         /// <param name="path">Path to file.</param>
 
-         /// <param name="namingOptions">The naming options.</param>
 
-         /// <returns>Returns <see cref="Format3DResult"/> object.</returns>
 
-         public static Format3DResult Parse(ReadOnlySpan<char> path, NamingOptions namingOptions)
 
-         {
 
-             int oldLen = namingOptions.VideoFlagDelimiters.Length;
 
-             Span<char> delimiters = stackalloc char[oldLen + 1];
 
-             namingOptions.VideoFlagDelimiters.AsSpan().CopyTo(delimiters);
 
-             delimiters[oldLen] = ' ';
 
-             return Parse(path, delimiters, namingOptions);
 
-         }
 
-         private static Format3DResult Parse(ReadOnlySpan<char> path, ReadOnlySpan<char> delimiters, NamingOptions namingOptions)
 
-         {
 
-             foreach (var rule in namingOptions.Format3DRules)
 
-             {
 
-                 var result = Parse(path, rule, delimiters);
 
-                 if (result.Is3D)
 
-                 {
 
-                     return result;
 
-                 }
 
-             }
 
-             return _defaultResult;
 
-         }
 
-         private static Format3DResult Parse(ReadOnlySpan<char> path, Format3DRule rule, ReadOnlySpan<char> delimiters)
 
-         {
 
-             bool is3D = false;
 
-             string? format3D = null;
 
-             // If there's no preceding token we just consider it found
 
-             var foundPrefix = string.IsNullOrEmpty(rule.PrecedingToken);
 
-             while (path.Length > 0)
 
-             {
 
-                 var index = path.IndexOfAny(delimiters);
 
-                 if (index == -1)
 
-                 {
 
-                     index = path.Length - 1;
 
-                 }
 
-                 var currentSlice = path[..index];
 
-                 path = path[(index + 1)..];
 
-                 if (!foundPrefix)
 
-                 {
 
-                     foundPrefix = currentSlice.Equals(rule.PrecedingToken, StringComparison.OrdinalIgnoreCase);
 
-                     continue;
 
-                 }
 
-                 is3D = foundPrefix && currentSlice.Equals(rule.Token, StringComparison.OrdinalIgnoreCase);
 
-                 if (is3D)
 
-                 {
 
-                     format3D = rule.Token;
 
-                     break;
 
-                 }
 
-             }
 
-             return is3D ? new Format3DResult(true, format3D) : _defaultResult;
 
-         }
 
-     }
 
- }
 
 
  |