Fixed: Ensure Quality is always initialised in AudioTag.Read (#694)

* Fixed: Ensure Quality is always initialised in AudioTag.Read

* Fixed: Log quality message on fallback quality detection
pull/6/head
ta264 6 years ago committed by GitHub
parent f50b60103c
commit b557f620d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -54,7 +54,7 @@ namespace NzbDrone.Core.MediaFiles
{ {
IsValid = true; IsValid = true;
} }
public AudioTag(string path) public AudioTag(string path)
{ {
Read(path); Read(path);
@ -90,7 +90,7 @@ namespace NzbDrone.Core.MediaFiles
MusicBrainzReleaseArtistId = tag.MusicBrainzReleaseArtistId; MusicBrainzReleaseArtistId = tag.MusicBrainzReleaseArtistId;
MusicBrainzReleaseGroupId = tag.MusicBrainzReleaseGroupId; MusicBrainzReleaseGroupId = tag.MusicBrainzReleaseGroupId;
MusicBrainzTrackId = tag.MusicBrainzTrackId; MusicBrainzTrackId = tag.MusicBrainzTrackId;
DateTime tempDate; DateTime tempDate;
// Do the ones that aren't handled by the generic taglib implementation // Do the ones that aren't handled by the generic taglib implementation
@ -155,7 +155,7 @@ namespace NzbDrone.Core.MediaFiles
MusicBrainzAlbumComment = appletag.GetDashBox("com.apple.iTunes", "MusicBrainz Album Comment"); MusicBrainzAlbumComment = appletag.GetDashBox("com.apple.iTunes", "MusicBrainz Album Comment");
MusicBrainzReleaseTrackId = appletag.GetDashBox("com.apple.iTunes", "MusicBrainz Release Track Id"); MusicBrainzReleaseTrackId = appletag.GetDashBox("com.apple.iTunes", "MusicBrainz Release Track Id");
} }
OriginalYear = OriginalReleaseDate.HasValue ? (uint)OriginalReleaseDate?.Year : 0; OriginalYear = OriginalReleaseDate.HasValue ? (uint)OriginalReleaseDate?.Year : 0;
foreach (ICodec codec in file.Properties.Codecs) foreach (ICodec codec in file.Properties.Codecs)
@ -170,7 +170,7 @@ namespace NzbDrone.Core.MediaFiles
// Taglib can't read bitrate for Opus. // Taglib can't read bitrate for Opus.
bitrate = EstimateBitrate(file, path); bitrate = EstimateBitrate(file, path);
} }
Logger.Debug("Audio Properties: " + acodec.Description + ", Bitrate: " + bitrate + ", Sample Size: " + Logger.Debug("Audio Properties: " + acodec.Description + ", Bitrate: " + bitrate + ", Sample Size: " +
file.Properties.BitsPerSample + ", SampleRate: " + acodec.AudioSampleRate + ", Channels: " + acodec.AudioChannels); file.Properties.BitsPerSample + ", SampleRate: " + acodec.AudioSampleRate + ", Channels: " + acodec.AudioChannels);
@ -200,16 +200,20 @@ namespace NzbDrone.Core.MediaFiles
// Log as error so it goes to sentry with correct fingerprint // Log as error so it goes to sentry with correct fingerprint
Logger.Error(ex, "Tag reading failed for {0}", path); Logger.Error(ex, "Tag reading failed for {0}", path);
} }
// make sure these are initialized to avoid errors later on
Quality = QualityParser.ParseQuality(path, null, EstimateBitrate(file, path));
Logger.Debug($"Quality parsed: {Quality}, Source: {Quality.QualityDetectionSource}");
MediaInfo = new MediaInfoModel();
} }
finally finally
{ {
file?.Dispose(); file?.Dispose();
} }
// make sure these are initialized to avoid errors later on
if (Quality == null)
{
Quality = QualityParser.ParseQuality(path, null, EstimateBitrate(file, path));
Logger.Debug($"Unable to parse qulity from tag, Quality parsed from file path: {Quality}, Source: {Quality.QualityDetectionSource}");
}
MediaInfo = MediaInfo ?? new MediaInfoModel();
} }
private int EstimateBitrate(TagLib.File file, string path) private int EstimateBitrate(TagLib.File file, string path)
@ -227,14 +231,14 @@ namespace NzbDrone.Core.MediaFiles
catch catch
{ {
} }
return bitrate; return bitrate;
} }
private DateTime? ReadId3Date(TagLib.Id3v2.Tag tag, string dateTag) private DateTime? ReadId3Date(TagLib.Id3v2.Tag tag, string dateTag)
{ {
string date = tag.GetTextAsString(dateTag); string date = tag.GetTextAsString(dateTag);
if (tag.Version == 4) if (tag.Version == 4)
{ {
// the unabused TDRC/TDOR tags // the unabused TDRC/TDOR tags
@ -251,7 +255,7 @@ namespace NzbDrone.Core.MediaFiles
return Int32.TryParse(date, out int year) ? new DateTime(year, 1, 1) : default(DateTime?); return Int32.TryParse(date, out int year) ? new DateTime(year, 1, 1) : default(DateTime?);
} }
} }
private void RemoveId3UserTextFrame(TagLib.Id3v2.Tag tag, string ident) private void RemoveId3UserTextFrame(TagLib.Id3v2.Tag tag, string ident)
{ {
var frame = UserTextInformationFrame.Get(tag, ident, false); var frame = UserTextInformationFrame.Get(tag, ident, false);
@ -261,7 +265,7 @@ namespace NzbDrone.Core.MediaFiles
} }
tag.RemoveFrames(ident); tag.RemoveFrames(ident);
} }
private void WriteId3Date(TagLib.Id3v2.Tag tag, string v4field, string v3yyyy, string v3ddmm, DateTime? date) private void WriteId3Date(TagLib.Id3v2.Tag tag, string v4field, string v3yyyy, string v3ddmm, DateTime? date)
{ {
if (date.HasValue) if (date.HasValue)
@ -286,11 +290,11 @@ namespace NzbDrone.Core.MediaFiles
} }
} }
} }
private void WriteId3Tag(TagLib.Id3v2.Tag tag, string id, string value) private void WriteId3Tag(TagLib.Id3v2.Tag tag, string id, string value)
{ {
var frame = UserTextInformationFrame.Get(tag, id, true); var frame = UserTextInformationFrame.Get(tag, id, true);
if (value.IsNotNullOrWhiteSpace()) if (value.IsNotNullOrWhiteSpace())
{ {
frame.Text = value.Split(';'); frame.Text = value.Split(';');
@ -300,7 +304,7 @@ namespace NzbDrone.Core.MediaFiles
tag.RemoveFrame(frame); tag.RemoveFrame(frame);
} }
} }
private static ReadOnlyByteVector FixAppleId(ByteVector id) private static ReadOnlyByteVector FixAppleId(ByteVector id)
{ {
if (id.Count == 4) { if (id.Count == 4) {
@ -325,7 +329,7 @@ namespace NzbDrone.Core.MediaFiles
// WMA with null performers/albumartists // WMA with null performers/albumartists
Performers = Performers ?? new string[0]; Performers = Performers ?? new string[0];
AlbumArtists = AlbumArtists ?? new string[0]; AlbumArtists = AlbumArtists ?? new string[0];
TagLib.File file = null; TagLib.File file = null;
try try
{ {
@ -369,7 +373,7 @@ namespace NzbDrone.Core.MediaFiles
tag.Track = 0; tag.Track = 0;
var flactag = (TagLib.Ogg.XiphComment) file.GetTag(TagLib.TagTypes.Xiph); var flactag = (TagLib.Ogg.XiphComment) file.GetTag(TagLib.TagTypes.Xiph);
if (Date.HasValue) if (Date.HasValue)
{ {
flactag.SetField("DATE", Date.Value.ToString("yyyy-MM-dd")); flactag.SetField("DATE", Date.Value.ToString("yyyy-MM-dd"));
@ -396,7 +400,7 @@ namespace NzbDrone.Core.MediaFiles
else if (file.TagTypes.HasFlag(TagTypes.Ape)) else if (file.TagTypes.HasFlag(TagTypes.Ape))
{ {
var apetag = (TagLib.Ape.Tag) file.GetTag(TagTypes.Ape); var apetag = (TagLib.Ape.Tag) file.GetTag(TagTypes.Ape);
if (Date.HasValue) if (Date.HasValue)
{ {
apetag.SetValue("Year", Date.Value.ToString("yyyy-MM-dd")); apetag.SetValue("Year", Date.Value.ToString("yyyy-MM-dd"));
@ -406,7 +410,7 @@ namespace NzbDrone.Core.MediaFiles
apetag.SetValue("Original Date", OriginalReleaseDate.Value.ToString("yyyy-MM-dd")); apetag.SetValue("Original Date", OriginalReleaseDate.Value.ToString("yyyy-MM-dd"));
apetag.SetValue("Original Year", OriginalReleaseDate.Value.Year.ToString()); apetag.SetValue("Original Year", OriginalReleaseDate.Value.Year.ToString());
} }
apetag.SetValue("Media", Media); apetag.SetValue("Media", Media);
apetag.SetValue("Label", Publisher); apetag.SetValue("Label", Publisher);
apetag.SetValue("MUSICBRAINZ_ALBUMCOMMENT", MusicBrainzAlbumComment); apetag.SetValue("MUSICBRAINZ_ALBUMCOMMENT", MusicBrainzAlbumComment);
@ -415,7 +419,7 @@ namespace NzbDrone.Core.MediaFiles
else if (file.TagTypes.HasFlag(TagTypes.Asf)) else if (file.TagTypes.HasFlag(TagTypes.Asf))
{ {
var asftag = (TagLib.Asf.Tag) file.GetTag(TagTypes.Asf); var asftag = (TagLib.Asf.Tag) file.GetTag(TagTypes.Asf);
if (Date.HasValue) if (Date.HasValue)
{ {
asftag.SetDescriptorString(Date.Value.ToString("yyyy-MM-dd"), "WM/Year"); asftag.SetDescriptorString(Date.Value.ToString("yyyy-MM-dd"), "WM/Year");
@ -434,7 +438,7 @@ namespace NzbDrone.Core.MediaFiles
else if (file.TagTypes.HasFlag(TagTypes.Apple)) else if (file.TagTypes.HasFlag(TagTypes.Apple))
{ {
var appletag = (TagLib.Mpeg4.AppleTag) file.GetTag(TagTypes.Apple); var appletag = (TagLib.Mpeg4.AppleTag) file.GetTag(TagTypes.Apple);
if (Date.HasValue) if (Date.HasValue)
{ {
appletag.SetText(FixAppleId("day"), Date.Value.ToString("yyyy-MM-dd")); appletag.SetText(FixAppleId("day"), Date.Value.ToString("yyyy-MM-dd"));
@ -444,7 +448,7 @@ namespace NzbDrone.Core.MediaFiles
appletag.SetDashBox("com.apple.iTunes", "Original Date", OriginalReleaseDate.Value.ToString("yyyy-MM-dd")); appletag.SetDashBox("com.apple.iTunes", "Original Date", OriginalReleaseDate.Value.ToString("yyyy-MM-dd"));
appletag.SetDashBox("com.apple.iTunes", "Original Year", OriginalReleaseDate.Value.Year.ToString()); appletag.SetDashBox("com.apple.iTunes", "Original Year", OriginalReleaseDate.Value.Year.ToString());
} }
appletag.SetDashBox("com.apple.iTunes", "MEDIA", Media); appletag.SetDashBox("com.apple.iTunes", "MEDIA", Media);
appletag.SetDashBox("com.apple.iTunes", "MusicBrainz Album Comment", MusicBrainzAlbumComment); appletag.SetDashBox("com.apple.iTunes", "MusicBrainz Album Comment", MusicBrainzAlbumComment);
appletag.SetDashBox("com.apple.iTunes", "MusicBrainz Release Track Id", MusicBrainzReleaseTrackId); appletag.SetDashBox("com.apple.iTunes", "MusicBrainz Release Track Id", MusicBrainzReleaseTrackId);
@ -588,7 +592,7 @@ namespace NzbDrone.Core.MediaFiles
Title = artist, Title = artist,
Year = (int)tag.Year Year = (int)tag.Year
}; };
return new ParsedTrackInfo { return new ParsedTrackInfo {
Language = Language.English, Language = Language.English,
AlbumTitle = tag.Album, AlbumTitle = tag.Album,

Loading…
Cancel
Save