Browse Source

Workaround ATL tag parsing (#12705)

gnattu 8 months ago
parent
commit
992d56e565
1 changed files with 23 additions and 10 deletions
  1. 23 10
      MediaBrowser.Providers/MediaInfo/AudioFileProber.cs

+ 23 - 10
MediaBrowser.Providers/MediaInfo/AudioFileProber.cs

@@ -28,6 +28,8 @@ namespace MediaBrowser.Providers.MediaInfo
     public class AudioFileProber
     public class AudioFileProber
     {
     {
         private const char InternalValueSeparator = '\u001F';
         private const char InternalValueSeparator = '\u001F';
+        private const char AtlId3V22Separator = '/';
+
         private readonly IMediaEncoder _mediaEncoder;
         private readonly IMediaEncoder _mediaEncoder;
         private readonly IItemRepository _itemRepo;
         private readonly IItemRepository _itemRepo;
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
@@ -63,6 +65,7 @@ namespace MediaBrowser.Providers.MediaInfo
             _lyricResolver = lyricResolver;
             _lyricResolver = lyricResolver;
             _lyricManager = lyricManager;
             _lyricManager = lyricManager;
             ATL.Settings.DisplayValueSeparator = InternalValueSeparator;
             ATL.Settings.DisplayValueSeparator = InternalValueSeparator;
+            ATL.Settings.UseFileNameWhenNoTitle = false;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -161,12 +164,12 @@ namespace MediaBrowser.Providers.MediaInfo
             var libraryOptions = _libraryManager.GetLibraryOptions(audio);
             var libraryOptions = _libraryManager.GetLibraryOptions(audio);
             Track track = new Track(audio.Path);
             Track track = new Track(audio.Path);
 
 
-            // ATL will fall back to filename as title when it does not understand the metadata
-            if (track.MetadataFormats.All(mf => mf.Equals(ATL.Factory.UNKNOWN_FORMAT)))
-            {
-                track.Title = mediaInfo.Name;
-            }
+            // Current version of ATL split some ID3v2.2/2.3 tags by '/' which is not desired.
+            var shouldWorkaroundAtlId3V22Split = track.MetadataFormats
+                .Where(mf => string.Equals(mf.ShortName, "ID3v2", StringComparison.OrdinalIgnoreCase))
+                .All(mf => !string.Equals(mf.Name, "ID3v2.4", StringComparison.OrdinalIgnoreCase));
 
 
+            track.Title = string.IsNullOrEmpty(track.Title) ? mediaInfo.Name : track.Title;
             track.Album = string.IsNullOrEmpty(track.Album) ? mediaInfo.Album : track.Album;
             track.Album = string.IsNullOrEmpty(track.Album) ? mediaInfo.Album : track.Album;
             track.Year ??= mediaInfo.ProductionYear;
             track.Year ??= mediaInfo.ProductionYear;
             track.TrackNumber ??= mediaInfo.IndexNumber;
             track.TrackNumber ??= mediaInfo.IndexNumber;
@@ -175,7 +178,7 @@ namespace MediaBrowser.Providers.MediaInfo
             if (audio.SupportsPeople && !audio.LockedFields.Contains(MetadataField.Cast))
             if (audio.SupportsPeople && !audio.LockedFields.Contains(MetadataField.Cast))
             {
             {
                 var people = new List<PersonInfo>();
                 var people = new List<PersonInfo>();
-                var albumArtists = string.IsNullOrEmpty(track.AlbumArtist) ? mediaInfo.AlbumArtists : track.AlbumArtist.Split(InternalValueSeparator);
+                var albumArtists = string.IsNullOrEmpty(track.AlbumArtist) ? mediaInfo.AlbumArtists : SplitWithWorkaround(track.AlbumArtist, InternalValueSeparator, shouldWorkaroundAtlId3V22Split);
 
 
                 if (libraryOptions.UseCustomTagDelimiters)
                 if (libraryOptions.UseCustomTagDelimiters)
                 {
                 {
@@ -200,13 +203,13 @@ namespace MediaBrowser.Providers.MediaInfo
                     track.AdditionalFields.TryGetValue("ARTISTS", out var artistsTagString);
                     track.AdditionalFields.TryGetValue("ARTISTS", out var artistsTagString);
                     if (artistsTagString is not null)
                     if (artistsTagString is not null)
                     {
                     {
-                        performers = artistsTagString.Split(InternalValueSeparator);
+                        performers = SplitWithWorkaround(artistsTagString, InternalValueSeparator, shouldWorkaroundAtlId3V22Split);
                     }
                     }
                 }
                 }
 
 
                 if (performers is null || performers.Length == 0)
                 if (performers is null || performers.Length == 0)
                 {
                 {
-                    performers = string.IsNullOrEmpty(track.Artist) ? mediaInfo.Artists : track.Artist.Split(InternalValueSeparator);
+                    performers = string.IsNullOrEmpty(track.Artist) ? mediaInfo.Artists : SplitWithWorkaround(track.Artist, InternalValueSeparator, shouldWorkaroundAtlId3V22Split);
                 }
                 }
 
 
                 if (libraryOptions.UseCustomTagDelimiters)
                 if (libraryOptions.UseCustomTagDelimiters)
@@ -226,7 +229,7 @@ namespace MediaBrowser.Providers.MediaInfo
                     }
                     }
                 }
                 }
 
 
-                foreach (var composer in track.Composer.Split(InternalValueSeparator))
+                foreach (var composer in SplitWithWorkaround(track.Composer, InternalValueSeparator, shouldWorkaroundAtlId3V22Split))
                 {
                 {
                     if (!string.IsNullOrEmpty(composer))
                     if (!string.IsNullOrEmpty(composer))
                     {
                     {
@@ -310,7 +313,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
 
             if (!audio.LockedFields.Contains(MetadataField.Genres))
             if (!audio.LockedFields.Contains(MetadataField.Genres))
             {
             {
-                var genres = string.IsNullOrEmpty(track.Genre) ? mediaInfo.Genres : track.Genre.Split(InternalValueSeparator).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
+                var genres = string.IsNullOrEmpty(track.Genre) ? mediaInfo.Genres : SplitWithWorkaround(track.Genre, InternalValueSeparator, shouldWorkaroundAtlId3V22Split).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
 
 
                 if (libraryOptions.UseCustomTagDelimiters)
                 if (libraryOptions.UseCustomTagDelimiters)
                 {
                 {
@@ -437,5 +440,15 @@ namespace MediaBrowser.Providers.MediaInfo
 
 
             return items;
             return items;
         }
         }
+
+        private static string[] SplitWithWorkaround(string val, char separator, bool useWorkaround)
+        {
+            if (useWorkaround)
+            {
+                val = val.Replace(InternalValueSeparator, AtlId3V22Separator);
+            }
+
+            return val.Split(separator);
+        }
     }
     }
 }
 }