I've been reading this code for a while now and I've only just come to understand that metadata.picture is a filename except for the blob case used in testing.

It is confusing to me that the metdata parser returns a metadata.picture object and then in the handleCoverArt() postprocessing step you overrwite that object with the filename.  

If it was me, I think I'd retain the metadata.picture object (though not with the deunsynced blob in it, of course). It is tiny and easy to store in the DB and gives us access to the full-size cover art if we ever want it.  Then I'd use a different property (like coverFilename) for the filename.  And use coverBlob for the blob case, perhaps.