Support metadata editing for Ogg format 82/234982/23
authorhj kim <backto.kim@samsung.com>
Mon, 1 Jun 2020 09:10:38 +0000 (18:10 +0900)
committerhj kim <backto.kim@samsung.com>
Tue, 16 Jun 2020 09:10:39 +0000 (18:10 +0900)
Change-Id: Iffee36e6fc978697047c815908f05229e462ec7c

src/metadata_editor.cpp

index 1696539ea31536825126eea080edc7687321137c..22a011534a260ac6c73490b30e09ada2c12827bd 100755 (executable)
@@ -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<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;
@@ -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<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;
@@ -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<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;
@@ -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<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;