From: hj kim Date: Mon, 1 Jun 2020 09:10:38 +0000 (+0900) Subject: Support metadata editing for Ogg format X-Git-Tag: submit/tizen/20200630.005817~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F82%2F234982%2F23;p=platform%2Fcore%2Fapi%2Fmetadata-editor.git Support metadata editing for Ogg format Change-Id: Iffee36e6fc978697047c815908f05229e462ec7c --- diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 1696539..22a0115 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -437,6 +437,16 @@ static int __FLAC_getNumberOfPictures(FLAC::File *file, char **value) 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; @@ -478,6 +488,8 @@ static int __metadata_editor_get_file_type(const char *path) 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; } @@ -493,6 +505,10 @@ static int __metadata_editor_get_file_type(const char *path) 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; } @@ -632,7 +648,6 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * _file = new FLAC::File(path); break; -#if 0 case METADATA_EDITOR_FORMAT_OGG_VORBIS: _file = new Ogg::Vorbis::File(path); break; @@ -640,10 +655,8 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * 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; @@ -761,7 +774,6 @@ static int __metadata_editor_get_flac_metadata(metadata_editor_s *metadata, meta } } -#if 0 static int __get_ogg_metadata(Ogg::XiphComment *xtag, metadata_editor_attr_e attribute, char **value) { switch (attribute) { @@ -777,6 +789,7 @@ static int __get_ogg_metadata(Ogg::XiphComment *xtag, metadata_editor_attr_e att 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; @@ -808,7 +821,6 @@ static int __metadata_editor_get_ogg_flac_metadata(metadata_editor_s *metadata, 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) { @@ -839,13 +851,12 @@ extern "C" int metadata_editor_get_metadata(metadata_editor_h metadata, metadata 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); @@ -952,7 +963,6 @@ static int __metadata_editor_set_flac_metadata(metadata_editor_s *metadata, meta } } -#if 0 static int __set_ogg_metadata(Ogg::XiphComment *xtag, metadata_editor_attr_e attribute, const char *value) { switch (attribute) { @@ -1005,7 +1015,6 @@ static int __metadata_editor_set_ogg_flac_metadata(metadata_editor_s *metadata, 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) { @@ -1036,13 +1045,13 @@ extern "C" int metadata_editor_set_metadata(metadata_editor_h metadata, metadata 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); @@ -1082,10 +1091,8 @@ extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) 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; @@ -1226,6 +1233,45 @@ static int __get_wav_picture(metadata_editor_s *metadata, int index, void **pict 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(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(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(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; @@ -1238,7 +1284,7 @@ extern "C" int metadata_editor_get_picture(metadata_editor_h metadata, int index 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); @@ -1251,6 +1297,12 @@ extern "C" int metadata_editor_get_picture(metadata_editor_h metadata, int index 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; @@ -1323,6 +1375,37 @@ static int __append_wav_picture(metadata_editor_s *metadata, const char *picture return __append_APIC(dynamic_cast(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(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(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; @@ -1360,6 +1443,13 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const 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; @@ -1441,6 +1531,38 @@ static int __remove_wav_picture(metadata_editor_s *metadata, int index) return __remove_APIC(dynamic_cast(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(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(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; @@ -1464,6 +1586,12 @@ extern "C" int metadata_editor_remove_picture(metadata_editor_h metadata, int in 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; @@ -1489,14 +1617,15 @@ extern "C" int metadata_editor_destroy(metadata_editor_h metadata) case METADATA_EDITOR_FORMAT_FLAC: delete dynamic_cast(_metadata->file); break; -#if 0 + case METADATA_EDITOR_FORMAT_OGG_VORBIS: delete dynamic_cast(_metadata->file); break; + case METADATA_EDITOR_FORMAT_OGG_FLAC: delete dynamic_cast(_metadata->file); break; -#endif + case METADATA_EDITOR_FORMAT_WAV: delete dynamic_cast(_metadata->file); break;