|
|
|
@ -23,6 +23,8 @@ email : aumuell@reserv.at
|
|
|
|
|
* MA 02110-1301 USA * |
|
|
|
|
***************************************************************************/ |
|
|
|
|
|
|
|
|
|
#include <config.h> |
|
|
|
|
|
|
|
|
|
#include "mp4file.h" |
|
|
|
|
|
|
|
|
|
#include "mp4tag.h" |
|
|
|
@ -34,7 +36,11 @@ email : aumuell@reserv.at
|
|
|
|
|
#include <stdlib.h> |
|
|
|
|
#include <sys/types.h> |
|
|
|
|
|
|
|
|
|
#ifdef HAVE_MP4V2_H |
|
|
|
|
#define USE_ITMF_TAGS |
|
|
|
|
#else |
|
|
|
|
#define MP4V2_HAS_WRITE_BUG 1 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
namespace TagLib { |
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
@ -102,6 +108,11 @@ bool MP4::File::save()
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
const MP4Tags* filetags = MP4TagsAlloc(); |
|
|
|
|
MP4TagsFetch(filetags, handle); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MP4V2_HAS_WRITE_BUG |
|
|
|
|
/* according to gtkpod we have to delete all meta data before modifying it,
|
|
|
|
|
save the stuff we would not touch */ |
|
|
|
@ -117,7 +128,14 @@ bool MP4::File::save()
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
MP4TagsSetName(filetags, mp4tag->title().isNull() ? "" : mp4tag->title().toCString(true)); |
|
|
|
|
MP4TagsSetArtist(filetags, mp4tag->artist().isNull() ? "" : mp4tag->artist().toCString(true)); |
|
|
|
|
MP4TagsSetAlbum(filetags, mp4tag->album().isNull() ? "" : mp4tag->album().toCString(true)); |
|
|
|
|
MP4TagsSetComments(filetags, mp4tag->comment().isNull() ? "" : mp4tag->comment().toCString(true)); |
|
|
|
|
MP4TagsSetGenre(filetags, mp4tag->genre().isNull() ? "" : mp4tag->genre().toCString(true)); |
|
|
|
|
MP4TagsSetComposer(filetags, mp4tag->composer().isNull() ? "" : mp4tag->composer().toCString(true)); |
|
|
|
|
#else |
|
|
|
|
#define setmeta(val, tag) \ |
|
|
|
|
if(mp4tag->val().isNull()) { \
|
|
|
|
|
/*MP4DeleteMetadata##tag(handle);*/ \
|
|
|
|
@ -125,27 +143,65 @@ bool MP4::File::save()
|
|
|
|
|
} else { \
|
|
|
|
|
MP4SetMetadata##tag(handle, mp4tag->val().toCString(true)); \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
setmeta(title, Name); |
|
|
|
|
setmeta(artist, Artist); |
|
|
|
|
setmeta(album, Album); |
|
|
|
|
setmeta(comment, Comment); |
|
|
|
|
setmeta(genre, Genre); |
|
|
|
|
setmeta(composer, Writer); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
char buf[100] = ""; |
|
|
|
|
if(mp4tag->year()) |
|
|
|
|
snprintf(buf, sizeof(buf), "%u", mp4tag->year()); |
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
MP4TagsSetReleaseDate(filetags, buf); |
|
|
|
|
#else |
|
|
|
|
MP4SetMetadataYear(handle, buf); |
|
|
|
|
#endif |
|
|
|
|
u_int16_t t1, t2; |
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
MP4TagTrack track = *filetags->track; |
|
|
|
|
track.index = t1; |
|
|
|
|
MP4TagsSetTrack(filetags, &track); |
|
|
|
|
#else |
|
|
|
|
MP4GetMetadataTrack(handle, &t1, &t2); |
|
|
|
|
MP4SetMetadataTrack(handle, mp4tag->track(), t2); |
|
|
|
|
if(mp4tag->bpm() != 0) |
|
|
|
|
#endif |
|
|
|
|
if(mp4tag->bpm() != 0) { |
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
u_int16_t tempo = mp4tag->bpm(); |
|
|
|
|
MP4TagsSetTempo(filetags, &tempo); |
|
|
|
|
#else |
|
|
|
|
MP4SetMetadataTempo(handle, mp4tag->bpm()); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
if(mp4tag->compilation() != MP4::Tag::Undefined) { |
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
u_int8_t compilation = mp4tag->compilation(); |
|
|
|
|
MP4TagsSetCompilation(filetags, &compilation); |
|
|
|
|
#else |
|
|
|
|
MP4SetMetadataCompilation(handle, mp4tag->compilation()); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
if(mp4tag->cover().size()) { |
|
|
|
|
MP4TagArtwork art; |
|
|
|
|
art.size = mp4tag->cover().size(); |
|
|
|
|
art.data = mp4tag->cover().size() ? const_cast<u_int8_t *>( reinterpret_cast<const u_int8_t *>( mp4tag->cover().data() ) ) : 0; |
|
|
|
|
art.type = MP4_ART_UNDEFINED; // delegate typing to libmp4v2
|
|
|
|
|
if(filetags->artworkCount > 0) { |
|
|
|
|
MP4TagsSetArtwork(filetags, 0, &art); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
MP4TagsAddArtwork(filetags, &art); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
MP4SetMetadataCoverArt(handle, mp4tag->cover().size() ? const_cast<u_int8_t *>( reinterpret_cast<const u_int8_t *>( mp4tag->cover().data() ) ) : 0, mp4tag->cover().size()); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef MP4V2_HAS_WRITE_BUG |
|
|
|
|
// set the saved data again
|
|
|
|
@ -159,6 +215,10 @@ bool MP4::File::save()
|
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef USE_ITMF_TAGS |
|
|
|
|
MP4TagsStore(filetags, handle); |
|
|
|
|
MP4TagsFree(filetags); |
|
|
|
|
#endif |
|
|
|
|
MP4Close(handle); |
|
|
|
|
|
|
|
|
|
mp4file = MP4Read(name()); |
|
|
|
|