aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
diff options
context:
space:
mode:
authorJPVenson <github@jpb.email>2024-10-08 09:34:34 +0000
committerJPVenson <github@jpb.email>2024-10-08 09:34:34 +0000
commitd3a3d9fce3b891eb0be274a0cdc45a989e557652 (patch)
treebd232ef477c259f1fafa204016f6efd4dcb8691f /MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
parentee1bdf4e222125ed7382165fd7e09599ca4bd4aa (diff)
parentaaf20592bb0bbdf4f0f0d99fed091758e68ae850 (diff)
Merge remote-tracking branch 'jellyfinorigin/master' into feature/EFUserData
Diffstat (limited to 'MediaBrowser.Providers/MediaInfo/AudioFileProber.cs')
-rw-r--r--MediaBrowser.Providers/MediaInfo/AudioFileProber.cs74
1 files changed, 68 insertions, 6 deletions
diff --git a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
index 7e0773b6d..27f6d120f 100644
--- a/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
+++ b/MediaBrowser.Providers/MediaInfo/AudioFileProber.cs
@@ -6,7 +6,6 @@ using System.Threading;
using System.Threading.Tasks;
using ATL;
using Jellyfin.Data.Enums;
-using Jellyfin.Extensions;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
@@ -17,6 +16,7 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.MediaInfo;
using Microsoft.Extensions.Logging;
@@ -28,6 +28,7 @@ namespace MediaBrowser.Providers.MediaInfo
public class AudioFileProber
{
private const char InternalValueSeparator = '\u001F';
+
private readonly IMediaEncoder _mediaEncoder;
private readonly IItemRepository _itemRepo;
private readonly ILibraryManager _libraryManager;
@@ -63,6 +64,8 @@ namespace MediaBrowser.Providers.MediaInfo
_lyricResolver = lyricResolver;
_lyricManager = lyricManager;
ATL.Settings.DisplayValueSeparator = InternalValueSeparator;
+ ATL.Settings.UseFileNameWhenNoTitle = false;
+ ATL.Settings.ID3v2_separatev2v3Values = false;
}
/// <summary>
@@ -158,14 +161,16 @@ namespace MediaBrowser.Providers.MediaInfo
/// <param name="tryExtractEmbeddedLyrics">Whether to extract embedded lyrics to lrc file. </param>
private async Task FetchDataFromTags(Audio audio, Model.MediaInfo.MediaInfo mediaInfo, MetadataRefreshOptions options, bool tryExtractEmbeddedLyrics)
{
+ var libraryOptions = _libraryManager.GetLibraryOptions(audio);
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)))
+ if (track.MetadataFormats
+ .All(mf => string.Equals(mf.ShortName, "ID3v1", StringComparison.OrdinalIgnoreCase)))
{
- track.Title = mediaInfo.Name;
+ _logger.LogWarning("File {File} only has ID3v1 tags, some fields may be truncated", audio.Path);
}
+ track.Title = string.IsNullOrEmpty(track.Title) ? mediaInfo.Name : track.Title;
track.Album = string.IsNullOrEmpty(track.Album) ? mediaInfo.Album : track.Album;
track.Year ??= mediaInfo.ProductionYear;
track.TrackNumber ??= mediaInfo.IndexNumber;
@@ -175,6 +180,12 @@ namespace MediaBrowser.Providers.MediaInfo
{
var people = new List<PersonInfo>();
var albumArtists = string.IsNullOrEmpty(track.AlbumArtist) ? mediaInfo.AlbumArtists : track.AlbumArtist.Split(InternalValueSeparator);
+
+ if (libraryOptions.UseCustomTagDelimiters)
+ {
+ albumArtists = albumArtists.SelectMany(a => SplitWithCustomDelimiter(a, libraryOptions.GetCustomTagDelimiters(), libraryOptions.DelimiterWhitelist)).ToArray();
+ }
+
foreach (var albumArtist in albumArtists)
{
if (!string.IsNullOrEmpty(albumArtist))
@@ -187,7 +198,26 @@ namespace MediaBrowser.Providers.MediaInfo
}
}
- var performers = string.IsNullOrEmpty(track.Artist) ? mediaInfo.Artists : track.Artist.Split(InternalValueSeparator);
+ string[]? performers = null;
+ if (libraryOptions.PreferNonstandardArtistsTag)
+ {
+ track.AdditionalFields.TryGetValue("ARTISTS", out var artistsTagString);
+ if (artistsTagString is not null)
+ {
+ performers = artistsTagString.Split(InternalValueSeparator);
+ }
+ }
+
+ if (performers is null || performers.Length == 0)
+ {
+ performers = string.IsNullOrEmpty(track.Artist) ? mediaInfo.Artists : track.Artist.Split(InternalValueSeparator);
+ }
+
+ if (libraryOptions.UseCustomTagDelimiters)
+ {
+ performers = performers.SelectMany(p => SplitWithCustomDelimiter(p, libraryOptions.GetCustomTagDelimiters(), libraryOptions.DelimiterWhitelist)).ToArray();
+ }
+
foreach (var performer in performers)
{
if (!string.IsNullOrEmpty(performer))
@@ -285,7 +315,13 @@ namespace MediaBrowser.Providers.MediaInfo
if (!audio.LockedFields.Contains(MetadataField.Genres))
{
var genres = string.IsNullOrEmpty(track.Genre) ? mediaInfo.Genres : track.Genre.Split(InternalValueSeparator).Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
- audio.Genres = options.ReplaceAllMetadata || audio.Genres == null || audio.Genres.Length == 0
+
+ if (libraryOptions.UseCustomTagDelimiters)
+ {
+ genres = genres.SelectMany(g => SplitWithCustomDelimiter(g, libraryOptions.GetCustomTagDelimiters(), libraryOptions.DelimiterWhitelist)).ToArray();
+ }
+
+ audio.Genres = options.ReplaceAllMetadata || audio.Genres is null || audio.Genres.Length == 0
? genres
: audio.Genres;
}
@@ -379,5 +415,31 @@ namespace MediaBrowser.Providers.MediaInfo
currentStreams.Add(externalLyricFiles[0]);
}
}
+
+ private List<string> SplitWithCustomDelimiter(string val, char[] tagDelimiters, string[] whitelist)
+ {
+ var items = new List<string>();
+ var temp = val;
+ foreach (var whitelistItem in whitelist)
+ {
+ if (string.IsNullOrWhiteSpace(whitelistItem))
+ {
+ continue;
+ }
+
+ var originalTemp = temp;
+ temp = temp.Replace(whitelistItem, string.Empty, StringComparison.OrdinalIgnoreCase);
+
+ if (!string.Equals(temp, originalTemp, StringComparison.OrdinalIgnoreCase))
+ {
+ items.Add(whitelistItem);
+ }
+ }
+
+ var items2 = temp.Split(tagDelimiters, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).DistinctNames();
+ items.AddRange(items2);
+
+ return items;
+ }
}
}