Backport pull request #13694 from jellyfin/release-10.10.z

Clone fallback audio tags instead of use ATL.Track.set

Original-merge: 9eb2044eae50c69be4cb3830887bdd5da15ee920

Merged-by: Bond-009 <bond.009@outlook.com>

Backported-by: Bond_009 <bond.009@outlook.com>
This commit is contained in:
gnattu 2025-03-12 08:40:33 -04:00 committed by Bond_009
parent 28fc0e4796
commit 237e7bd44b

View File

@ -175,11 +175,15 @@ namespace MediaBrowser.Providers.MediaInfo
_logger.LogWarning("File {File} only has ID3v1 tags, some fields may be truncated", audio.Path); _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; // We should never use the property setter of the ATL.Track class.
track.Album = string.IsNullOrEmpty(track.Album) ? mediaInfo.Album : track.Album; // That setter is meant for its own tag parser and external editor usage and will have unwanted side effects
track.Year = track.Year is null or 0 ? mediaInfo.ProductionYear : track.Year; // For example, setting the Year property will also set the Date property, which is not what we want here.
track.TrackNumber = track.TrackNumber is null or 0 ? mediaInfo.IndexNumber : track.TrackNumber; // To properly handle fallback values, we make a clone of those fields when valid.
track.DiscNumber = track.DiscNumber is null or 0 ? mediaInfo.ParentIndexNumber : track.DiscNumber; var trackTitle = string.IsNullOrEmpty(track.Title) ? mediaInfo.Name : track.Title;
var trackAlbum = string.IsNullOrEmpty(track.Album) ? mediaInfo.Album : track.Album;
var trackYear = track.Year is null or 0 ? mediaInfo.ProductionYear : track.Year;
var trackTrackNumber = track.TrackNumber is null or 0 ? mediaInfo.IndexNumber : track.TrackNumber;
var trackDiscNumber = track.DiscNumber is null or 0 ? mediaInfo.ParentIndexNumber : track.DiscNumber;
if (audio.SupportsPeople && !audio.LockedFields.Contains(MetadataField.Cast)) if (audio.SupportsPeople && !audio.LockedFields.Contains(MetadataField.Cast))
{ {
@ -276,22 +280,22 @@ namespace MediaBrowser.Providers.MediaInfo
} }
} }
if (!audio.LockedFields.Contains(MetadataField.Name) && !string.IsNullOrEmpty(track.Title)) if (!audio.LockedFields.Contains(MetadataField.Name) && !string.IsNullOrEmpty(trackTitle))
{ {
audio.Name = track.Title; audio.Name = trackTitle;
} }
if (options.ReplaceAllMetadata) if (options.ReplaceAllMetadata)
{ {
audio.Album = track.Album; audio.Album = trackAlbum;
audio.IndexNumber = track.TrackNumber; audio.IndexNumber = trackTrackNumber;
audio.ParentIndexNumber = track.DiscNumber; audio.ParentIndexNumber = trackDiscNumber;
} }
else else
{ {
audio.Album ??= track.Album; audio.Album ??= trackAlbum;
audio.IndexNumber ??= track.TrackNumber; audio.IndexNumber ??= trackTrackNumber;
audio.ParentIndexNumber ??= track.DiscNumber; audio.ParentIndexNumber ??= trackDiscNumber;
} }
if (track.Date.HasValue) if (track.Date.HasValue)
@ -299,11 +303,12 @@ namespace MediaBrowser.Providers.MediaInfo
audio.PremiereDate = track.Date; audio.PremiereDate = track.Date;
} }
if (track.Year.HasValue) if (trackYear.HasValue)
{ {
var year = track.Year.Value; var year = trackYear.Value;
audio.ProductionYear = year; audio.ProductionYear = year;
// ATL library handles such fallback this with its own internal logic, but we also need to handle it here for the ffprobe fallbacks.
if (!audio.PremiereDate.HasValue) if (!audio.PremiereDate.HasValue)
{ {
try try
@ -312,7 +317,7 @@ namespace MediaBrowser.Providers.MediaInfo
} }
catch (ArgumentOutOfRangeException ex) catch (ArgumentOutOfRangeException ex)
{ {
_logger.LogError(ex, "Error parsing YEAR tag in {File}. '{TagValue}' is an invalid year", audio.Path, track.Year); _logger.LogError(ex, "Error parsing YEAR tag in {File}. '{TagValue}' is an invalid year", audio.Path, trackYear);
} }
} }
} }