@ -170,11 +170,15 @@ namespace MediaBrowser.Providers.MediaInfo
_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 = track . Year is null or 0 ? mediaInfo . ProductionYear : track . Year ;
track . TrackNumber = track . TrackNumber is null or 0 ? mediaInfo . IndexNumber : track . TrackNumber ;
track . DiscNumber = track . DiscNumber is null or 0 ? mediaInfo . ParentIndexNumber : track . DiscNumber ;
// We should never use the property setter of the ATL.Track class.
// That setter is meant for its own tag parser and external editor usage and will have unwanted side effects
// For example, setting the Year property will also set the Date property, which is not what we want here.
// To properly handle fallback values, we make a clone of those fields when valid.
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 ) )
{
@ -271,22 +275,22 @@ namespace MediaBrowser.Providers.MediaInfo
}
}
if ( ! audio . LockedFields . Contains ( MetadataField . Name ) & & ! string . IsNullOrEmpty ( track . Title) )
if ( ! audio . LockedFields . Contains ( MetadataField . Name ) & & ! string . IsNullOrEmpty ( track Title) )
{
audio . Name = track . Title;
audio . Name = track Title;
}
if ( options . ReplaceAllMetadata )
{
audio . Album = track . Album;
audio . IndexNumber = track . TrackNumber;
audio . ParentIndexNumber = track . DiscNumber;
audio . Album = track Album;
audio . IndexNumber = track TrackNumber;
audio . ParentIndexNumber = track DiscNumber;
}
else
{
audio . Album ? ? = track . Album;
audio . IndexNumber ? ? = track . TrackNumber;
audio . ParentIndexNumber ? ? = track . DiscNumber;
audio . Album ? ? = track Album;
audio . IndexNumber ? ? = track TrackNumber;
audio . ParentIndexNumber ? ? = track DiscNumber;
}
if ( track . Date . HasValue )
@ -294,11 +298,12 @@ namespace MediaBrowser.Providers.MediaInfo
audio . PremiereDate = track . Date ;
}
if ( track . Year. HasValue )
if ( track Year. HasValue )
{
var year = track . Year. Value ;
var year = track Year. Value ;
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 )
{
try
@ -307,7 +312,7 @@ namespace MediaBrowser.Providers.MediaInfo
}
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 , track Year) ;
}
}
}