I think we have a consistency problem above: 

       
```C++

  // Takes care of all the default metadata
        result = processTaglibFile(f);

        // Now look for MP3 specific metadata (e.g. BPM)
        TagLib::ID3v2::Tag* id3v2 = f.ID3v2Tag();
        if (id3v2) {
            processID3v2Tag(id3v2);
        }
```

"result" is not checked before the additional Taglib call but the whole function returns error in this case. 
IMHO there are two logical paths: Abort when one call fails, or graceful recover errors and not return ERR if some call succeed. 

```C++
TagLib::AudioProperties *properties = f.audioProperties();
```

processTaglibFile fails if f.audioProperties() returns NULL 

@rryan: What is the right strategy? I would prefer the early abort. Since this is Legacy code, I would prefer fixing it in a separate branch. There is also my external Tagreader process (slowly) on the way.