diff --git a/src/Id3.Net/Id3.Net.csproj b/src/Id3.Net/Id3.Net.csproj index 7f6297a..3bd61eb 100644 --- a/src/Id3.Net/Id3.Net.csproj +++ b/src/Id3.Net/Id3.Net.csproj @@ -3,7 +3,7 @@ netstandard2.0;net40 Id3 - true + false ID3 0.5.0-beta.1 Jeevan James diff --git a/src/Id3.Net/Id3/Id3Tag.cs b/src/Id3.Net/Id3/Id3Tag.cs index 0c51bc2..6b10341 100644 --- a/src/Id3.Net/Id3/Id3Tag.cs +++ b/src/Id3.Net/Id3/Id3Tag.cs @@ -29,6 +29,7 @@ namespace Id3 { /// /// Represents an ID3 tag. + /// /// This class is agnostic of any ID3 tag version. It contains all the possible properties that can be assigned across /// all ID3 tag versions. /// @@ -83,7 +84,7 @@ public Id3Tag ConvertTo(Id3Version version) #region Frame operations IEnumerator IEnumerable.GetEnumerator() { - return ((IEnumerable) this).GetEnumerator(); + return ((IEnumerable)this).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() @@ -95,7 +96,7 @@ IEnumerator IEnumerable.GetEnumerator() foreach (Id3Frame frame in list) yield return frame; } else - yield return (Id3Frame) kvp.Value; + yield return (Id3Frame)kvp.Value; } } @@ -113,7 +114,7 @@ public void Cleanup() { for (int i = frameList.Count - 1; i >= 0; i--) { - var frame = (Id3Frame) frameList[i]; + var frame = (Id3Frame)frameList[i]; if (!frame.IsAssigned) frameList.RemoveAt(i); } @@ -124,7 +125,7 @@ public void Cleanup() } else { //Get the item value as a frame and mark it for removal if it is unassigned - var frame = (Id3Frame) kvp.Value; + var frame = (Id3Frame)kvp.Value; if (!frame.IsAssigned) keysToDelete.Add(kvp.Key); } @@ -145,23 +146,43 @@ public int Clear() return clearedCount; } - public bool Contains(Expression> frameProperty) where TFrame : Id3Frame + public bool Contains(Expression> frameProperty) + where TFrame : Id3Frame { if (frameProperty == null) throw new ArgumentNullException(nameof(frameProperty)); - var lambda = (LambdaExpression) frameProperty; - var memberExpression = (MemberExpression) lambda.Body; - var property = (PropertyInfo) memberExpression.Member; + var lambda = (LambdaExpression)frameProperty; + var memberExpression = (MemberExpression)lambda.Body; + var property = (PropertyInfo)memberExpression.Member; return this.Any(f => f.GetType() == property.PropertyType && f.IsAssigned); } + /// + /// Returns the total number of frames in this tag. + /// + /// If true, counts only assigned frames. + /// Total number of frames in the tag. + public int GetCount(bool onlyAssignedFrames = true) + { + var count = 0; + foreach (KeyValuePair kvp in _frames) + { + if (kvp.Value is IList list) + count += onlyAssignedFrames ? list.Cast().Count(frame => frame.IsAssigned) : list.Count; + else + count += onlyAssignedFrames ? (((Id3Frame)kvp.Value).IsAssigned ? 1 : 0) : 1; + } + return count; + } + /// /// Removes any frames of the specified type from the tag. /// /// Type of frame to remove /// True, if matching frames were removed, otherwise false. - public bool Remove() where TFrame : Id3Frame + public bool Remove() + where TFrame : Id3Frame { Type frameType = typeof(TFrame); @@ -193,7 +214,7 @@ public int RemoveWhere(Func predicate) { for (int i = list.Count - 1; i >= 0; i--) { - if (predicate((TFrame) list[i])) + if (predicate((TFrame)list[i])) { list.RemoveAt(i); removalCount++; @@ -204,7 +225,7 @@ public int RemoveWhere(Func predicate) _frames.Remove(frameType); } else { - var frame = (TFrame) frameObj; + var frame = (TFrame)frameObj; if (predicate(frame)) { _frames.Remove(frameType); @@ -408,7 +429,7 @@ public YearFrame Year /// This method is meant to be called by instances when they are reading the ID3 data and /// populating this object. /// - /// The instance to add. + /// The instance to add. internal void AddUntypedFrame(Id3Frame frame) { Type frameType = frame.GetType(); @@ -417,7 +438,7 @@ internal void AddUntypedFrame(Id3Frame frame) { IList list; if (containsKey) - list = (IList) _frames[frameType]; + list = (IList)_frames[frameType]; else { list = MultiInstanceFrameTypes[frameType](); @@ -435,16 +456,18 @@ internal void AddUntypedFrame(Id3Frame frame) } } - private TFrame GetSingleFrame() where TFrame : Id3Frame, new() + private TFrame GetSingleFrame() + where TFrame : Id3Frame, new() { if (_frames.TryGetValue(typeof(TFrame), out object frameObj)) - return (TFrame) frameObj; + return (TFrame)frameObj; var frame = new TFrame(); _frames.Add(typeof(TFrame), frame); return frame; } - private void SetSingleFrame(TFrame frame) where TFrame : Id3Frame + private void SetSingleFrame(TFrame frame) + where TFrame : Id3Frame { Type frameType = typeof(TFrame); bool containsKey = _frames.ContainsKey(frameType); @@ -466,7 +489,7 @@ private TFrameList GetMultipleFrames() where TFrameList : IList, new() { if (_frames.TryGetValue(typeof(TFrame), out object frameListObj)) - return (TFrameList) frameListObj; + return (TFrameList)frameListObj; var framesList = new TFrameList(); _frames.Add(typeof(TFrame), framesList); return framesList; diff --git a/src/Id3.Net/Id3/Id3TagFamily.cs b/src/Id3.Net/Id3/Id3TagFamily.cs index e0c6efd..ef1e984 100644 --- a/src/Id3.Net/Id3/Id3TagFamily.cs +++ b/src/Id3.Net/Id3/Id3TagFamily.cs @@ -20,20 +20,20 @@ limitations under the License. namespace Id3 { /// - /// Specifies families of ID3 tag versions that are mutually-inclusive. + /// Specifies families of ID3 tag versions that are mutually-inclusive. /// public enum Id3TagFamily { /// - /// Indicates ID3 tags in the v2 range (currently v2.2, v2.3 and v2.4). These tags appear at - /// the beginning of the MP3 file. + /// Indicates ID3 tags in the v2 range (currently v2.2, v2.3 and v2.4). These tags appear at + /// the beginning of the MP3 file. /// Version2X, /// - /// Indicates ID3 tags in the v1 range (currently v1.0 and v1.1). These tags appear at the end - /// of the MP3 file. + /// Indicates ID3 tags in the v1 range (currently v1.0 and v1.1). These tags appear at the end + /// of the MP3 file. /// - Version1X, + Version1X } -} \ No newline at end of file +} diff --git a/src/Id3.Net/Id3/Id3Version.cs b/src/Id3.Net/Id3/Id3Version.cs index 9b5306c..1d07eed 100644 --- a/src/Id3.Net/Id3/Id3Version.cs +++ b/src/Id3.Net/Id3/Id3Version.cs @@ -22,8 +22,6 @@ namespace Id3 public enum Id3Version { V1X = 1, - V22 = 2, V23 = 3, - V24 = 4 } } diff --git a/src/Id3.Net/Id3/TagComparer.cs b/src/Id3.Net/Id3/TagComparer.cs index b447adf..4181e1a 100644 --- a/src/Id3.Net/Id3/TagComparer.cs +++ b/src/Id3.Net/Id3/TagComparer.cs @@ -23,17 +23,24 @@ limitations under the License. namespace Id3 { /// - /// Compares two tags for equality. + /// Compares two tags for equality. /// public sealed class TagComparer : IEqualityComparer { + public bool CompareOnlyAssignedFrames { get; } + + public TagComparer(bool compareOnlyAssignedFrames = false) + { + CompareOnlyAssignedFrames = compareOnlyAssignedFrames; + } + bool IEqualityComparer.Equals(Id3Tag tag1, Id3Tag tag2) { if (ReferenceEquals(tag1, tag2)) return true; if (tag1 == null || tag2 == null) return false; - if (tag1.Count() != tag2.Count()) + if (tag1.GetCount(CompareOnlyAssignedFrames) != tag2.GetCount(CompareOnlyAssignedFrames)) return false; //TODO: Compare frames @@ -41,9 +48,6 @@ bool IEqualityComparer.Equals(Id3Tag tag1, Id3Tag tag2) return true; } - int IEqualityComparer.GetHashCode(Id3Tag tag) - { - return tag.GetHashCode(); - } + int IEqualityComparer.GetHashCode(Id3Tag tag) => tag.GetHashCode(); } }