public static void Read(TagLibMetaDataSource source, IList <MetaDataItem> metaData, File file) { if (file.TagTypes.HasFlag(TagTypes.Id3v2)) { var tag = GetTag <global::TagLib.Id3v2.Tag>(file, TagTypes.Id3v2); if (tag == null) { return; } foreach (var frame in tag.GetFrames <global::TagLib.Id3v2.PopularimeterFrame>()) { ReadPopularimeterFrame(source, metaData, file, frame); } } else { var rating = ReadCustomTag(CommonMetaData.Rating, file); if (!string.IsNullOrEmpty(rating)) { source.AddTag(metaData, CommonMetaData.Rating, rating); } var playCount = ReadCustomTag(CommonMetaData.PlayCount, file); if (!string.IsNullOrEmpty(playCount)) { source.AddTag(metaData, CommonMetaData.Rating, playCount); } } }
public static void Read(TagLibMetaDataSource source, IList <MetaDataItem> metaData, File file) { var isCompilation = default(bool); if (TagManager.HasTag(file, TagTypes.Id3v2)) { var tag = TagManager.GetTag <global::TagLib.Id3v2.Tag>(file, TagTypes.Id3v2); if (tag != null) { isCompilation = tag.IsCompilation; } } else if (TagManager.HasTag(file, TagTypes.Apple)) { var tag = TagManager.GetTag <global::TagLib.Mpeg4.AppleTag>(file, TagTypes.Apple); if (tag != null) { isCompilation = tag.IsCompilation; } } else if (TagManager.HasTag(file, TagTypes.Xiph)) { var tag = TagManager.GetTag <global::TagLib.Ogg.XiphComment>(file, TagTypes.Xiph); if (tag != null) { isCompilation = tag.IsCompilation; } } //Check MB release type, it's innocuous so don't bother respecting READ_MUSICBRAINZ_TAGS. if (string.Equals(file.Tag.MusicBrainzReleaseType, MusicBrainzReleaseType.Compilation, StringComparison.OrdinalIgnoreCase)) { isCompilation = true; } if (isCompilation) { source.AddTag(metaData, CommonMetaData.IsCompilation, bool.TrueString); //TODO: CustomMetaData.VariousArtists should go away but scripts use it, let's keep it updated for now. source.AddTag(metaData, CustomMetaData.VariousArtists, bool.TrueString); } }
public static void Read(TagLibMetaDataSource source, IList <MetaDataItem> metaData, File file) { var tag = file.Tag; if (tag.ReplayGainAlbumPeak != 0 && !double.IsNaN(tag.ReplayGainAlbumPeak) && !double.IsInfinity(tag.ReplayGainAlbumPeak)) { source.AddTag(metaData, CommonMetaData.ReplayGainAlbumPeak, tag.ReplayGainAlbumPeak.ToString()); } if (tag.ReplayGainAlbumGain != 0 && !double.IsNaN(tag.ReplayGainAlbumGain) && !double.IsInfinity(tag.ReplayGainAlbumGain)) { source.AddTag(metaData, CommonMetaData.ReplayGainAlbumGain, tag.ReplayGainAlbumGain.ToString()); } if (tag.ReplayGainTrackPeak != 0 && !double.IsNaN(tag.ReplayGainTrackPeak) && !double.IsInfinity(tag.ReplayGainTrackPeak)) { source.AddTag(metaData, CommonMetaData.ReplayGainTrackPeak, tag.ReplayGainTrackPeak.ToString()); } if (tag.ReplayGainTrackGain != 0 && !double.IsNaN(tag.ReplayGainTrackGain) && !double.IsInfinity(tag.ReplayGainTrackGain)) { source.AddTag(metaData, CommonMetaData.ReplayGainTrackGain, tag.ReplayGainTrackGain.ToString()); } }
private static void ReadPopularimeterFrame(TagLibMetaDataSource source, IList <MetaDataItem> metaData, File file, global::TagLib.Id3v2.PopularimeterFrame frame) { const byte RATING_1 = 1; const byte RATING_2 = 64; const byte RATING_3 = 128; const byte RATING_4 = 196; const byte RATING_5 = 255; if (frame.Rating != 0) { var rating = 0; switch (frame.Rating) { case RATING_1: rating = 1; break; case RATING_2: rating = 2; break; case RATING_3: rating = 3; break; case RATING_4: rating = 4; break; case RATING_5: rating = 5; break; } source.AddTag(metaData, CommonMetaData.Rating, Convert.ToString(rating)); } if (frame.PlayCount != 0) { source.AddTag(metaData, CommonMetaData.PlayCount, Convert.ToString(frame.PlayCount)); } }
public static void Read(TagLibMetaDataSource source, IList <MetaDataItem> metaData, File file) { var result = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); //If it's an Id3v2 tag then try to read the popularimeter frame. //It can contain a rating and a play counter. if (file.TagTypes.HasFlag(TagTypes.Id3v2)) { var tag = TagManager.GetTag <global::TagLib.Id3v2.Tag>(file, TagTypes.Id3v2); if (tag == null) { return; } foreach (var frame in tag.GetFrames <global::TagLib.Id3v2.PopularimeterFrame>()) { ReadPopularimeterFrame(frame, result); } } //If we didn't find a popularimeter frame then attempt to read the rating from a custom tag. if (!result.ContainsKey(CommonStatistics.Rating)) { var rating = TagManager.ReadCustomTag(CommonStatistics.Rating, file); if (!string.IsNullOrEmpty(rating)) { result.Add(CommonStatistics.Rating, Convert.ToString(GetRatingStars(rating))); } else { result.Add(CommonStatistics.Rating, string.Empty); } } //If we didn't find a popularimeter frame then attempt to read the play count from a custom tag. if (!result.ContainsKey(CommonStatistics.PlayCount)) { var playCount = TagManager.ReadCustomTag(CommonStatistics.PlayCount, file); if (!string.IsNullOrEmpty(playCount)) { result.Add(CommonStatistics.PlayCount, playCount); } else { result.Add(CommonStatistics.PlayCount, "0"); } } //Popularimeter frame does not support last played, attempt to read the play count from a custom tag. //if (!result.ContainsKey(CommonMetaData.LastPlayed)) { var lastPlayed = TagManager.ReadCustomTag(CommonStatistics.LastPlayed, file); if (!string.IsNullOrEmpty(lastPlayed)) { result.Add(CommonStatistics.LastPlayed, lastPlayed); } else { result.Add(CommonStatistics.LastPlayed, DateTimeHelper.NEVER); } } //Copy our informations back to the meta data collection. foreach (var key in result.Keys) { var value = result[key]; source.AddTag(metaData, key, value); } }