Skip to content
This repository was archived by the owner on Nov 8, 2018. It is now read-only.

Commit 5463214

Browse files
committed
TrackCount is now decoded
1 parent 7f1e72f commit 5463214

File tree

2 files changed

+20
-26
lines changed

2 files changed

+20
-26
lines changed

Extensions/AudioShell.Extensions.Mp4/AtomToMetadataAdapter.cs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,43 @@
1818
using System;
1919
using System.Collections.Generic;
2020
using System.Diagnostics.Contracts;
21+
using System.Globalization;
2122

2223
namespace AudioShell.Extensions.Mp4
2324
{
24-
class AtomToMetadataAdapter : Dictionary<string, AtomInfo>
25+
class AtomToMetadataAdapter : MetadataDictionary
2526
{
2627
static readonly Dictionary<string, string> _map = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) {
2728
{ "©alb", "Album" },
2829
{ "©ART", "Artist" },
2930
{ "©cmt", "Comment" },
3031
{ "©gen", "Genre" },
3132
{ "©nam", "Title" },
32-
{ "trkn", "TrackNumber" },
3333
{ "©day", "Year" }
3434
};
3535

36-
internal AtomToMetadataAdapter(AtomInfo[] atoms)
36+
internal AtomToMetadataAdapter(Mp4 mp4, AtomInfo[] atoms)
3737
{
38+
Contract.Requires(mp4 != null);
3839
Contract.Requires(atoms != null);
3940

4041
foreach (AtomInfo atom in atoms)
4142
{
42-
string mappedKey;
43-
if (_map.TryGetValue(atom.FourCC, out mappedKey))
44-
base[mappedKey] = atom;
43+
byte[] atomData = mp4.ReadAtom(atom);
44+
45+
if (atom.FourCC == "trkn")
46+
{
47+
var trackNumberAtom = new TrackNumberAtom(atomData);
48+
Add("TrackNumber", trackNumberAtom.TrackNumber.ToString(CultureInfo.InvariantCulture));
49+
if (trackNumberAtom.TrackCount > 0)
50+
Add("TrackCount", trackNumberAtom.TrackCount.ToString(CultureInfo.InvariantCulture));
51+
}
52+
else
53+
{
54+
string mappedKey;
55+
if (_map.TryGetValue(atom.FourCC, out mappedKey))
56+
base[mappedKey] = new TextAtom(atomData).Value;
57+
}
4558
}
4659
}
4760
}

Extensions/AudioShell.Extensions.Mp4/ItunesMetadataDecoder.cs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,7 @@
1515
* <http://www.gnu.org/licenses/>.
1616
*/
1717

18-
using System;
19-
using System.Collections.Generic;
20-
using System.Globalization;
2118
using System.IO;
22-
using System.Linq;
23-
using System.Text;
24-
using System.Threading.Tasks;
2519

2620
namespace AudioShell.Extensions.Mp4
2721
{
@@ -30,23 +24,10 @@ public class ItunesMetadataDecoder : IMetadataDecoder
3024
{
3125
public MetadataDictionary ReadMetadata(Stream stream)
3226
{
33-
var result = new MetadataDictionary();
34-
3527
var mp4 = new Mp4(stream);
3628
mp4.DescendToAtom("moov", "udta", "meta", "ilst");
3729

38-
var adaptedMetadata = new AtomToMetadataAdapter(mp4.GetChildAtomInfo());
39-
foreach (var item in adaptedMetadata)
40-
{
41-
byte[] atomData = mp4.ReadAtom(item.Value);
42-
43-
if (item.Key == "TrackNumber")
44-
result.Add(item.Key, new TrackNumberAtom(atomData).TrackNumber.ToString(CultureInfo.InvariantCulture));
45-
else
46-
result.Add(item.Key, new TextAtom(atomData).Value);
47-
}
48-
49-
return result;
30+
return new AtomToMetadataAdapter(mp4, mp4.GetChildAtomInfo());
5031
}
5132
}
5233
}

0 commit comments

Comments
 (0)