return METADATA_EDITOR_ERROR_NONE;
}
+static int __OGG_getNumberOfPictures(Ogg::XiphComment *xtag, char **value)
+{
+ if (xtag)
+ *value = g_strdup_printf("%u", xtag->pictureList().size());
+ else
+ *value = g_strdup("0");
+
+ return METADATA_EDITOR_ERROR_NONE;
+}
+
static int __metadata_editor_get_file_ext(const char *file_path, char *file_ext, int max_len)
{
int i = 0;
return METADATA_EDITOR_FORMAT_FLAC;
else if (strcasecmp(ext, "WAV") == 0)
return METADATA_EDITOR_FORMAT_WAV;
+ else if (strcasecmp(ext, "OGG") == 0) //Fix Me!flac_ogg is unusual. So if file extention of ogg is considered vorbis ogg
+ return METADATA_EDITOR_FORMAT_OGG_VORBIS;
else
return METADATA_EDITOR_FORMAT_NOTYPE;
}
return METADATA_EDITOR_FORMAT_FLAC;
else if (strstr(mimetype, "wav") != NULL)
return METADATA_EDITOR_FORMAT_WAV;
+ else if (strstr(mimetype, "vorbis+ogg") != NULL)
+ return METADATA_EDITOR_FORMAT_OGG_VORBIS;
+ else if (strstr(mimetype, "flac+ogg") != NULL)
+ return METADATA_EDITOR_FORMAT_OGG_FLAC;
return METADATA_EDITOR_FORMAT_NOTYPE;
}
_file = new FLAC::File(path);
break;
-#if 0
case METADATA_EDITOR_FORMAT_OGG_VORBIS:
_file = new Ogg::Vorbis::File(path);
break;
case METADATA_EDITOR_FORMAT_OGG_FLAC:
_file = new Ogg::FLAC::File(path);
break;
-#endif
case METADATA_EDITOR_FORMAT_WAV:
- // Allocate the file object in memory to work with it later on
_file = new RIFF::WAV::File(path);
break;
}
}
-#if 0
static int __get_ogg_metadata(Ogg::XiphComment *xtag, metadata_editor_attr_e attribute, char **value)
{
switch (attribute) {
case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(xtag, "TRACKNUMBER", value);
case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(xtag, "CONDUCTOR", value);
case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(xtag, "LYRICS", value);
+ case METADATA_EDITOR_ATTR_PICTURE_NUM: return __OGG_getNumberOfPictures(xtag, value);
default:
metadata_editor_error("Invalid attribute [%d]", attribute);
return METADATA_EDITOR_ERROR_INVALID_PARAMETER;
return __get_ogg_metadata(_file->tag(), attribute, value);
}
-#endif
static int __metadata_editor_get_wav_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value)
{
case METADATA_EDITOR_FORMAT_FLAC:
return __metadata_editor_get_flac_metadata(_metadata, attribute, value);
-#if 0
+
case METADATA_EDITOR_FORMAT_OGG_VORBIS:
return __metadata_editor_get_ogg_vorbis_metadata(_metadata, attribute, value);
case METADATA_EDITOR_FORMAT_OGG_FLAC:
return __metadata_editor_get_ogg_flac_metadata(_metadata, attribute, value);
-#endif
case METADATA_EDITOR_FORMAT_WAV:
return __metadata_editor_get_wav_metadata(_metadata, attribute, value);
}
}
-#if 0
static int __set_ogg_metadata(Ogg::XiphComment *xtag, metadata_editor_attr_e attribute, const char *value)
{
switch (attribute) {
return __set_ogg_metadata(xtag, attribute, value);
}
-#endif
static int __metadata_editor_set_wav_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, const char *value)
{
case METADATA_EDITOR_FORMAT_FLAC:
return __metadata_editor_set_flac_metadata(_metadata, attribute, value);
-#if 0
+
case METADATA_EDITOR_FORMAT_OGG_VORBIS:
return __metadata_editor_set_ogg_vorbis_metadata(_metadata, attribute, value);
case METADATA_EDITOR_FORMAT_OGG_FLAC:
return __metadata_editor_set_ogg_flac_metadata(_metadata, attribute, value);
-#endif
+
case METADATA_EDITOR_FORMAT_WAV:
return __metadata_editor_set_wav_metadata(_metadata, attribute, value);
case METADATA_EDITOR_FORMAT_MP4: {
case METADATA_EDITOR_FORMAT_FLAC:
-#if 0
case METADATA_EDITOR_FORMAT_OGG_VORBIS:
case METADATA_EDITOR_FORMAT_OGG_FLAC:
-#endif
case METADATA_EDITOR_FORMAT_WAV:
if (_metadata->file->save())
return METADATA_EDITOR_ERROR_NONE;
return __get_APIC(_file->tag(), index, picture, size, mime_type);
}
+static int __get_ogg_picture(Ogg::XiphComment *xtag, int index, void **picture, int *size, char **mime_type)
+{
+ int ret = METADATA_EDITOR_ERROR_NONE;
+
+ metadata_editor_retvm_if(!xtag, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Tag does not exist");
+
+ auto lst = xtag->pictureList();
+
+ ret = __is_valid_picture_index(lst.isEmpty(), lst.size(), index);
+ metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "Invalid picture index");
+
+ auto pictureFrame = static_cast<FLAC::Picture*>(lst[index]);
+
+ int pictureSize = pictureFrame->data().size();
+ metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Size of picture is 0");
+
+ *picture = g_memdup(pictureFrame->data().data(), pictureSize);
+ *size = pictureSize;
+ *mime_type = __get_mime_type(pictureFrame->mimeType());
+
+ return METADATA_EDITOR_ERROR_NONE;
+}
+
+static int __get_ogg_vorbis_picture(metadata_editor_s *metadata, int index, void **picture, int *size, char **mime_type)
+{
+ auto _file = dynamic_cast<Ogg::Vorbis::File*>(metadata->file);
+ metadata_editor_retvm_if(!_file, METADATA_EDITOR_ERROR_OPERATION_FAILED, "fail to dynamic_cast");
+
+ return __get_ogg_picture(_file->tag(), index, picture, size, mime_type);
+}
+
+static int __get_ogg_flac_picture(metadata_editor_s *metadata, int index, void **picture, int *size, char **mime_type)
+{
+ auto _file = dynamic_cast<Ogg::FLAC::File*>(metadata->file);
+ metadata_editor_retvm_if(!_file, METADATA_EDITOR_ERROR_OPERATION_FAILED, "fail to dynamic_cast");
+
+ return __get_ogg_picture(_file->tag(), index, picture, size, mime_type);
+}
+
extern "C" int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **picture, int *size, char **mime_type)
{
int ret = METADATA_EDITOR_ERROR_NONE;
metadata_editor_debug("file format [%d]", _metadata->filetype);
- switch (_metadata->filetype) { // Process the file according to the specified file type
+ switch (_metadata->filetype) {
case METADATA_EDITOR_FORMAT_MP3:
return __get_mp3_picture(_metadata, index, picture, size, mime_type);
case METADATA_EDITOR_FORMAT_WAV:
return __get_wav_picture(_metadata, index, picture, size, mime_type);
+ case METADATA_EDITOR_FORMAT_OGG_VORBIS:
+ return __get_ogg_vorbis_picture(_metadata, index, picture, size, mime_type);
+
+ case METADATA_EDITOR_FORMAT_OGG_FLAC:
+ return __get_ogg_flac_picture(_metadata, index, picture, size, mime_type);
+
default:
metadata_editor_error("Invalid file type [%d]", _metadata->filetype);
return METADATA_EDITOR_ERROR_INVALID_PARAMETER;
return __append_APIC(dynamic_cast<ID3v2::Tag*>(metadata->file->tag()), picture, size, mime_type);
}
+static int __append_ogg_picture(Ogg::XiphComment *xtag, const char *picture, size_t size, const char *mime_type)
+{
+ metadata_editor_retvm_if(!xtag, METADATA_EDITOR_ERROR_METADATA_UPDATE_NOT_POSSIBLE, "Tag does not exist");
+
+ auto frontCover = new FLAC::Picture;
+
+ frontCover->setData(ByteVector(picture, size));
+ frontCover->setType(FLAC::Picture::FrontCover);
+ frontCover->setMimeType(mime_type);
+
+ xtag->addPicture(frontCover);
+
+ return METADATA_EDITOR_ERROR_NONE;
+}
+
+static int __append_ogg_vorbis_picture(metadata_editor_s *metadata, const char *picture, size_t size, const char *mime_type)
+{
+ auto _file = dynamic_cast<Ogg::Vorbis::File*>(metadata->file);
+ metadata_editor_retvm_if(!_file, METADATA_EDITOR_ERROR_OPERATION_FAILED, "fail to dynamic_cast");
+
+ return __append_ogg_picture(_file->tag(), picture, size, mime_type);
+}
+
+static int __append_ogg_flac_picture(metadata_editor_s *metadata, const char *picture, size_t size, const char *mime_type)
+{
+ auto _file = dynamic_cast<Ogg::FLAC::File*>(metadata->file);
+ metadata_editor_retvm_if(!_file, METADATA_EDITOR_ERROR_OPERATION_FAILED, "fail to dynamic_cast");
+
+ return __append_ogg_picture(_file->tag(), picture, size, mime_type);
+}
+
extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const char *path)
{
int ret = METADATA_EDITOR_ERROR_NONE;
ret = __append_wav_picture(_metadata, picture, size, mime_type);
break;
+ case METADATA_EDITOR_FORMAT_OGG_VORBIS:
+ ret = __append_ogg_vorbis_picture(_metadata, picture, size, mime_type);
+ break;
+
+ case METADATA_EDITOR_FORMAT_OGG_FLAC:
+ ret = __append_ogg_flac_picture(_metadata, picture, size, mime_type);
+ break;
default: {
metadata_editor_error("Invalid file type [%d]", _metadata->filetype);
ret = METADATA_EDITOR_ERROR_INVALID_PARAMETER;
return __remove_APIC(dynamic_cast<ID3v2::Tag*>(metadata->file->tag()), index);
}
+static int __remove_ogg_picture(Ogg::XiphComment *xtag, int index)
+{
+ int ret = METADATA_EDITOR_ERROR_NONE;
+
+ metadata_editor_retvm_if(!xtag, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Tag does not exist");
+
+ auto lst = xtag->pictureList();
+
+ ret = __is_valid_picture_index(lst.isEmpty(), lst.size(), index);
+ metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "Invalid picture index");
+
+ xtag->removePicture(lst[index], false);
+
+ return METADATA_EDITOR_ERROR_NONE;
+}
+
+static int __remove_ogg_vorbis_picture(metadata_editor_s *metadata, int index)
+{
+ auto _file = dynamic_cast<Ogg::Vorbis::File*>(metadata->file);
+ metadata_editor_retvm_if(!_file, METADATA_EDITOR_ERROR_OPERATION_FAILED, "fail to dynamic_cast");
+
+ return __remove_ogg_picture(_file->tag(), index);
+}
+
+static int __remove_ogg_flac_picture(metadata_editor_s *metadata, int index)
+{
+ auto _file = dynamic_cast<Ogg::FLAC::File*>(metadata->file);
+ metadata_editor_retvm_if(!_file, METADATA_EDITOR_ERROR_OPERATION_FAILED, "fail to dynamic_cast");
+
+ return __remove_ogg_picture(_file->tag(), index);
+}
+
extern "C" int metadata_editor_remove_picture(metadata_editor_h metadata, int index)
{
int ret = METADATA_EDITOR_ERROR_NONE;
case METADATA_EDITOR_FORMAT_WAV:
return __remove_wav_picture(_metadata, index);
+ case METADATA_EDITOR_FORMAT_OGG_VORBIS:
+ return __remove_ogg_vorbis_picture(_metadata, index);
+
+ case METADATA_EDITOR_FORMAT_OGG_FLAC:
+ return __remove_ogg_flac_picture(_metadata, index);
+
default:
metadata_editor_error("Invalid file type [%d]", _metadata->filetype);
return METADATA_EDITOR_ERROR_INVALID_PARAMETER;
case METADATA_EDITOR_FORMAT_FLAC:
delete dynamic_cast<TagLib::FLAC::File*>(_metadata->file);
break;
-#if 0
+
case METADATA_EDITOR_FORMAT_OGG_VORBIS:
delete dynamic_cast<TagLib::Ogg::Vorbis::File*>(_metadata->file);
break;
+
case METADATA_EDITOR_FORMAT_OGG_FLAC:
delete dynamic_cast<TagLib::Ogg::FLAC::File*>(_metadata->file);
break;
-#endif
+
case METADATA_EDITOR_FORMAT_WAV:
delete dynamic_cast<TagLib::RIFF::WAV::File*>(_metadata->file);
break;