diff --git a/Plugins/TagLib/TagLibID3v2Reader.mm b/Plugins/TagLib/TagLibID3v2Reader.mm index cee54ac22..f5ebfb78c 100644 --- a/Plugins/TagLib/TagLibID3v2Reader.mm +++ b/Plugins/TagLib/TagLibID3v2Reader.mm @@ -14,6 +14,8 @@ #import #import +#import "Logging.h" + @implementation TagLibID3v2Reader + (NSDictionary *)metadataForTag:(NSData *)tagBlock { @@ -53,110 +55,115 @@ // // } - TagLib::ByteVector vector((const char *)[tagBlock bytes], (unsigned int)[tagBlock length]); - TagLib::ByteVectorStream vectorStream(vector); + try { + TagLib::ByteVector vector((const char *)[tagBlock bytes], (unsigned int)[tagBlock length]); + TagLib::ByteVectorStream vectorStream(vector); - TagLib::FileRef f((TagLib::IOStream *)&vectorStream, false); - if(!f.isNull()) { - const TagLib::Tag *tag = f.tag(); + TagLib::FileRef f((TagLib::IOStream *)&vectorStream, false); + if(!f.isNull()) { + const TagLib::Tag *tag = f.tag(); - if(tag) { - TagLib::String artist, albumartist, composer, title, album, genre, comment, unsyncedlyrics; - int year, track, disc; - float rgAlbumGain, rgAlbumPeak, rgTrackGain, rgTrackPeak; - TagLib::String cuesheet; - TagLib::String soundcheck; + if(tag) { + TagLib::String artist, albumartist, composer, title, album, genre, comment, unsyncedlyrics; + int year, track, disc; + float rgAlbumGain, rgAlbumPeak, rgTrackGain, rgTrackPeak; + TagLib::String cuesheet; + TagLib::String soundcheck; - artist = tag->artist(); - //albumartist = tag->albumartist(); - //composer = tag->composer(); - title = tag->title(); - album = tag->album(); - genre = tag->genre(); - comment = tag->comment(); - //cuesheet = tag->cuesheet(); - //unsyncedlyrics = tag->unsyncedlyrics(); + artist = tag->artist(); + //albumartist = tag->albumartist(); + //composer = tag->composer(); + title = tag->title(); + album = tag->album(); + genre = tag->genre(); + comment = tag->comment(); + //cuesheet = tag->cuesheet(); + //unsyncedlyrics = tag->unsyncedlyrics(); - year = tag->year(); - [dict setObject:@(year) forKey:@"year"]; + year = tag->year(); + [dict setObject:@(year) forKey:@"year"]; - track = tag->track(); - [dict setObject:@(track) forKey:@"track"]; + track = tag->track(); + [dict setObject:@(track) forKey:@"track"]; - /*disc = tag->disc(); - [dict setObject:@(disc) forKey:@"disc"];*/ + /*disc = tag->disc(); + [dict setObject:@(disc) forKey:@"disc"];*/ - /*rgAlbumGain = tag->rgAlbumGain(); - rgAlbumPeak = tag->rgAlbumPeak(); - rgTrackGain = tag->rgTrackGain(); - rgTrackPeak = tag->rgTrackPeak(); - [dict setObject:@(rgAlbumGain) forKey:@"replaygain_album_gain"]; - [dict setObject:@(rgAlbumPeak) forKey:@"replaygain_album_peak"]; - [dict setObject:@(rgTrackGain) forKey:@"replaygain_track_gain"]; - [dict setObject:@(rgTrackPeak) forKey:@"replaygain_track_peak"]; + /*rgAlbumGain = tag->rgAlbumGain(); + rgAlbumPeak = tag->rgAlbumPeak(); + rgTrackGain = tag->rgTrackGain(); + rgTrackPeak = tag->rgTrackPeak(); + [dict setObject:@(rgAlbumGain) forKey:@"replaygain_album_gain"]; + [dict setObject:@(rgAlbumPeak) forKey:@"replaygain_album_peak"]; + [dict setObject:@(rgTrackGain) forKey:@"replaygain_track_gain"]; + [dict setObject:@(rgTrackPeak) forKey:@"replaygain_track_peak"]; - soundcheck = tag->soundcheck(); - if(!soundcheck.isEmpty()) { - TagLib::StringList tag = soundcheck.split(" "); - TagLib::StringList wantedTag; - for(int i = 0, count = tag.size(); i < count; i++) { - if(tag[i].length() == 8) - wantedTag.append(tag[i]); + soundcheck = tag->soundcheck(); + if(!soundcheck.isEmpty()) { + TagLib::StringList tag = soundcheck.split(" "); + TagLib::StringList wantedTag; + for(int i = 0, count = tag.size(); i < count; i++) { + if(tag[i].length() == 8) + wantedTag.append(tag[i]); + } + + if(wantedTag.size() >= 10) { + float volume1 = -log10((double)((uint32_t)wantedTag[0].toInt(16)) / 1000) * 10; + float volume2 = -log10((double)((uint32_t)wantedTag[1].toInt(16)) / 1000) * 10; + float volumeToUse = MIN(volume1, volume2); + float volumeScale = pow(10, volumeToUse / 20); + [dict setObject:@(volumeScale) forKey:@"volume"]; + } + }*/ + + if(!artist.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:artist.toCString(true)] forKey:@"artist"]; + + if(!albumartist.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:albumartist.toCString(true)] forKey:@"albumartist"]; + + if(!composer.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:composer.toCString(true)] forKey:@"composer"]; + + if(!album.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:album.toCString(true)] forKey:@"album"]; + + if(!title.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:title.toCString(true)] forKey:@"title"]; + + if(!genre.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:genre.toCString(true)] forKey:@"genre"]; + + if(!cuesheet.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:cuesheet.toCString(true)] forKey:@"cuesheet"]; + + if(!comment.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:comment.toCString(true)] forKey:@"comment"]; + + if(!unsyncedlyrics.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:unsyncedlyrics.toCString(true)] forKey:@"unsyncedlyrics"]; + + // Try to load the image. + NSData *image = nil; + + TagLib::MPEG::File *mf = dynamic_cast(f.file()); + if(mf) { + TagLib::ID3v2::FrameList pictures = mf->ID3v2Tag()->frameListMap()["APIC"]; + if(!pictures.isEmpty()) { + TagLib::ID3v2::AttachedPictureFrame *pic = static_cast(pictures.front()); + + image = [NSData dataWithBytes:pic->picture().data() length:pic->picture().size()]; + } } - if(wantedTag.size() >= 10) { - float volume1 = -log10((double)((uint32_t)wantedTag[0].toInt(16)) / 1000) * 10; - float volume2 = -log10((double)((uint32_t)wantedTag[1].toInt(16)) / 1000) * 10; - float volumeToUse = MIN(volume1, volume2); - float volumeScale = pow(10, volumeToUse / 20); - [dict setObject:@(volumeScale) forKey:@"volume"]; + if(nil != image) { + [dict setObject:image forKey:@"albumArt"]; } - }*/ - - if(!artist.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:artist.toCString(true)] forKey:@"artist"]; - - if(!albumartist.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:albumartist.toCString(true)] forKey:@"albumartist"]; - - if(!composer.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:composer.toCString(true)] forKey:@"composer"]; - - if(!album.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:album.toCString(true)] forKey:@"album"]; - - if(!title.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:title.toCString(true)] forKey:@"title"]; - - if(!genre.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:genre.toCString(true)] forKey:@"genre"]; - - if(!cuesheet.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:cuesheet.toCString(true)] forKey:@"cuesheet"]; - - if(!comment.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:comment.toCString(true)] forKey:@"comment"]; - - if(!unsyncedlyrics.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:unsyncedlyrics.toCString(true)] forKey:@"unsyncedlyrics"]; - - // Try to load the image. - NSData *image = nil; - - TagLib::MPEG::File *mf = dynamic_cast(f.file()); - if(mf) { - TagLib::ID3v2::FrameList pictures = mf->ID3v2Tag()->frameListMap()["APIC"]; - if(!pictures.isEmpty()) { - TagLib::ID3v2::AttachedPictureFrame *pic = static_cast(pictures.front()); - - image = [NSData dataWithBytes:pic->picture().data() length:pic->picture().size()]; - } - } - - if(nil != image) { - [dict setObject:image forKey:@"albumArt"]; } } + } catch (std::exception &e) { + ALog(@"Exception caught processing ID3v2 tag with TagLib: %s", e.what()); + return [NSDictionary dictionary]; } return [NSDictionary dictionaryWithDictionary:dict]; diff --git a/Plugins/TagLib/TagLibMetadataReader.m b/Plugins/TagLib/TagLibMetadataReader.m index 379059dff..7f91ea54c 100644 --- a/Plugins/TagLib/TagLibMetadataReader.m +++ b/Plugins/TagLib/TagLibMetadataReader.m @@ -18,6 +18,8 @@ #import #import +#import "Logging.h" + #import "SandboxBroker.h" @implementation TagLibMetadataReader @@ -68,114 +70,120 @@ // // } - TagLib::FileRef f((const char *)[[url path] UTF8String], false); - if(!f.isNull()) { - const TagLib::Tag *tag = f.tag(); + try { + TagLib::FileRef f((const char *)[[url path] UTF8String], false); + if(!f.isNull()) { + const TagLib::Tag *tag = f.tag(); - if(tag) { - TagLib::String artist, albumartist, composer, title, album, genre, comment, unsyncedlyrics; - int year, track, disc; - float rgAlbumGain, rgAlbumPeak, rgTrackGain, rgTrackPeak; - TagLib::String cuesheet; - TagLib::String soundcheck; - - artist = tag->artist(); - //albumartist = tag->albumartist(); - //composer = tag->composer(); - title = tag->title(); - ; - album = tag->album(); - genre = tag->genre(); - comment = tag->comment(); - //cuesheet = tag->cuesheet(); - - //unsyncedlyrics = tag->unsyncedlyrics(); - - year = tag->year(); - [dict setObject:@(year) forKey:@"year"]; - - track = tag->track(); - [dict setObject:@(track) forKey:@"track"]; - - /*disc = tag->disc(); - [dict setObject:@(disc) forKey:@"disc"];*/ - - /*rgAlbumGain = tag->rgAlbumGain(); - rgAlbumPeak = tag->rgAlbumPeak(); - rgTrackGain = tag->rgTrackGain(); - rgTrackPeak = tag->rgTrackPeak(); - [dict setObject:@(rgAlbumGain) forKey:@"replaygain_album_gain"]; - [dict setObject:@(rgAlbumPeak) forKey:@"replaygain_album_peak"]; - [dict setObject:@(rgTrackGain) forKey:@"replaygain_track_gain"]; - [dict setObject:@(rgTrackPeak) forKey:@"replaygain_track_peak"];*/ - - /*soundcheck = tag->soundcheck(); - if(!soundcheck.isEmpty()) { - TagLib::StringList tag = soundcheck.split(" "); - TagLib::StringList wantedTag; - for(int i = 0, count = tag.size(); i < count; i++) { - if(tag[i].length() == 8) - wantedTag.append(tag[i]); - } - - if(wantedTag.size() >= 10) { - float volume1 = -log10((double)((uint32_t)wantedTag[0].toInt(16)) / 1000) * 10; - float volume2 = -log10((double)((uint32_t)wantedTag[1].toInt(16)) / 1000) * 10; - float volumeToUse = MIN(volume1, volume2); - float volumeScale = pow(10, volumeToUse / 20); - [dict setObject:@(volumeScale) forKey:@"volume"]; - } - }*/ - - if(!artist.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:artist.toCString(true)] forKey:@"artist"]; - - if(!albumartist.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:albumartist.toCString(true)] forKey:@"albumartist"]; - - if(!composer.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:composer.toCString(true)] forKey:@"composer"]; - - if(!album.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:album.toCString(true)] forKey:@"album"]; - - if(!title.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:title.toCString(true)] forKey:@"title"]; - - if(!genre.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:genre.toCString(true)] forKey:@"genre"]; - - if(!cuesheet.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:cuesheet.toCString(true)] forKey:@"cuesheet"]; - - if(!comment.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:comment.toCString(true)] forKey:@"comment"]; - - if(!unsyncedlyrics.isEmpty()) - [dict setObject:[NSString stringWithUTF8String:unsyncedlyrics.toCString(true)] forKey:@"unsyncedlyrics"]; - } - - // Try to load the image. - NSData *image = nil; - - // Try to load the image. - // WARNING: HACK - TagLib::MPEG::File *mf = dynamic_cast(f.file()); - if(mf) { - TagLib::ID3v2::Tag *tag = mf->ID3v2Tag(); if(tag) { - TagLib::ID3v2::FrameList pictures = mf->ID3v2Tag()->frameListMap()["APIC"]; - if(!pictures.isEmpty()) { - TagLib::ID3v2::AttachedPictureFrame *pic = static_cast(pictures.front()); + TagLib::String artist, albumartist, composer, title, album, genre, comment, unsyncedlyrics; + int year, track, disc; + float rgAlbumGain, rgAlbumPeak, rgTrackGain, rgTrackPeak; + TagLib::String cuesheet; + TagLib::String soundcheck; - image = [NSData dataWithBytes:pic->picture().data() length:pic->picture().size()]; + artist = tag->artist(); + //albumartist = tag->albumartist(); + //composer = tag->composer(); + title = tag->title(); + ; + album = tag->album(); + genre = tag->genre(); + comment = tag->comment(); + //cuesheet = tag->cuesheet(); + + //unsyncedlyrics = tag->unsyncedlyrics(); + + year = tag->year(); + [dict setObject:@(year) forKey:@"year"]; + + track = tag->track(); + [dict setObject:@(track) forKey:@"track"]; + + /*disc = tag->disc(); + [dict setObject:@(disc) forKey:@"disc"];*/ + + /*rgAlbumGain = tag->rgAlbumGain(); + rgAlbumPeak = tag->rgAlbumPeak(); + rgTrackGain = tag->rgTrackGain(); + rgTrackPeak = tag->rgTrackPeak(); + [dict setObject:@(rgAlbumGain) forKey:@"replaygain_album_gain"]; + [dict setObject:@(rgAlbumPeak) forKey:@"replaygain_album_peak"]; + [dict setObject:@(rgTrackGain) forKey:@"replaygain_track_gain"]; + [dict setObject:@(rgTrackPeak) forKey:@"replaygain_track_peak"];*/ + + /*soundcheck = tag->soundcheck(); + if(!soundcheck.isEmpty()) { + TagLib::StringList tag = soundcheck.split(" "); + TagLib::StringList wantedTag; + for(int i = 0, count = tag.size(); i < count; i++) { + if(tag[i].length() == 8) + wantedTag.append(tag[i]); + } + + if(wantedTag.size() >= 10) { + float volume1 = -log10((double)((uint32_t)wantedTag[0].toInt(16)) / 1000) * 10; + float volume2 = -log10((double)((uint32_t)wantedTag[1].toInt(16)) / 1000) * 10; + float volumeToUse = MIN(volume1, volume2); + float volumeScale = pow(10, volumeToUse / 20); + [dict setObject:@(volumeScale) forKey:@"volume"]; + } + }*/ + + if(!artist.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:artist.toCString(true)] forKey:@"artist"]; + + if(!albumartist.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:albumartist.toCString(true)] forKey:@"albumartist"]; + + if(!composer.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:composer.toCString(true)] forKey:@"composer"]; + + if(!album.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:album.toCString(true)] forKey:@"album"]; + + if(!title.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:title.toCString(true)] forKey:@"title"]; + + if(!genre.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:genre.toCString(true)] forKey:@"genre"]; + + if(!cuesheet.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:cuesheet.toCString(true)] forKey:@"cuesheet"]; + + if(!comment.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:comment.toCString(true)] forKey:@"comment"]; + + if(!unsyncedlyrics.isEmpty()) + [dict setObject:[NSString stringWithUTF8String:unsyncedlyrics.toCString(true)] forKey:@"unsyncedlyrics"]; + } + + // Try to load the image. + NSData *image = nil; + + // Try to load the image. + // WARNING: HACK + TagLib::MPEG::File *mf = dynamic_cast(f.file()); + if(mf) { + TagLib::ID3v2::Tag *tag = mf->ID3v2Tag(); + if(tag) { + TagLib::ID3v2::FrameList pictures = mf->ID3v2Tag()->frameListMap()["APIC"]; + if(!pictures.isEmpty()) { + TagLib::ID3v2::AttachedPictureFrame *pic = static_cast(pictures.front()); + + image = [NSData dataWithBytes:pic->picture().data() length:pic->picture().size()]; + } } } - } - if(nil != image) { - [dict setObject:image forKey:@"albumArt"]; + if(nil != image) { + [dict setObject:image forKey:@"albumArt"]; + } } + } catch (std::exception &e) { + ALog(@"Exception caught reading file with TagLib: %s", e.what()); + [sandboxBroker endFolderAccess:sbHandle]; + return [NSDictionary dictionary]; } [sandboxBroker endFolderAccess:sbHandle]; diff --git a/Plugins/TagLib/TagLibMetadataWriter.m b/Plugins/TagLib/TagLibMetadataWriter.m index d48e5d537..b8808ddf8 100644 --- a/Plugins/TagLib/TagLibMetadataWriter.m +++ b/Plugins/TagLib/TagLibMetadataWriter.m @@ -19,55 +19,60 @@ NSString *lArtist = @"", *lTitle = @"", *lAlbum = @"", *lGenre = @""; // int lYear = 0, lTrack = 0; - TagLib::FileRef f((const char *)[[url path] UTF8String], false); - if(!f.isNull()) { - const TagLib::Tag *tag = f.tag(); + try { + TagLib::FileRef f((const char *)[[url path] UTF8String], false); + if(!f.isNull()) { + const TagLib::Tag *tag = f.tag(); - if(tag) { - const TagLib::String pArtist, pTitle, pAlbum, pGenre, pComment; + if(tag) { + const TagLib::String pArtist, pTitle, pAlbum, pGenre, pComment; - lArtist = [tagData valueForKey:@"artist"]; - lTitle = [tagData valueForKey:@"title"]; - lAlbum = [tagData valueForKey:@"album"]; - lGenre = [tagData valueForKey:@"genre"]; + lArtist = [tagData valueForKey:@"artist"]; + lTitle = [tagData valueForKey:@"title"]; + lAlbum = [tagData valueForKey:@"album"]; + lGenre = [tagData valueForKey:@"genre"]; - f.tag()->setTitle([lTitle UTF8String]); - f.tag()->setArtist([lArtist UTF8String]); + f.tag()->setTitle([lTitle UTF8String]); + f.tag()->setArtist([lArtist UTF8String]); + } + + /* + + NSArray *keys = @[@"key1", @"key2", @"key3"]; + NSArray *objects = @[@"value1", @"value2", @"value3"]; + NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; + + for (id key in dictionary) + { + DLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]); + } + + pArtist = tag->artist(); + pTitle = tag->title();; + pAlbum = tag->album(); + pGenre = tag->genre(); + pComment = tag->comment(); + + lYear = tag->year(); + lTrack = tag->track(); + lDisc = tag->disc(); + + if (!pArtist.isNull()) + lArtist = [NSString stringWithUTF8String:pArtist.toCString(true)]; + + if (!pAlbum.isNull()) + lAlbum = [NSString stringWithUTF8String:pAlbum.toCString(true)]; + + if (!pTitle.isNull()) + lTitle = [NSString stringWithUTF8String:pTitle.toCString(true)]; + + if (!pGenre.isNull()) + lGenre = [NSString stringWithUTF8String:pGenre.toCString(true)]; + */ } - - /* - - NSArray *keys = @[@"key1", @"key2", @"key3"]; - NSArray *objects = @[@"value1", @"value2", @"value3"]; - NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; - - for (id key in dictionary) - { - DLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]); - } - - pArtist = tag->artist(); - pTitle = tag->title();; - pAlbum = tag->album(); - pGenre = tag->genre(); - pComment = tag->comment(); - - lYear = tag->year(); - lTrack = tag->track(); - lDisc = tag->disc(); - - if (!pArtist.isNull()) - lArtist = [NSString stringWithUTF8String:pArtist.toCString(true)]; - - if (!pAlbum.isNull()) - lAlbum = [NSString stringWithUTF8String:pAlbum.toCString(true)]; - - if (!pTitle.isNull()) - lTitle = [NSString stringWithUTF8String:pTitle.toCString(true)]; - - if (!pGenre.isNull()) - lGenre = [NSString stringWithUTF8String:pGenre.toCString(true)]; - */ + } catch (std::exception &e) { + ALog(@"Exception caught writing with TagLib: %s", e.what()); + return -1; } return 0;