From 5178d32f388f7872a3b6d5c20f23681c18952903 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Tue, 2 Jul 2019 09:27:44 +0900 Subject: [PATCH 01/16] Fix build error Change-Id: I7e5f0b6e080785c32c2dda1bf440ced048aaab3e Signed-off-by: Minje Ahn --- packaging/capi-media-metadata-editor.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/capi-media-metadata-editor.spec b/packaging/capi-media-metadata-editor.spec index d3625a7..81bc1ee 100755 --- a/packaging/capi-media-metadata-editor.spec +++ b/packaging/capi-media-metadata-editor.spec @@ -90,7 +90,7 @@ install -m 0644 metadata-editor.zip %{buildroot}%{_datadir}/gcov/ %files devel %{_includedir}/metadata-editor/*.h -%{_libdir}/pkgconfig/capi-media-metadata-editor.pci +%{_libdir}/pkgconfig/capi-media-metadata-editor.pc %if 0%{?gcov:1} %files gcov -- 2.7.4 From af03f9f54b78bc7630169f85127f03e9a24834f2 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Tue, 2 Jul 2019 10:45:02 +0900 Subject: [PATCH 02/16] Remove check for gcov Change-Id: I99fcdd951a0afc327f39606167262e563c20c28c Signed-off-by: Minje Ahn --- packaging/capi-media-metadata-editor.spec | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packaging/capi-media-metadata-editor.spec b/packaging/capi-media-metadata-editor.spec index 81bc1ee..a1b40b2 100755 --- a/packaging/capi-media-metadata-editor.spec +++ b/packaging/capi-media-metadata-editor.spec @@ -12,10 +12,6 @@ BuildRequires: pkgconfig(taglib) BuildRequires: pkgconfig(aul) Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig -%if 0%{?gcov:1} -BuildRequires: lcov -BuildRequires: zip -%endif %description A media metadata editor library in Tizen Native API. @@ -66,20 +62,11 @@ find . -name '*.gcno' -exec cp '{}' gcov-obj ';' rm -rf %{buildroot} %make_install -if 0%{?gcov:1} +%if 0%{?gcov:1} mkdir -p %{buildroot}%{_datadir}/gcov/obj install -m 0644 gcov-obj/* %{buildroot}%{_datadir}/gcov/obj %endif -%check -ctest --output-on-failure %{?_smp_mflags} -%if 0%{?gcov:1} -lcov -c --ignore-errors graph --no-external -q -d . -o metadata-editor.info -genhtml metadata-editor.info -o metadata-editor.out -zip -r metadata-editor.zip metadata-editor.out metadata-editor.info -install -m 0644 metadata-editor.zip %{buildroot}%{_datadir}/gcov/ -%endif - %post -p /sbin/ldconfig %postun -p /sbin/ldconfig -- 2.7.4 From a393b2b577810bc6e93996c50ac3a608367382c7 Mon Sep 17 00:00:00 2001 From: hj kim Date: Tue, 27 Aug 2019 11:01:07 +0900 Subject: [PATCH 03/16] Update code to reduce Cyclomatic Complexity and DC Change-Id: I2d9ea5df5687c41329981c77df0aa6be0c0592c5 --- src/metadata_editor.cpp | 981 ++++++++++++++++++++++++++---------------------- 1 file changed, 527 insertions(+), 454 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 92b73b4..be3c632 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -51,18 +51,49 @@ typedef enum { METADATA_EDITOR_FORMAT_NOTYPE = 0xFF /**< Error type. File type is not correct or not specified */ } metadata_editor_format_e; +static int __check_metadata_parameter(metadata_editor_s *metadata) +{ + metadata_editor_retvm_if(!metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); + metadata_editor_retvm_if(!metadata->file, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); + metadata_editor_retvm_if(!metadata->isOpen, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + + return METADATA_EDITOR_ERROR_NONE; +} + +static int __check_metadata_set_parameter(metadata_editor_s *metadata) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_parameter"); + + metadata_editor_retvm_if(metadata->isReadOnly, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File is readonly. Unable to modify"); + + return METADATA_EDITOR_ERROR_NONE; +} + +static int __check_metadata_get_parameter(metadata_editor_s *metadata, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_parameter"); + + metadata_editor_retvm_if(!value, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid value"); + + return METADATA_EDITOR_ERROR_NONE; +} // *** This is an auxiliary function that is used to get the frame value *** // // *** It operates with frames that exists both in ID3v1 and ID3v2 tags *** // static int __ID3_getTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, char** value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); - // Check if the file, given through metadata, exists and is opened correctly *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); // Check if the frame is empty (nothing to read) or ID3v2 tag does not exist if (!tag2 || tag2->frameListMap()[frameID].isEmpty()) { @@ -147,16 +178,12 @@ static int __ID3_getTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1: // *** This is an auxiliary function that is used to write the new value to the frame *** // // *** It operates with frames that exists both in ID3v1 and ID3v2 tags *** // static int __ID3_setTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, const char* value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exists - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); // If the pointer is NULL or c-string is empty - handle as request for deletion if (!value || (*value == '\0')) { @@ -216,14 +243,13 @@ static int __ID3_setTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1: // *** This function reads frames that exist only in ID3v2 tag *** // static int __ID3_getFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, const char* frameID, char** value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); - // Check if the file, given through metadata, exists and is opened correctly *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); // Check if the frame is empty (nothing to read) or ID3v2 tag does not exist metadata_editor_retvm_if(!tag2 || tag2->frameListMap()[frameID].isEmpty(), METADATA_EDITOR_ERROR_NONE, "The frame %s does not exist", frameID); @@ -245,16 +271,12 @@ static int __ID3_getFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag // *** This function writes frames that exist only in ID3v2 tag *** // static int __ID3_setFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, const char* frameID, const char* value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(frameID == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!frameID, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid frameID"); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); // If the pointer is NULL or c-string is empty - handle as request for deletion if (!value || (*value == '\0')) { @@ -283,16 +305,11 @@ static int __ID3_setFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag // *** This function is used to receive the number of pictures stored in ID3v2 tag of file *** // static int __ID3_getNumberOfPictures(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; // link to picture frames in tag // Check if the frames exist @@ -309,16 +326,11 @@ static int __ID3_getNumberOfPictures(metadata_editor_s* _metadata, TagLib::ID3v2 // *** This function is used to receive unsynchronized lyrics from ID3v2 tag in file *** // // *** This frame differs from other string-type frames and uses UnsynchronizedLyricsFrame instead of TextIdentificationFrame *** // static int __ID3_getLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag does not exist. Can not process further"); TagLib::ID3v2::FrameList lst = tag2->frameListMap()["USLT"]; // link to unsynchronized lyric frames in tag // Check if frames exist in file @@ -340,15 +352,11 @@ static int __ID3_getLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag // *** This function is used to set text in comment frame. It processes both ID3v1 and ID3v2 tags *** // // *** Comment frame is different from other string-type frames. It uses CommentsFrame instead of TextIdentificationFrame *** // static int __ID3_setTwixCommentFrame(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); // If the pointer is NULL or c-string is empty - handle as request for deletion if (!value || (*value == '\0')) { @@ -382,15 +390,11 @@ static int __ID3_setTwixCommentFrame(metadata_editor_s* _metadata, TagLib::ID3v1 // *** This function is used to set text in Lyrics frame *** // // *** Lyrics frame is different from other string-type frames and uses UnsynchronizedLyricsFrame instead of TextIdentificationFrame *** // static int __ID3_setLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, const char* value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); - - // Check if the valid tag pointer exist - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); TagLib::ID3v2::FrameList lst = tag2->frameListMap()["USLT"]; // link to unsynchronized lyric frames in tag // If the pointer is NULL or c-string is empty - handle as request for deletion @@ -421,16 +425,12 @@ static int __ID3_setLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag } // *** This function extracts string values from tag in MP4 file *** // -static int __MP4_getStringItem(metadata_editor_s* _metadata, const char* itemname, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); +static int __MP4_getStringItem(metadata_editor_s* _metadata, const char* itemname, char **value) { + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -458,15 +458,11 @@ static int __MP4_getStringItem(metadata_editor_s* _metadata, const char* itemnam // *** This function extracts integer value from item in MP4 tag *** // static int __MP4_getIntegerItem(metadata_editor_s* _metadata, const char* itemname, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -492,14 +488,11 @@ static int __MP4_getIntegerItem(metadata_editor_s* _metadata, const char* itemna // *** This function adds (or changes) string item of itemname type *** // static int __MP4_updateStringItem(metadata_editor_s* _metadata, const char* itemname, const char* value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -523,14 +516,11 @@ static int __MP4_updateStringItem(metadata_editor_s* _metadata, const char* item // *** This function adds (or changes) integer item of itemname type *** // static int __MP4_updateIntegerItem(metadata_editor_s* _metadata, const char* itemname, const char* value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(itemname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!itemname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid itemname"); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -560,14 +550,10 @@ static int __MP4_updateIntegerItem(metadata_editor_s* _metadata, const char* ite // *** This function is used to find the number of pictures stored in MP4 file *** // static int __MP4_getNumberOfPictures(metadata_editor_s* _metadata, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail."); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; TagLib::MP4::Tag* tag = _file->tag(); @@ -590,14 +576,11 @@ static int __MP4_getNumberOfPictures(metadata_editor_s* _metadata, char** value) #if 0 // *** This function is used to extract string from Xiph Comment field *** // static int __xiph_getFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::XiphComment* xtag, const char* fieldname, char** value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(fieldname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Value Pointer"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!fieldname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid fieldname"); metadata_editor_retvm_if(!xtag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); const TagLib::Ogg::FieldListMap& fieldMap = xtag->fieldListMap(); @@ -623,14 +606,11 @@ static int __xiph_getFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::XiphC // *** This function is used to write string into Xiph Comment fields *** // static int __xiph_updateFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::XiphComment* xtag, const char* fieldname, const char* value) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(fieldname == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!fieldname, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid fieldname"); metadata_editor_retvm_if(!xtag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); // Check if it is a request for deletion @@ -647,14 +627,10 @@ static int __xiph_updateFieldValue(metadata_editor_s* _metadata, TagLib::Ogg::Xi // *** This function is used to receive the number of pictures in FLAC file *** // static int __FLAC_getNumberOfPictures(metadata_editor_s* _metadata, char** value) { - // Check if parameters are valid - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Value Pointer"); - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); + int ret = METADATA_EDITOR_ERROR_NONE; - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + ret = __check_metadata_get_parameter(_metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); TagLib::FLAC::File* _file = (TagLib::FLAC::File*) _metadata->file; if (_file->pictureList().isEmpty()) { @@ -1039,339 +1015,449 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * } } +static int __metadata_editor_get_mp3_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tag pointers + TagLib::MPEG::File* _file = (TagLib::MPEG::File*)metadata->file; + TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); + TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(); + + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "COMM", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getTwixFrameByName(metadata, tag1, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(metadata, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(metadata, tag2, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_mp4_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __MP4_getStringItem(metadata, "\xA9""ART", value); + case METADATA_EDITOR_ATTR_TITLE: return __MP4_getStringItem(metadata, "\xA9""nam", value); + case METADATA_EDITOR_ATTR_ALBUM: return __MP4_getStringItem(metadata, "\xA9""alb", value); + case METADATA_EDITOR_ATTR_GENRE: return __MP4_getStringItem(metadata, "\xA9""gen", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_getStringItem(metadata, "\xA9""wrt", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_getStringItem(metadata, "cprt", value); + case METADATA_EDITOR_ATTR_DATE: return __MP4_getStringItem(metadata, "\xA9""day", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_getStringItem(metadata, "desc", value); + case METADATA_EDITOR_ATTR_COMMENT: return __MP4_getStringItem(metadata, "\xA9""cmt", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_getIntegerItem(metadata, "trkn", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_getStringItem(metadata, "cond", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_getStringItem(metadata, "\xA9""lyr", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __MP4_getNumberOfPictures(metadata, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; +} +} + +#if 0 +static int __metadata_editor_get_flac_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::FLAC::File* _file = (TagLib::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->xiphComment(false); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Tag does not exist"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(metadata, xtag, "LYRICS", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __FLAC_getNumberOfPictures(metadata, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_ogg_vorbis_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Tag does not exist"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_ogg_flac_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Tag does not exist"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_get_wav_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_get_parameter(metadata, value); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tag pointers + TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)metadata->file; + TagLib::ID3v2::Tag* tag2 = _file->tag(); + + if (tag2 == NULL) { // Check if we have a valid tag for processing + metadata_editor_error("Error. ID3v2 tag does not exist. Can not proceed metadata extraction"); + *value = NULL; + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + switch (attribute) { // Check which one of frame types was given to the function for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getFrameByName(metadata, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_getFrameByName(metadata, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getFrameByName(metadata, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_getFrameByName(metadata, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_getFrameByName(metadata, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getFrameByName(metadata, tag2, "COMM", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getFrameByName(metadata, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(metadata, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(metadata, tag2, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} +#endif + // *** This function is used to get the tag frame (field, item - each tag has its own name for data unit) from file *** // extern "C" int metadata_editor_get_metadata(metadata_editor_h metadata, metadata_editor_attr_e attribute, char **value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - metadata_editor_retvm_if(value == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Value Pointer"); metadata_editor_s *_metadata = (metadata_editor_s*)metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - - // Check if the file, given through metadata, exists and is opened correctly - *value = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); + metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - // Bring the pointer to actual file type and make tag pointers - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); - TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(); + case METADATA_EDITOR_FORMAT_MP3: + return __metadata_editor_get_mp3_metadata(_metadata, attribute, value); + + case METADATA_EDITOR_FORMAT_MP4: + return __metadata_editor_get_mp4_metadata(_metadata, attribute, value); - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "COMM", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getTwixFrameByName(_metadata, tag1, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(_metadata, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_MP4: { - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __MP4_getStringItem(_metadata, "\xA9""ART", value); - case METADATA_EDITOR_ATTR_TITLE: return __MP4_getStringItem(_metadata, "\xA9""nam", value); - case METADATA_EDITOR_ATTR_ALBUM: return __MP4_getStringItem(_metadata, "\xA9""alb", value); - case METADATA_EDITOR_ATTR_GENRE: return __MP4_getStringItem(_metadata, "\xA9""gen", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_getStringItem(_metadata, "\xA9""wrt", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_getStringItem(_metadata, "cprt", value); - case METADATA_EDITOR_ATTR_DATE: return __MP4_getStringItem(_metadata, "\xA9""day", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_getStringItem(_metadata, "desc", value); - case METADATA_EDITOR_ATTR_COMMENT: return __MP4_getStringItem(_metadata, "\xA9""cmt", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_getIntegerItem(_metadata, "trkn", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_getStringItem(_metadata, "cond", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_getStringItem(_metadata, "\xA9""lyr", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __MP4_getNumberOfPictures(_metadata, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } #if 0 case METADATA_EDITOR_FORMAT_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::FLAC::File* _file = (TagLib::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->xiphComment(false); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Tag does not exist"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(_metadata, xtag, "LYRICS", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __FLAC_getNumberOfPictures(_metadata, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_flac_metadata(_metadata, attribute, value); } case METADATA_EDITOR_FORMAT_OGG_VORBIS: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Tag does not exist"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_ogg_vorbis_metadata(_metadata, attribute, value); } case METADATA_EDITOR_FORMAT_OGG_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Tag does not exist"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_getFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_getFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_getFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_getFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_getFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_getFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_getFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_getFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_getFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_getFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_getFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_getFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_ogg_flac_metadata(_metadata, attribute, value); } case METADATA_EDITOR_FORMAT_WAV: { - // Bring the pointer to actual file type and make tag pointers - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; - TagLib::ID3v2::Tag* tag2 = _file->tag(); - - if (tag2 == NULL) { // Check if we have a valid tag for processing - metadata_editor_error("Error. ID3v2 tag does not exist. Can not proceed metadata extraction"); - *value = NULL; - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - - switch (attribute) { // Check which one of frame types was given to the function for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_getFrameByName(_metadata, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_getFrameByName(_metadata, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_getFrameByName(_metadata, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_getFrameByName(_metadata, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_getFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_getFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_getFrameByName(_metadata, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_getFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_getFrameByName(_metadata, tag2, "COMM", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_getFrameByName(_metadata, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_getFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_PICTURE_NUM: return __ID3_getNumberOfPictures(_metadata, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_getLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __metadata_editor_get_wav_metadata(_metadata, attribute, value); } #endif default: - metadata_editor_error("Wrong file type"); + metadata_editor_error("Wrong file type [%d]", _metadata->filetype); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_mp3_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::MPEG::File* _file = (TagLib::MPEG::File*)metadata->file; + TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); + TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(true); + + metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setTwixFrameByName(metadata, tag1, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(metadata, tag1, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(metadata, tag2, value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_mp4_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __MP4_updateStringItem(metadata, "\xA9""ART", value); + case METADATA_EDITOR_ATTR_TITLE: return __MP4_updateStringItem(metadata, "\xA9""nam", value); + case METADATA_EDITOR_ATTR_ALBUM: return __MP4_updateStringItem(metadata, "\xA9""alb", value); + case METADATA_EDITOR_ATTR_GENRE: return __MP4_updateStringItem(metadata, "\xA9""gen", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_updateStringItem(metadata, "\xA9""wrt", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_updateStringItem(metadata, "cprt", value); + case METADATA_EDITOR_ATTR_DATE: return __MP4_updateStringItem(metadata, "\xA9""day", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_updateStringItem(metadata, "desc", value); + case METADATA_EDITOR_ATTR_COMMENT: return __MP4_updateStringItem(metadata, "\xA9""cmt", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_updateIntegerItem(metadata, "trkn", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_updateStringItem(metadata, "cond", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_updateStringItem(metadata, "\xA9""lyr", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +#if 0 +static int __metadata_editor_set_flac_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::FLAC::File* _file = (TagLib::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->xiphComment(true); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_ogg_vorbis_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_ogg_flac_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)metadata->file; + TagLib::Ogg::XiphComment* xtag = _file->tag(); + if (!xtag) { // Check if we have a valid tag for processing + metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(metadata, xtag, "ARTIST", value); + case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(metadata, xtag, "TITLE", value); + case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(metadata, xtag, "ALBUM", value); + case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(metadata, xtag, "GENRE", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(metadata, xtag, "COMPOSER", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(metadata, xtag, "COPYRIGHT", value); + case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(metadata, xtag, "DATE", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(metadata, xtag, "DESCRIPTION", value); + case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(metadata, xtag, "COMMENT", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(metadata, xtag, "TRACKNUMBER", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(metadata, xtag, "CONDUCTOR", value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(metadata, xtag, "LYRICS", value); + default: + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } +} + +static int __metadata_editor_set_wav_metadata(metadata_editor_s* metadata, metadata_editor_attr_e attribute, const char* value) +{ + int ret = METADATA_EDITOR_ERROR_NONE; + + ret = __check_metadata_set_parameter(metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + + // Bring the pointer to actual file type and make tags pointers + TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)metadata->file; + TagLib::ID3v2::Tag* tag2 = _file->tag(); + // Check if the valid tag pointer exist + if (tag2 == NULL) { + metadata_editor_error("Error. ID3v2 tag was not created. Can not proceed metadata updating"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + switch (attribute) { // Check which one of frame type was given for processing + case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setFrameByName(metadata, tag2, "TPE1", value); + case METADATA_EDITOR_ATTR_TITLE: return __ID3_setFrameByName(metadata, tag2, "TIT2", value); + case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setFrameByName(metadata, tag2, "TALB", value); + case METADATA_EDITOR_ATTR_GENRE: return __ID3_setFrameByName(metadata, tag2, "TCON", value); + case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(metadata, tag2, "TCOM", value); + case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(metadata, tag2, "TCOP", value); + case METADATA_EDITOR_ATTR_DATE: return __ID3_setFrameByName(metadata, tag2, "TDRC", value); + case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(metadata, tag2, "TIT3", value); + case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setFrameByName(metadata, tag2, "TRCK", value); + case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(metadata, tag2, "TPE3", value); + case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(metadata, NULL, tag2, value); + case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(metadata, tag2, value); + default: return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } } +#endif // *** This function is used to modify the metadata (frame in tag). But it does not apply changes to file *** // extern "C" int metadata_editor_set_metadata(metadata_editor_h metadata, metadata_editor_attr_e attribute, const char* value) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - // Bring the pointer to actual file type and make tags pointers - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); - TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(true); + case METADATA_EDITOR_FORMAT_MP3: + return __metadata_editor_set_mp3_metadata(_metadata, attribute, value); - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. ID3v2 tag was not created. Can not proceed metadata updating"); + case METADATA_EDITOR_FORMAT_MP4: + return __metadata_editor_set_mp4_metadata(_metadata, attribute, value); - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setTwixFrameByName(_metadata, tag1, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(_metadata, tag1, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_MP4: { - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __MP4_updateStringItem(_metadata, "\xA9""ART", value); - case METADATA_EDITOR_ATTR_TITLE: return __MP4_updateStringItem(_metadata, "\xA9""nam", value); - case METADATA_EDITOR_ATTR_ALBUM: return __MP4_updateStringItem(_metadata, "\xA9""alb", value); - case METADATA_EDITOR_ATTR_GENRE: return __MP4_updateStringItem(_metadata, "\xA9""gen", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __MP4_updateStringItem(_metadata, "\xA9""wrt", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __MP4_updateStringItem(_metadata, "cprt", value); - case METADATA_EDITOR_ATTR_DATE: return __MP4_updateStringItem(_metadata, "\xA9""day", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __MP4_updateStringItem(_metadata, "desc", value); - case METADATA_EDITOR_ATTR_COMMENT: return __MP4_updateStringItem(_metadata, "\xA9""cmt", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __MP4_updateIntegerItem(_metadata, "trkn", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __MP4_updateStringItem(_metadata, "cond", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __MP4_updateStringItem(_metadata, "\xA9""lyr", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } #if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::FLAC::File* _file = (TagLib::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->xiphComment(true); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_OGG_VORBIS: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_OGG_FLAC: { - // Bring the pointer to actual file type and make tags pointers - TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)_metadata->file; - TagLib::Ogg::XiphComment* xtag = _file->tag(); - if (!xtag) { // Check if we have a valid tag for processing - metadata_editor_error("Error. Xiph Comment was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __xiph_updateFieldValue(_metadata, xtag, "ARTIST", value); - case METADATA_EDITOR_ATTR_TITLE: return __xiph_updateFieldValue(_metadata, xtag, "TITLE", value); - case METADATA_EDITOR_ATTR_ALBUM: return __xiph_updateFieldValue(_metadata, xtag, "ALBUM", value); - case METADATA_EDITOR_ATTR_GENRE: return __xiph_updateFieldValue(_metadata, xtag, "GENRE", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __xiph_updateFieldValue(_metadata, xtag, "COMPOSER", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __xiph_updateFieldValue(_metadata, xtag, "COPYRIGHT", value); - case METADATA_EDITOR_ATTR_DATE: return __xiph_updateFieldValue(_metadata, xtag, "DATE", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __xiph_updateFieldValue(_metadata, xtag, "DESCRIPTION", value); - case METADATA_EDITOR_ATTR_COMMENT: return __xiph_updateFieldValue(_metadata, xtag, "COMMENT", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __xiph_updateFieldValue(_metadata, xtag, "TRACKNUMBER", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __xiph_updateFieldValue(_metadata, xtag, "CONDUCTOR", value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __xiph_updateFieldValue(_metadata, xtag, "LYRICS", value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } - case METADATA_EDITOR_FORMAT_WAV: { - // Bring the pointer to actual file type and make tags pointers - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; - TagLib::ID3v2::Tag* tag2 = _file->tag(); - // Check if the valid tag pointer exist - if (tag2 == NULL) { - metadata_editor_error("Error. ID3v2 tag was not created. Can not proceed metadata updating"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } + case METADATA_EDITOR_FORMAT_FLAC: + return __metadata_editor_set_flac_metadata(_metadata, attribute, value); + + 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); + + case METADATA_EDITOR_FORMAT_WAV: + return __metadata_editor_set_wav_metadata(_metadata, attribute, value); - switch (attribute) { // Check which one of frame type was given for processing - case METADATA_EDITOR_ATTR_ARTIST: return __ID3_setFrameByName(_metadata, tag2, "TPE1", value); - case METADATA_EDITOR_ATTR_TITLE: return __ID3_setFrameByName(_metadata, tag2, "TIT2", value); - case METADATA_EDITOR_ATTR_ALBUM: return __ID3_setFrameByName(_metadata, tag2, "TALB", value); - case METADATA_EDITOR_ATTR_GENRE: return __ID3_setFrameByName(_metadata, tag2, "TCON", value); - case METADATA_EDITOR_ATTR_AUTHOR: return __ID3_setFrameByName(_metadata, tag2, "TCOM", value); - case METADATA_EDITOR_ATTR_COPYRIGHT: return __ID3_setFrameByName(_metadata, tag2, "TCOP", value); - case METADATA_EDITOR_ATTR_DATE: return __ID3_setFrameByName(_metadata, tag2, "TDRC", value); - case METADATA_EDITOR_ATTR_DESCRIPTION: return __ID3_setFrameByName(_metadata, tag2, "TIT3", value); - case METADATA_EDITOR_ATTR_TRACK_NUM: return __ID3_setFrameByName(_metadata, tag2, "TRCK", value); - case METADATA_EDITOR_ATTR_CONDUCTOR: return __ID3_setFrameByName(_metadata, tag2, "TPE3", value); - case METADATA_EDITOR_ATTR_COMMENT: return __ID3_setTwixCommentFrame(_metadata, NULL, tag2, value); - case METADATA_EDITOR_ATTR_UNSYNCLYRICS: return __ID3_setLyricsFrame(_metadata, tag2, value); - default: - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } - } #endif default: metadata_editor_error("Wrong file type"); @@ -1381,15 +1467,11 @@ extern "C" int metadata_editor_set_metadata(metadata_editor_h metadata, metadata // *** This function apply all changes done in the tag(s) and update them to file *** // extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - - metadata_editor_s *_metadata = (metadata_editor_s*)metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); + int ret = METADATA_EDITOR_ERROR_NONE; + metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); switch (_metadata->filetype) { // Process the file according to the specified file type case METADATA_EDITOR_FORMAT_MP3: { @@ -1454,21 +1536,20 @@ extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { extern "C" int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **picture, int *size, char **mime_type) { const char *TYPE_JPEG = "image/jpeg"; const char *TYPE_PNG = "image/png"; - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - metadata_editor_retvm_if(picture == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_retvm_if(size == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + + int ret = METADATA_EDITOR_ERROR_NONE; metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - // Check if the file, given through metadata, exists and is opened correctly + ret = __check_metadata_get_parameter(_metadata, mime_type); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!picture, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid picture"); + metadata_editor_retvm_if(!size, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid size"); + *picture = NULL; *size = 0; *mime_type = NULL; - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - switch (_metadata->filetype) { // Process the file according to the specified file type case METADATA_EDITOR_FORMAT_MP3: { TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; // Bring the pointer to actual file type @@ -1647,16 +1728,12 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const int size = 0; char *type = NULL; - // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); metadata_editor_retvm_if(path == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); ret = __metadata_editor_get_picture_info(path, &picture, &size, &type); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); @@ -1792,15 +1869,11 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const // *** This function is used to delete picture with specified index *** // extern "C" int metadata_editor_remove_picture(metadata_editor_h metadata, int index) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID handler."); - + int ret = METADATA_EDITOR_ERROR_NONE; metadata_editor_s* _metadata = (metadata_editor_s*) metadata; - metadata_editor_retvm_if(_metadata->file == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - // Check if the file, given through metadata, exists and is opened correctly - metadata_editor_retvm_if(_metadata->file && _metadata->isOpen == false, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - metadata_editor_retvm_if(_metadata->isReadOnly, METADATA_EDITOR_ERROR_OPERATION_FAILED, "File is readonly. Unable to modify"); + ret = __check_metadata_set_parameter(_metadata); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); switch (_metadata->filetype) { // Process the file according to the specified file type case METADATA_EDITOR_FORMAT_MP3: { -- 2.7.4 From e6db777a99ddd03fdaff7f24cd4bf55fa597b8c6 Mon Sep 17 00:00:00 2001 From: hj kim Date: Mon, 16 Sep 2019 11:22:35 +0900 Subject: [PATCH 04/16] Update code for checking input parameter Change-Id: I86146cc21aabea5c48b9dc26cac0bbb6ce49338d --- src/metadata_editor.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index be3c632..33f86ac 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -778,8 +778,7 @@ int __metadata_editor_get_picture_info(const char *path, void **picture, int *si // *** This function is used to allocate the metadata_editor_s in memory *** // // *** The structure metadata_editor_s contains all information about the file *** // extern "C" int metadata_editor_create(metadata_editor_h *metadata) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); + metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); metadata_editor_s *_metadata = new metadata_editor_s; // Allocate a structure for handler metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); @@ -798,8 +797,8 @@ extern "C" int metadata_editor_create(metadata_editor_h *metadata) { // *** This function is used to open the file. It creates the instance that is responsible for connection with file *** // extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char *path) { // Check if we have valid arguments to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); - metadata_editor_retvm_if(path == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID Handle"); + metadata_editor_retvm_if(!metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); + metadata_editor_retvm_if(!path, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid path"); int exist; @@ -1728,12 +1727,11 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const int size = 0; char *type = NULL; - metadata_editor_retvm_if(path == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_s* _metadata = (metadata_editor_s*) metadata; ret = __check_metadata_set_parameter(_metadata); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); + metadata_editor_retvm_if(!path, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid path"); ret = __metadata_editor_get_picture_info(path, &picture, &size, &type); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); @@ -1992,10 +1990,8 @@ extern "C" int metadata_editor_remove_picture(metadata_editor_h metadata, int in // *** This function is used to free memory that was allocated with metadata_editor_create(...) and metadata_editor_set_path(...) functions *** // extern "C" int metadata_editor_destroy(metadata_editor_h metadata) { - // Check if we have a valid argument to work with - metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "INVALID PARAMETER"); - metadata_editor_s *_metadata = (metadata_editor_s*)metadata; + metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); switch (_metadata->filetype) { case METADATA_EDITOR_FORMAT_MP3: { -- 2.7.4 From 88b56e9b59fdeb6534e299b9f8e73cd344429889 Mon Sep 17 00:00:00 2001 From: hj kim Date: Thu, 23 Apr 2020 18:38:37 +0900 Subject: [PATCH 05/16] Improve metadata_editor_get_picture() API Change-Id: Ib88f27133bd411181698150036737cfb52f37808 --- include/metadata_editor_private.h | 1 - src/metadata_editor.cpp | 348 ++++++++++++++++++++------------------ 2 files changed, 181 insertions(+), 168 deletions(-) diff --git a/include/metadata_editor_private.h b/include/metadata_editor_private.h index 767fdbb..eafbc2a 100755 --- a/include/metadata_editor_private.h +++ b/include/metadata_editor_private.h @@ -54,7 +54,6 @@ extern "C" { #endif #define LOG_TAG "CAPI_MEDIA_METADATA_EDITOR" #define META_SAFE_FREE(src) { if (src) {free(src); src = NULL; } } -#define META_MALLOC(src, size) { if (size <= 0) { src = NULL; } else { src = (char *)malloc(size); if (src) memset(src, 0x0, size); } } #define META_MAX_BUF_LEN 20 diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 33f86ac..f424edc 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -1533,190 +1533,204 @@ extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { // *** This function returns buffer with picture under the specified index and buffer's (picture's) size *** // extern "C" int metadata_editor_get_picture(metadata_editor_h metadata, int index, void **picture, int *size, char **mime_type) { - const char *TYPE_JPEG = "image/jpeg"; - const char *TYPE_PNG = "image/png"; - int ret = METADATA_EDITOR_ERROR_NONE; - metadata_editor_s* _metadata = (metadata_editor_s*) metadata; + const char *TYPE_JPEG = "image/jpeg"; + const char *TYPE_PNG = "image/png"; + int i = 0; ret = __check_metadata_get_parameter(_metadata, mime_type); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); metadata_editor_retvm_if(!picture, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid picture"); metadata_editor_retvm_if(!size, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid size"); - *picture = NULL; - *size = 0; - *mime_type = NULL; - switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; // Bring the pointer to actual file type - TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(); - metadata_editor_retvm_if(tag2 == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. No ID3v2 tag in file."); + case METADATA_EDITOR_FORMAT_MP3: { + TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; // Bring the pointer to actual file type + TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(); + metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. No ID3v2 tag in file."); + + TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; + // Check if there are pictures in the tag + if (lst.isEmpty()) { + metadata_editor_error("No pictures in file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } - TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; - // Check if there are pictures in the tag - if (lst.isEmpty()) { - metadata_editor_error("No pictures in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } else { // pictures exist in file - // Check if index is correct or not - if ((index < 0) || (lst.size() <= (uint)index)) { - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } else { // everything is correct - begin extraction - metadata_editor_info("There are %u pictures in file. Start of picture number %d extraction", lst.size(), index); - int i = 0; - // Among all frames we must choose that one with specified index. "i" will be counter - for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { - if (i != index) continue; - TagLib::ID3v2::AttachedPictureFrame* pictureFrame = static_cast(*it); - uint pictureSize = pictureFrame->picture().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - META_MALLOC(*picture, pictureSize); - metadata_editor_retvm_if(*picture == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - - memcpy(*picture, pictureFrame->picture().data(), pictureSize); - *size = pictureSize; - TagLib::String mime = pictureFrame->mimeType(); - if (!strcmp(mime.toCString(), "image/jpeg")) - *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (!strcmp(mime.toCString(), "image/png")) - *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else - *mime_type = NULL; - break; - } - return METADATA_EDITOR_ERROR_NONE; - } - } + // Check if index is correct or not + if ((index < 0) || (lst.size() <= (uint)index)) { + metadata_editor_error("Index of picture is out of range"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } - case METADATA_EDITOR_FORMAT_MP4: { - TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; - TagLib::MP4::Tag* tag = _file->tag(); - metadata_editor_retvm_if(tag == NULL, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); - // Get map of items directly from tag and launch a search of specific item - TagLib::MP4::ItemListMap& itemMap = tag->itemListMap(); - TagLib::MP4::ItemListMap::ConstIterator it = itemMap.find("covr"); - if (it != itemMap.end()) { // Item was found - TagLib::MP4::CoverArtList lst = it->second.toCoverArtList(); - // Check if the index is in range of CoverArtList Item - if ((index < 0) || ((uint)index >= lst.size())) { // it is not - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } else { // index is in range - int i = 0; - for (TagLib::MP4::CoverArtList::ConstIterator picIt = lst.begin(); picIt != lst.end(); ++picIt, ++i) { - if (i != index) continue; - int pictureSize = picIt->data().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - META_MALLOC(*picture, pictureSize); - metadata_editor_retvm_if(*picture == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - - memcpy(*picture, picIt->data().data(), pictureSize); - *size = pictureSize; - if (picIt->format() == TagLib::MP4::CoverArt::JPEG) *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (picIt->format() == TagLib::MP4::CoverArt::PNG) *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else *mime_type = NULL; - break; - } - return METADATA_EDITOR_ERROR_NONE; - } - } else { // Item was not found - no pictures in file - metadata_editor_error("No item in file. No pictures in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } + metadata_editor_info("There are %u pictures in file. Start of picture number %d extraction", lst.size(), index); + + i = 0; + // Among all frames we must choose that one with specified index. "i" will be counter + for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { + if (i != index) + continue; + + TagLib::ID3v2::AttachedPictureFrame* pictureFrame = static_cast(*it); + uint pictureSize = pictureFrame->picture().size(); + metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); + + *picture = g_memdup(pictureFrame->picture().data(), pictureSize); + *size = pictureSize; + + TagLib::String mime = pictureFrame->mimeType(); + if (mime == "image/jpeg") + *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); + else if (mime == "image/png") + *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); + else + *mime_type = NULL; + break; + } + + return METADATA_EDITOR_ERROR_NONE; + } + + case METADATA_EDITOR_FORMAT_MP4: { + TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; + TagLib::MP4::Tag* tag = _file->tag(); + metadata_editor_retvm_if(!tag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); + + // Get map of items directly from tag and launch a search of specific item + TagLib::MP4::ItemListMap& itemMap = tag->itemListMap(); + TagLib::MP4::ItemListMap::ConstIterator it = itemMap.find("covr"); + + if (it == itemMap.end()) { + metadata_editor_error("No item in file. No pictures in file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + TagLib::MP4::CoverArtList lst = it->second.toCoverArtList(); + + // Check if the index is in range of CoverArtList Item + if ((index < 0) || ((uint)index >= lst.size())) { // it is not + metadata_editor_error("Index of picture is out of range"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } + + i = 0; + for (TagLib::MP4::CoverArtList::ConstIterator picIt = lst.begin(); picIt != lst.end(); ++picIt, ++i) { + if (i != index) + continue; + + int pictureSize = picIt->data().size(); + metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); + + *picture = g_memdup(picIt->data().data(), pictureSize); + *size = pictureSize; + + if (picIt->format() == TagLib::MP4::CoverArt::JPEG) + *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); + else if (picIt->format() == TagLib::MP4::CoverArt::PNG) + *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); + else + *mime_type = NULL; + break; } + + return METADATA_EDITOR_ERROR_NONE; + + } #if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - TagLib::FLAC::File* _file = (TagLib::FLAC::File*) _metadata->file; - TagLib::List lst = _file->pictureList(); - if (lst.isEmpty()) { - metadata_editor_error("No pictures in FLAC file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } else { - // Check if the index is in range of CoverArtList Item - if ((index < 0) || ((uint)index >= lst.size())) { // it is not - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } else { // index is in range - // Consecutive check of all pictures until the desired one is found - int i = 0; - for (TagLib::List::ConstIterator picIt = lst.begin(); picIt != lst.end(); ++picIt, ++i) { - if (i != index) continue; - // picture can be received as ByteVector (picIt->data()). - // ByteVector has data() - picture itself and size() - the size of picture in data() method - int pictureSize = (*picIt)->data().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - META_MALLOC(*picture, pictureSize); - metadata_editor_retvm_if(*picture == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - - memcpy(*picture, (*picIt)->data().data(), pictureSize); - *size = pictureSize; - TagLib::String mime = (*picIt)->mimeType(); - if (!strcmp(mime.toCString(), "image/jpeg")) - *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (!strcmp(mime.toCString(), "image/png")) - *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else - *mime_type = NULL; - break; - } - return METADATA_EDITOR_ERROR_NONE; - } - } + case METADATA_EDITOR_FORMAT_FLAC: { + TagLib::FLAC::File* _file = (TagLib::FLAC::File*) _metadata->file; + TagLib::List lst = _file->pictureList(); + + if (lst.isEmpty()) { + metadata_editor_error("No pictures in FLAC file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; } - case METADATA_EDITOR_FORMAT_WAV: { - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; // Bring the pointer to actual file type - TagLib::ID3v2::Tag* tag2 = _file->tag(); - if (!tag2) { - metadata_editor_error("No ID3v2 tag in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; - // Check if there are pictures in the tag - if (lst.isEmpty()) { - metadata_editor_error("No pictures in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } else { // pictures exist in file - // Check if index is correct or not - if ((index < 0) || (lst.size() <= (uint)index)) { - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } else { // everything is correct - begin extraction - metadata_editor_info("There are %u pictures in file. Start of picture number %d extraction", lst.size(), index); - int i = 0; - // Among all frames we must choose that one with specified index. "i" will be counter - for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { - if (i != index) continue; - TagLib::ID3v2::AttachedPictureFrame* pictureFrame = static_cast(*it); - uint pictureSize = pictureFrame->picture().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - - META_MALLOC(*picture, pictureSize); - metadata_editor_retvm_if(*picture == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - - memcpy(*picture, pictureFrame->picture().data(), pictureSize); - *size = pictureSize; - TagLib::String mime = pictureFrame->mimeType(); - if (!strcmp(mime.toCString(), "image/jpeg")) - *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (!strcmp(mime.toCString(), "image/png")) - *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else - *mime_type = NULL; - break; - } - return METADATA_EDITOR_ERROR_NONE; - } - } + + // Check if the index is in range of CoverArtList Item + if ((index < 0) || ((uint)index >= lst.size())) { // it is not + metadata_editor_error("Index of picture is out of range"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } -#endif - default: - metadata_editor_error("Wrong file type"); + + // Consecutive check of all pictures until the desired one is found + i = 0; + for (TagLib::List::ConstIterator picIt = lst.begin(); picIt != lst.end(); ++picIt, ++i) { + if (i != index) + continue; + + // picture can be received as ByteVector (picIt->data()). + // ByteVector has data() - picture itself and size() - the size of picture in data() method + int pictureSize = (*picIt)->data().size(); + metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); + + *picture = g_memdup((*picIt)->data().data(), pictureSize); + *size = pictureSize; + + TagLib::String mime = (*picIt)->mimeType(); + if (mime == "image/jpeg") + *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); + else if (mime == "image/png") + *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); + else + *mime_type = NULL; + break; + } + + return METADATA_EDITOR_ERROR_NONE; + } + + case METADATA_EDITOR_FORMAT_WAV: { + TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; // Bring the pointer to actual file type + TagLib::ID3v2::Tag* tag2 = _file->tag(); + + if (!tag2) { + metadata_editor_error("No ID3v2 tag in file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; + // Check if there are pictures in the tag + if (lst.isEmpty()) { + metadata_editor_error("No pictures in file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + // Check if index is correct or not + if ((index < 0) || (lst.size() <= (uint)index)) { + metadata_editor_error("Index of picture is out of range"); return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } + + metadata_editor_info("There are %u pictures in file. Start of picture number %d extraction", lst.size(), index); + i = 0; + // Among all frames we must choose that one with specified index. "i" will be counter + for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { + if (i != index) + continue; + + TagLib::ID3v2::AttachedPictureFrame* pictureFrame = static_cast(*it); + uint pictureSize = pictureFrame->picture().size(); + metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); + + *picture = g_memdup(pictureFrame->picture().data(), pictureSize); + *size = pictureSize; + + TagLib::String mime = pictureFrame->mimeType(); + if (mime == "image/jpeg") + *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); + else if (mime == "image/png") + *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); + else + *mime_type = NULL; + break; + } + + return METADATA_EDITOR_ERROR_NONE; + } +#endif + default: + metadata_editor_error("Wrong file type"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } } -- 2.7.4 From 0728c078705ef99415a8c761a8b4703d05cf4e70 Mon Sep 17 00:00:00 2001 From: hj kim Date: Thu, 23 Apr 2020 17:38:44 +0900 Subject: [PATCH 06/16] Improve metadata_editor_set_path() API Change-Id: I969f3da6669f7c9c62db44af9be9321f97581a67 --- include/metadata_editor_private.h | 2 +- src/metadata_editor.cpp | 246 +++++++++----------------------------- 2 files changed, 55 insertions(+), 193 deletions(-) diff --git a/include/metadata_editor_private.h b/include/metadata_editor_private.h index eafbc2a..ffcd21e 100755 --- a/include/metadata_editor_private.h +++ b/include/metadata_editor_private.h @@ -86,7 +86,7 @@ extern "C" { } while (0) typedef struct { - void* file; + TagLib::File* file; int filetype; bool isOpen; bool isReadOnly; diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index f424edc..1533010 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -796,222 +796,84 @@ extern "C" int metadata_editor_create(metadata_editor_h *metadata) { // *** This function is used to open the file. It creates the instance that is responsible for connection with file *** // extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char *path) { - // Check if we have valid arguments to work with - metadata_editor_retvm_if(!metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); - metadata_editor_retvm_if(!path, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid path"); + int media_type = METADATA_EDITOR_FORMAT_NOTYPE; + metadata_editor_s *_metadata = (metadata_editor_s*)metadata; + TagLib::File* _file = NULL; - int exist; + metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); + metadata_editor_retvm_if(!path, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid path"); - /* check the file exits actually */ - exist = open(path, O_RDONLY); - if(exist < 0) { + if (access(path, R_OK) < 0) { if (errno == EACCES || errno == EPERM) { metadata_editor_error("Permission denied"); return METADATA_EDITOR_ERROR_PERMISSION_DENIED; } else { - metadata_editor_error("Not exist file"); + metadata_editor_error("Fail to open path"); return METADATA_EDITOR_ERROR_FILE_EXISTS; } } - close(exist); - - metadata_editor_s *_metadata = (metadata_editor_s*)metadata; - int media_type = METADATA_EDITOR_FORMAT_NOTYPE; - media_type = __metadata_editor_get_file_type(path); - switch (media_type) { // Parse file according the specified type - case METADATA_EDITOR_FORMAT_MP3: { - if (_metadata->file) { - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - _metadata->file = NULL; - _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; - _metadata->isOpen = false; - _metadata->isReadOnly = true; - } - - // Allocate the file object in memory to work with it later on - TagLib::MPEG::File* _file = new TagLib::MPEG::File(path); - - metadata_editor_retvm_if(_file == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - - _metadata->file = _file; // Copy file pointer to the structure - - _metadata->filetype = METADATA_EDITOR_FORMAT_MP3; - - if (_file->isOpen()) { // Check if the file was opened successfully - metadata_editor_info("The file is successfully opened. Address is %p", _metadata->file); - _metadata->isOpen = true; - } else { // The file does not exist or you have no permission to process it - metadata_editor_error("The file was not found. Pointer address is %p", _metadata->file); - _metadata->isOpen = false; - return METADATA_EDITOR_ERROR_PERMISSION_DENIED; - } - - if (_file->readOnly()) { // Check if the file is readonly - metadata_editor_info("File is readonly"); - _metadata->isReadOnly = true; - } else { // or not - metadata_editor_info("The file is writable"); - _metadata->isReadOnly = false; - } + if (_metadata->file) { + metadata_editor_info("file free [%p]", _metadata->file); + delete _metadata->file; - return METADATA_EDITOR_ERROR_NONE; - } - case METADATA_EDITOR_FORMAT_MP4: { - if (_metadata->file) { - TagLib::MP4::File* _file = (TagLib::MP4::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - _metadata->file = NULL; - _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; - _metadata->isOpen = false; - _metadata->isReadOnly = true; - } - - // Allocate the file object in memory to work with it later on - TagLib::MP4::File* _file = new TagLib::MP4::File(path); - - metadata_editor_retvm_if(_file == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + _metadata->file = NULL; + _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; + _metadata->isOpen = false; + _metadata->isReadOnly = true; + } - _metadata->file = _file; // Copy file pointer to the structure + try { + switch (media_type) { + case METADATA_EDITOR_FORMAT_MP3: + _file = new TagLib::MPEG::File(path); + break; - _metadata->filetype = METADATA_EDITOR_FORMAT_MP4; + case METADATA_EDITOR_FORMAT_MP4: + _file = new TagLib::MP4::File(path); + break; - if (_file->isOpen()) { // Check if the file was opened successfully - metadata_editor_info("The file is successfully opened. Address is %p", _metadata->file); - _metadata->isOpen = true; - } else { // The file does not exist or you have no permission to process it - metadata_editor_error("The file was not found. Pointer address is %p", _metadata->file); - _metadata->isOpen = false; - return METADATA_EDITOR_ERROR_FILE_EXISTS; - } - if (_file->readOnly()) { // Check if the file is readonly - metadata_editor_info("File is readonly"); - _metadata->isReadOnly = true; - } else { // or not - metadata_editor_info("The file is writable"); - _metadata->isReadOnly = false; - } - return METADATA_EDITOR_ERROR_NONE; - } #if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - // Allocate the file object in memory to work with it later on - TagLib::FLAC::File* _file = new TagLib::FLAC::File(path); - - metadata_editor_retvm_if(_file == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - - _metadata->file = _file; // Copy file pointer to the structure - - _metadata->filetype = METADATA_EDITOR_FORMAT_FLAC; - - if (_file->isOpen()) { // Check if the file was opened successfully - metadata_editor_info("The file is successfully opened. Address is %p", _metadata->file); - _metadata->isOpen = true; - } else { // The file does not exist or you have no permission to process it - metadata_editor_error("The file was not found. Pointer address is %p", _metadata->file); - _metadata->isOpen = false; - return METADATA_EDITOR_ERROR_FILE_EXISTS; - } - if (_file->readOnly()) { // Check if the file is readonly - metadata_editor_info("File is readonly"); - _metadata->isReadOnly = true; - } else { // or not - metadata_editor_info("The file is writable"); - _metadata->isReadOnly = false; - } - return METADATA_EDITOR_ERROR_NONE; - } - case METADATA_EDITOR_FORMAT_OGG_VORBIS: { - // Allocate the file object in memory to work with it later on - TagLib::Ogg::Vorbis::File* _file = new TagLib::Ogg::Vorbis::File(path); - - metadata_editor_retvm_if(_file == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); - - _metadata->file = _file; // Copy file pointer to the structure - - _metadata->filetype = METADATA_EDITOR_FORMAT_OGG_VORBIS; - - if (_file->isOpen()) { // Check if the file was opened successfully - metadata_editor_info("The file is successfully opened. Address is %p", _metadata->file); - _metadata->isOpen = true; - } else { // The file does not exist or you have no permission to process it - metadata_editor_error("The file was not found. Pointer address is %p", _metadata->file); - _metadata->isOpen = false; - return METADATA_EDITOR_ERROR_FILE_EXISTS; - } - if (_file->readOnly()) { // Check if the file is readonly - metadata_editor_info("File is readonly"); - _metadata->isReadOnly = true; - } else { // or not - metadata_editor_info("The file is writable"); - _metadata->isReadOnly = false; - } - return METADATA_EDITOR_ERROR_NONE; - } - case METADATA_EDITOR_FORMAT_OGG_FLAC: { - // Allocate the file object in memory to work with it later on - TagLib::Ogg::FLAC::File* _file = new TagLib::Ogg::FLAC::File(path); + case METADATA_EDITOR_FORMAT_FLAC: + _file = new TagLib::FLAC::File(path); + break; - metadata_editor_retvm_if(_file == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + case METADATA_EDITOR_FORMAT_OGG_VORBIS: + _file = new TagLib::Ogg::Vorbis::File(path); + break; - _metadata->file = _file; // Copy file pointer to the structure + case METADATA_EDITOR_FORMAT_OGG_FLAC: + _file = new TagLib::Ogg::FLAC::File(path); + break; - _metadata->filetype = METADATA_EDITOR_FORMAT_OGG_FLAC; - - if (_file->isOpen()) { // Check if the file was opened successfully - metadata_editor_info("The file is successfully opened. Address is %p", _metadata->file); - _metadata->isOpen = true; - } else { // The file does not exist or you have no permission to process it - metadata_editor_error("The file was not found. Pointer address is %p", _metadata->file); - _metadata->isOpen = false; - return METADATA_EDITOR_ERROR_FILE_EXISTS; - } - if (_file->readOnly()) { // Check if the file is readonly - metadata_editor_info("File is readonly"); - _metadata->isReadOnly = true; - } else { // or not - metadata_editor_info("The file is writable"); - _metadata->isReadOnly = false; - } - return METADATA_EDITOR_ERROR_NONE; - } - case METADATA_EDITOR_FORMAT_WAV: { - // Allocate the file object in memory to work with it later on - TagLib::RIFF::WAV::File* _file = new TagLib::RIFF::WAV::File(path); + case METADATA_EDITOR_FORMAT_WAV: + // Allocate the file object in memory to work with it later on + _file = new TagLib::RIFF::WAV::File(path); + break; - metadata_editor_retvm_if(_file == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); +#endif + default: + metadata_editor_error("Wrong file type"); + return METADATA_EDITOR_ERROR_NOT_SUPPORTED; + } + } catch (const std::bad_alloc &ex) { + metadata_editor_retvm_if(!_file, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + } - _metadata->file = _file; // Copy file pointer to the structure + if (!_file->isOpen()) { + metadata_editor_error("The file was not found. Pointer address is %p", _file); + delete _file; + return METADATA_EDITOR_ERROR_PERMISSION_DENIED; + } - _metadata->filetype = METADATA_EDITOR_FORMAT_WAV; + _metadata->file = _file; + _metadata->filetype = media_type; + _metadata->isOpen = true; + _metadata->isReadOnly = _file->readOnly(); - if (_file->isOpen()) { // Check if the file was opened successfully - metadata_editor_info("The file is successfully opened. Address is %p", _metadata->file); - _metadata->isOpen = true; - } else { // The file does not exist or you have no permission to process it - metadata_editor_error("The file was not found. Pointer address is %p", _metadata->file); - _metadata->isOpen = false; - return METADATA_EDITOR_ERROR_FILE_EXISTS; - } - if (_file->readOnly()) { // Check if the file is readonly - metadata_editor_info("File is readonly"); - _metadata->isReadOnly = true; - } else { // or not - metadata_editor_info("The file is writable"); - _metadata->isReadOnly = false; - } - return METADATA_EDITOR_ERROR_NONE; - } -#endif - default: - metadata_editor_error("Wrong file type"); - return METADATA_EDITOR_ERROR_NOT_SUPPORTED; - } + return METADATA_EDITOR_ERROR_NONE; } static int __metadata_editor_get_mp3_metadata(metadata_editor_s *metadata, metadata_editor_attr_e attribute, char **value) -- 2.7.4 From 9254dd0b0c8e0656c3235c147382bf83e3a47d48 Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 29 Apr 2020 08:25:38 +0900 Subject: [PATCH 07/16] Remove 'isOpen'. 'file' in metadata_editor_s can replace it Change-Id: I027aa484b8173ab26a3e38a4b1986f4d04bc8cca --- include/metadata_editor_private.h | 1 - src/metadata_editor.cpp | 4 ---- 2 files changed, 5 deletions(-) diff --git a/include/metadata_editor_private.h b/include/metadata_editor_private.h index ffcd21e..a266ead 100755 --- a/include/metadata_editor_private.h +++ b/include/metadata_editor_private.h @@ -88,7 +88,6 @@ extern "C" { typedef struct { TagLib::File* file; int filetype; - bool isOpen; bool isReadOnly; } metadata_editor_s; diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 1533010..3858e8b 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -55,7 +55,6 @@ static int __check_metadata_parameter(metadata_editor_s *metadata) { metadata_editor_retvm_if(!metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); metadata_editor_retvm_if(!metadata->file, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "File loading fail"); - metadata_editor_retvm_if(!metadata->isOpen, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); return METADATA_EDITOR_ERROR_NONE; } @@ -785,7 +784,6 @@ extern "C" int metadata_editor_create(metadata_editor_h *metadata) { _metadata->file = NULL; _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; // Specify file type out of range - _metadata->isOpen = false; // File is not opened yet _metadata->isReadOnly = true; // Handle unexisting file as readonly // Save the structure in the metadata @@ -821,7 +819,6 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * _metadata->file = NULL; _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; - _metadata->isOpen = false; _metadata->isReadOnly = true; } @@ -870,7 +867,6 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * _metadata->file = _file; _metadata->filetype = media_type; - _metadata->isOpen = true; _metadata->isReadOnly = _file->readOnly(); return METADATA_EDITOR_ERROR_NONE; -- 2.7.4 From 14c281e8c273dfb3e6f1a75590d1e6bef8c29f11 Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 29 Apr 2020 08:32:53 +0900 Subject: [PATCH 08/16] remove 'isReadOnly'. readOnly() of File can replace it Change-Id: I467df758aa84a3cbf47aaefcc27ac79f5370be0a --- include/metadata_editor_private.h | 1 - src/metadata_editor.cpp | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/include/metadata_editor_private.h b/include/metadata_editor_private.h index a266ead..47e2840 100755 --- a/include/metadata_editor_private.h +++ b/include/metadata_editor_private.h @@ -88,7 +88,6 @@ extern "C" { typedef struct { TagLib::File* file; int filetype; - bool isReadOnly; } metadata_editor_s; #ifdef __cplusplus diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 3858e8b..c2ffd52 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -66,7 +66,7 @@ static int __check_metadata_set_parameter(metadata_editor_s *metadata) ret = __check_metadata_parameter(metadata); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_parameter"); - metadata_editor_retvm_if(metadata->isReadOnly, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File is readonly. Unable to modify"); + metadata_editor_retvm_if(metadata->file->readOnly(), METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File is readonly. Unable to modify"); return METADATA_EDITOR_ERROR_NONE; } @@ -784,7 +784,6 @@ extern "C" int metadata_editor_create(metadata_editor_h *metadata) { _metadata->file = NULL; _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; // Specify file type out of range - _metadata->isReadOnly = true; // Handle unexisting file as readonly // Save the structure in the metadata *metadata = (metadata_editor_h)_metadata; @@ -819,7 +818,6 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * _metadata->file = NULL; _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; - _metadata->isReadOnly = true; } try { @@ -867,7 +865,6 @@ extern "C" int metadata_editor_set_path(metadata_editor_h metadata, const char * _metadata->file = _file; _metadata->filetype = media_type; - _metadata->isReadOnly = _file->readOnly(); return METADATA_EDITOR_ERROR_NONE; } -- 2.7.4 From 12eb48d3af8b10463dfa981e3c4b9f139f9cd21c Mon Sep 17 00:00:00 2001 From: hj kim Date: Tue, 28 Apr 2020 17:50:25 +0900 Subject: [PATCH 09/16] Improve __metadata_editor_get_picture_type() API Change-Id: Ib3fb371c5fd914ca94051f8151bcf4ec035bdff3 --- src/metadata_editor.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index c2ffd52..7f6000a 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -696,7 +696,7 @@ int __metadata_editor_get_file_type(const char *path) { return METADATA_EDITOR_FORMAT_NOTYPE; } -int __metadata_editor_get_picture_type(const char *path, char **type) { +static int __metadata_editor_get_picture_type(const char *path, char **type) { int ret = 0; char mimetype[255] = {0, }; const char *type_jpeg = "image/jpeg"; @@ -712,10 +712,10 @@ int __metadata_editor_get_picture_type(const char *path, char **type) { metadata_editor_retvm_if(ret < 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "__metadata_editor_get_file_ext failed"); if (strcasecmp(ext, "JPG") == 0 || strcasecmp(ext, "JPEG") == 0) { - *type = strndup(type_jpeg, strlen(type_jpeg)); + *type = g_strndup(type_jpeg, strlen(type_jpeg)); return METADATA_EDITOR_ERROR_NONE; } else if (strcasecmp(ext, "PNG") == 0) { - *type = strndup(type_png, strlen(type_png)); + *type = g_strndup(type_png, strlen(type_png)); return METADATA_EDITOR_ERROR_NONE; } else { return METADATA_EDITOR_ERROR_NOT_SUPPORTED; @@ -726,10 +726,10 @@ int __metadata_editor_get_picture_type(const char *path, char **type) { /* categorize from mimetype */ if (strstr(mimetype, "jpeg") != NULL) { - *type = strndup(mimetype, strlen(mimetype)); + *type = g_strndup(mimetype, strlen(mimetype)); return METADATA_EDITOR_ERROR_NONE; } else if (strstr(mimetype, "png") != NULL) { - *type = strndup(mimetype, strlen(mimetype)); + *type = g_strndup(mimetype, strlen(mimetype)); return METADATA_EDITOR_ERROR_NONE; } @@ -1729,7 +1729,7 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const } META_SAFE_FREE(picture); - META_SAFE_FREE(type); + g_free(type); return ret; } -- 2.7.4 From fd1d34c3b4033839f5f12f576aa9a3e651e2d0f2 Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 6 May 2020 17:17:40 +0900 Subject: [PATCH 10/16] Improve metadata_editor_update_metadata() API Change-Id: I524618dd0f78bdd05e902d437419c87136925e6e --- src/metadata_editor.cpp | 78 +++++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 51 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 7f6000a..3942b2d 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -1327,62 +1327,38 @@ extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { ret = __check_metadata_set_parameter(_metadata); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); - switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - // Bring the pointer to actual file type - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - - TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); + switch (_metadata->filetype) { + case METADATA_EDITOR_FORMAT_MP3: { + TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; + TagLib::ID3v1::Tag* tag1 = _file->ID3v1Tag(); - if (!tag1 || tag1->isEmpty()) { // If no ID3v1 tag - prevent its creation - if (_file->save(TagLib::MPEG::File::ID3v2 | TagLib::MPEG::File::APE)) - return METADATA_EDITOR_ERROR_NONE; - } else { // otherwise - save all tags in file - if (_file->save(TagLib::MPEG::File::AllTags)) - return METADATA_EDITOR_ERROR_NONE; - } - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - case METADATA_EDITOR_FORMAT_MP4: { - TagLib::MP4::File* _file = (TagLib::MP4::File*)_metadata->file; - if (_file->save()) + if (!tag1 || tag1->isEmpty()) { // If no ID3v1 tag - prevent its creation + if (_file->save(TagLib::MPEG::File::ID3v2 | TagLib::MPEG::File::APE)) return METADATA_EDITOR_ERROR_NONE; - else - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } -#if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - TagLib::FLAC::File* _file = (TagLib::FLAC::File*)_metadata->file; - if (_file->save()) + } else { // otherwise - save all tags in file + if (_file->save(TagLib::MPEG::File::AllTags)) return METADATA_EDITOR_ERROR_NONE; - else - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - case METADATA_EDITOR_FORMAT_OGG_VORBIS: { - TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)_metadata->file; - if (_file->save()) - return METADATA_EDITOR_ERROR_NONE; - else - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - case METADATA_EDITOR_FORMAT_OGG_FLAC: { - TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)_metadata->file; - if (_file->save()) - return METADATA_EDITOR_ERROR_NONE; - else - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } - case METADATA_EDITOR_FORMAT_WAV: { - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; - if (_file->save()) - return METADATA_EDITOR_ERROR_NONE; - else - return METADATA_EDITOR_ERROR_OPERATION_FAILED; } + + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + case METADATA_EDITOR_FORMAT_MP4: { +#if 0 + case METADATA_EDITOR_FORMAT_FLAC: + case METADATA_EDITOR_FORMAT_OGG_VORBIS: + case METADATA_EDITOR_FORMAT_OGG_FLAC: + case METADATA_EDITOR_FORMAT_WAV: #endif - default: - metadata_editor_error("Wrong file type"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + if (_metadata->file->save()) + return METADATA_EDITOR_ERROR_NONE; + + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } + + default: + metadata_editor_error("Wrong file type"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } } -- 2.7.4 From 6c7e3c6248b663970f038769a98fe4a67f1143d4 Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 6 May 2020 16:42:22 +0900 Subject: [PATCH 11/16] Apply tizen coding rule Change-Id: I101a499fc99fea4ba36946e9327d9eebba22a4d2 --- src/metadata_editor.cpp | 72 ++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 3942b2d..730f015 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -1070,30 +1070,30 @@ extern "C" int metadata_editor_get_metadata(metadata_editor_h metadata, metadata metadata_editor_s *_metadata = (metadata_editor_s*)metadata; metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); - switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: - return __metadata_editor_get_mp3_metadata(_metadata, attribute, value); + switch (_metadata->filetype) { + case METADATA_EDITOR_FORMAT_MP3: + return __metadata_editor_get_mp3_metadata(_metadata, attribute, value); - case METADATA_EDITOR_FORMAT_MP4: - return __metadata_editor_get_mp4_metadata(_metadata, attribute, value); + case METADATA_EDITOR_FORMAT_MP4: + return __metadata_editor_get_mp4_metadata(_metadata, attribute, value); #if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - return __metadata_editor_get_flac_metadata(_metadata, attribute, value); - } - 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); - } - case METADATA_EDITOR_FORMAT_WAV: { - return __metadata_editor_get_wav_metadata(_metadata, attribute, value); - } + case METADATA_EDITOR_FORMAT_FLAC: + return __metadata_editor_get_flac_metadata(_metadata, attribute, value); + + 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); + + case METADATA_EDITOR_FORMAT_WAV: + return __metadata_editor_get_wav_metadata(_metadata, attribute, value); + #endif - default: - metadata_editor_error("Wrong file type [%d]", _metadata->filetype); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + default: + metadata_editor_error("Wrong file type [%d]", _metadata->filetype); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } } @@ -1292,30 +1292,30 @@ extern "C" int metadata_editor_set_metadata(metadata_editor_h metadata, metadata metadata_editor_s* _metadata = (metadata_editor_s*) metadata; metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); - switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: - return __metadata_editor_set_mp3_metadata(_metadata, attribute, value); + switch (_metadata->filetype) { + case METADATA_EDITOR_FORMAT_MP3: + return __metadata_editor_set_mp3_metadata(_metadata, attribute, value); - case METADATA_EDITOR_FORMAT_MP4: - return __metadata_editor_set_mp4_metadata(_metadata, attribute, value); + case METADATA_EDITOR_FORMAT_MP4: + return __metadata_editor_set_mp4_metadata(_metadata, attribute, value); #if 0 - case METADATA_EDITOR_FORMAT_FLAC: - return __metadata_editor_set_flac_metadata(_metadata, attribute, value); + case METADATA_EDITOR_FORMAT_FLAC: + return __metadata_editor_set_flac_metadata(_metadata, attribute, value); - case METADATA_EDITOR_FORMAT_OGG_VORBIS: - return __metadata_editor_set_ogg_vorbis_metadata(_metadata, attribute, value); + 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); + case METADATA_EDITOR_FORMAT_OGG_FLAC: + return __metadata_editor_set_ogg_flac_metadata(_metadata, attribute, value); - case METADATA_EDITOR_FORMAT_WAV: - return __metadata_editor_set_wav_metadata(_metadata, attribute, value); + case METADATA_EDITOR_FORMAT_WAV: + return __metadata_editor_set_wav_metadata(_metadata, attribute, value); #endif - default: - metadata_editor_error("Wrong file type"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + default: + metadata_editor_error("Wrong file type"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } } -- 2.7.4 From fd56f934487062fe54ef29b3c40749f0d97858f3 Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 6 May 2020 16:47:24 +0900 Subject: [PATCH 12/16] Improve metadata_editor_create() and Bug fix of metadata_editor_destroy() filetype can be METADATA_EDITOR_FORMAT_NOTYPE if user only create handle with metadata_editor_create() without setting path. Change-Id: Ie4d3784da64274d1b5ba127073356f492c761b16 --- src/metadata_editor.cpp | 54 +++++-------------------------------------------- 1 file changed, 5 insertions(+), 49 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 730f015..205c867 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -779,8 +779,7 @@ int __metadata_editor_get_picture_info(const char *path, void **picture, int *si extern "C" int metadata_editor_create(metadata_editor_h *metadata) { metadata_editor_retvm_if(metadata == NULL, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); - metadata_editor_s *_metadata = new metadata_editor_s; // Allocate a structure for handler - metadata_editor_retvm_if(_metadata == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + metadata_editor_s *_metadata = g_new0(metadata_editor_s, 1); _metadata->file = NULL; _metadata->filetype = METADATA_EDITOR_FORMAT_NOTYPE; // Specify file type out of range @@ -1833,58 +1832,15 @@ extern "C" int metadata_editor_remove_picture(metadata_editor_h metadata, int in } } -// *** This function is used to free memory that was allocated with metadata_editor_create(...) and metadata_editor_set_path(...) functions *** // extern "C" int metadata_editor_destroy(metadata_editor_h metadata) { metadata_editor_s *_metadata = (metadata_editor_s*)metadata; + metadata_editor_retvm_if(!_metadata, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid metadata"); - switch (_metadata->filetype) { - case METADATA_EDITOR_FORMAT_MP3: { - // Bring the pointer to actual file type - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - break; - } - case METADATA_EDITOR_FORMAT_MP4: { - TagLib::MP4::File* _file = (TagLib::MP4::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - break; - } -#if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - TagLib::FLAC::File* _file = (TagLib::FLAC::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - break; - } - case METADATA_EDITOR_FORMAT_OGG_VORBIS: { - TagLib::Ogg::Vorbis::File* _file = (TagLib::Ogg::Vorbis::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - break; - } - case METADATA_EDITOR_FORMAT_OGG_FLAC: { - TagLib::Ogg::FLAC::File* _file = (TagLib::Ogg::FLAC::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - break; - } - case METADATA_EDITOR_FORMAT_WAV: { - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; - metadata_editor_info("file free [%p]", _metadata->file); - delete _file; - break; - } -#endif - default: - metadata_editor_error("Wrong file type"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + if (_metadata->file) + delete _metadata->file; - metadata_editor_info(" with address %p will be freed", metadata); - delete _metadata; + g_free(_metadata); return METADATA_EDITOR_ERROR_NONE; } -- 2.7.4 From d5b8dd908d6282564e4ffa86964af5196f8824ce Mon Sep 17 00:00:00 2001 From: hj kim Date: Wed, 6 May 2020 18:05:19 +0900 Subject: [PATCH 13/16] Improve metadata_editor_get_picture() API Change-Id: I05d3d5e1d8713efa6bd286b73f1489e25df7ca35 --- src/metadata_editor.cpp | 288 +++++++++++++++++++++--------------------------- 1 file changed, 124 insertions(+), 164 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 205c867..f553a86 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -23,6 +23,9 @@ #include #include +#define MIME_TYPE_JPEG "image/jpeg" +#define MIME_TYPE_PNG "image/png" + static int __ID3_getTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, char** value); static int __ID3_setTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1::Tag* tag1, TagLib::ID3v2::Tag* tag2, const char* frameID, const char* value); static int __ID3_getFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag* tag2, const char* frameID, char** value); @@ -1361,202 +1364,159 @@ extern "C" int metadata_editor_update_metadata(metadata_editor_h metadata) { } } -// *** This function returns buffer with picture under the specified index and buffer's (picture's) size *** // -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_s* _metadata = (metadata_editor_s*) metadata; - const char *TYPE_JPEG = "image/jpeg"; - const char *TYPE_PNG = "image/png"; - int i = 0; +static char * __get_mime_type(const TagLib::String& mime_type) +{ + if (mime_type == MIME_TYPE_JPEG || mime_type == MIME_TYPE_PNG) + return g_strdup(mime_type.toCString()); - ret = __check_metadata_get_parameter(_metadata, mime_type); - metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); - metadata_editor_retvm_if(!picture, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid picture"); - metadata_editor_retvm_if(!size, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid size"); + return NULL; +} - switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; // Bring the pointer to actual file type - TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(); - metadata_editor_retvm_if(!tag2, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. No ID3v2 tag in file."); - - TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; - // Check if there are pictures in the tag - if (lst.isEmpty()) { - metadata_editor_error("No pictures in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } +static char * __get_mime_type_from_cover_art(const TagLib::MP4::CoverArt& cover_art) +{ + if (cover_art.format() == TagLib::MP4::CoverArt::JPEG) + return g_strdup(MIME_TYPE_JPEG); + else if (cover_art.format() == TagLib::MP4::CoverArt::PNG) + return g_strdup(MIME_TYPE_PNG); - // Check if index is correct or not - if ((index < 0) || (lst.size() <= (uint)index)) { - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return NULL; +} - metadata_editor_info("There are %u pictures in file. Start of picture number %d extraction", lst.size(), index); +static int __get_APIC(TagLib::ID3v2::Tag* tag, int index, void **picture, int *size, char **mime_type) +{ + metadata_editor_retvm_if(!tag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. No ID3v2 tag in file."); - i = 0; - // Among all frames we must choose that one with specified index. "i" will be counter - for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { - if (i != index) - continue; + TagLib::ID3v2::FrameList lst = tag->frameListMap()["APIC"]; - TagLib::ID3v2::AttachedPictureFrame* pictureFrame = static_cast(*it); - uint pictureSize = pictureFrame->picture().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); + // Check if there are pictures in the tag + if (lst.isEmpty()) { + metadata_editor_error("No pictures in file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } - *picture = g_memdup(pictureFrame->picture().data(), pictureSize); - *size = pictureSize; + // Check if index is correct or not + if ((index < 0) || (lst.size() <= (uint)index)) { + metadata_editor_error("Index of picture is out of range"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } - TagLib::String mime = pictureFrame->mimeType(); - if (mime == "image/jpeg") - *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (mime == "image/png") - *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else - *mime_type = NULL; - break; - } + metadata_editor_info("There are %u pictures in file. Start of picture number %d extraction", lst.size(), index); - return METADATA_EDITOR_ERROR_NONE; - } + auto pictureFrame = static_cast(lst[index]); - case METADATA_EDITOR_FORMAT_MP4: { - TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; - TagLib::MP4::Tag* tag = _file->tag(); - metadata_editor_retvm_if(!tag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); + uint pictureSize = pictureFrame->picture().size(); + metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - // Get map of items directly from tag and launch a search of specific item - TagLib::MP4::ItemListMap& itemMap = tag->itemListMap(); - TagLib::MP4::ItemListMap::ConstIterator it = itemMap.find("covr"); + *picture = g_memdup(pictureFrame->picture().data(), pictureSize); + *size = pictureSize; + *mime_type = __get_mime_type(pictureFrame->mimeType()); - if (it == itemMap.end()) { - metadata_editor_error("No item in file. No pictures in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } + return METADATA_EDITOR_ERROR_NONE; +} - TagLib::MP4::CoverArtList lst = it->second.toCoverArtList(); +static int __get_mp3_picture(metadata_editor_s* metadata, int index, void **picture, int *size, char **mime_type) +{ + TagLib::MPEG::File* _file = (TagLib::MPEG::File*)metadata->file; - // Check if the index is in range of CoverArtList Item - if ((index < 0) || ((uint)index >= lst.size())) { // it is not - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + return __get_APIC(_file->ID3v2Tag(), index, picture, size, mime_type); +} - i = 0; - for (TagLib::MP4::CoverArtList::ConstIterator picIt = lst.begin(); picIt != lst.end(); ++picIt, ++i) { - if (i != index) - continue; +static int __get_mp4_picture(metadata_editor_s* metadata, int index, void **picture, int *size, char **mime_type) +{ + TagLib::MP4::File* _file = (TagLib::MP4::File*) metadata->file; + TagLib::MP4::Tag* tag = _file->tag(); - int pictureSize = picIt->data().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); + metadata_editor_retvm_if(!tag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); - *picture = g_memdup(picIt->data().data(), pictureSize); - *size = pictureSize; + // Get map of items directly from tag and launch a search of specific item + TagLib::MP4::ItemListMap& itemMap = tag->itemListMap(); + TagLib::MP4::ItemListMap::ConstIterator it = itemMap.find("covr"); - if (picIt->format() == TagLib::MP4::CoverArt::JPEG) - *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (picIt->format() == TagLib::MP4::CoverArt::PNG) - *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else - *mime_type = NULL; - break; - } + if (it == itemMap.end()) { + metadata_editor_error("No item in file. No pictures in file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; + } - return METADATA_EDITOR_ERROR_NONE; + TagLib::MP4::CoverArtList lst = it->second.toCoverArtList(); + // Check if the index is in range of CoverArtList Item + if ((index < 0) || ((uint)index >= lst.size())) { + metadata_editor_error("Index of picture is out of range"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; } -#if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - TagLib::FLAC::File* _file = (TagLib::FLAC::File*) _metadata->file; - TagLib::List lst = _file->pictureList(); - if (lst.isEmpty()) { - metadata_editor_error("No pictures in FLAC file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } + auto pictureFrame = static_cast(lst[index]); - // Check if the index is in range of CoverArtList Item - if ((index < 0) || ((uint)index >= lst.size())) { // it is not - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + int pictureSize = pictureFrame.data().size(); + metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - // Consecutive check of all pictures until the desired one is found - i = 0; - for (TagLib::List::ConstIterator picIt = lst.begin(); picIt != lst.end(); ++picIt, ++i) { - if (i != index) - continue; - - // picture can be received as ByteVector (picIt->data()). - // ByteVector has data() - picture itself and size() - the size of picture in data() method - int pictureSize = (*picIt)->data().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - - *picture = g_memdup((*picIt)->data().data(), pictureSize); - *size = pictureSize; - - TagLib::String mime = (*picIt)->mimeType(); - if (mime == "image/jpeg") - *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (mime == "image/png") - *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else - *mime_type = NULL; - break; - } + *picture = g_memdup(pictureFrame.data().data(), pictureSize); + *size = pictureSize; + *mime_type = __get_mime_type_from_cover_art(pictureFrame); - return METADATA_EDITOR_ERROR_NONE; + return METADATA_EDITOR_ERROR_NONE; +} + +#if 0 +static int __get_flac_picture(metadata_editor_s* metadata, int index, void **picture, int *size, char **mime_type) +{ + TagLib::FLAC::File* _file = (TagLib::FLAC::File*) metadata->file; + TagLib::List lst = _file->pictureList(); + + if (lst.isEmpty()) { + metadata_editor_error("No pictures in FLAC file"); + return METADATA_EDITOR_ERROR_OPERATION_FAILED; } - case METADATA_EDITOR_FORMAT_WAV: { - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; // Bring the pointer to actual file type - TagLib::ID3v2::Tag* tag2 = _file->tag(); + // Check if the index is in range of CoverArtList Item + if ((index < 0) || ((uint)index >= lst.size())) { + metadata_editor_error("Index of picture is out of range"); + return METADATA_EDITOR_ERROR_INVALID_PARAMETER; + } - if (!tag2) { - metadata_editor_error("No ID3v2 tag in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } + auto pictureFrame = static_cast(lst[index]); - TagLib::ID3v2::FrameList lst = tag2->frameListMap()["APIC"]; - // Check if there are pictures in the tag - if (lst.isEmpty()) { - metadata_editor_error("No pictures in file"); - return METADATA_EDITOR_ERROR_OPERATION_FAILED; - } + int pictureSize = pictureFrame->data().size(); + metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - // Check if index is correct or not - if ((index < 0) || (lst.size() <= (uint)index)) { - metadata_editor_error("Index of picture is out of range"); - return METADATA_EDITOR_ERROR_INVALID_PARAMETER; - } + *picture = g_memdup(pictureFrame->data().data(), pictureSize); + *size = pictureSize; + *mime_type = __get_mime_type(pictureFrame->mimeType()); - metadata_editor_info("There are %u pictures in file. Start of picture number %d extraction", lst.size(), index); - i = 0; - // Among all frames we must choose that one with specified index. "i" will be counter - for (TagLib::ID3v2::FrameList::Iterator it = lst.begin(); it != lst.end(); ++it, ++i) { - if (i != index) - continue; - - TagLib::ID3v2::AttachedPictureFrame* pictureFrame = static_cast(*it); - uint pictureSize = pictureFrame->picture().size(); - metadata_editor_retvm_if(pictureSize == 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Size of picture is 0"); - - *picture = g_memdup(pictureFrame->picture().data(), pictureSize); - *size = pictureSize; - - TagLib::String mime = pictureFrame->mimeType(); - if (mime == "image/jpeg") - *mime_type = strndup(TYPE_JPEG, strlen(TYPE_JPEG)); - else if (mime == "image/png") - *mime_type = strndup(TYPE_PNG, strlen(TYPE_PNG)); - else - *mime_type = NULL; - break; - } + return METADATA_EDITOR_ERROR_NONE; +} - return METADATA_EDITOR_ERROR_NONE; - } +static int __get_wav_picture(metadata_editor_s* metadata, int index, void **picture, int *size, char **mime_type) +{ + TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)metadata->file; + + return __get_APIC(_file->tag(), index, picture, size, mime_type); +} +#endif + +// *** This function returns buffer with picture under the specified index and buffer's (picture's) size *** // +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_s* _metadata = (metadata_editor_s*) metadata; + + ret = __check_metadata_get_parameter(_metadata, mime_type); + metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_get_parameter() [%d]", ret); + metadata_editor_retvm_if(!picture, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid picture"); + metadata_editor_retvm_if(!size, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid size"); + + switch (_metadata->filetype) { // Process the file according to the specified file type + case METADATA_EDITOR_FORMAT_MP3: + return __get_mp3_picture(_metadata, index, picture, size, mime_type); + + case METADATA_EDITOR_FORMAT_MP4: + return __get_mp4_picture(_metadata, index, picture, size, mime_type); + +#if 0 + case METADATA_EDITOR_FORMAT_FLAC: + return __get_flac_picture(_metadata, index, picture, size, mime_type); + + case METADATA_EDITOR_FORMAT_WAV: + return __get_wav_picture(_metadata, index, picture, size, mime_type); #endif default: metadata_editor_error("Wrong file type"); -- 2.7.4 From 133fdf6057e24ee6b9393445c8e0253a50509cd4 Mon Sep 17 00:00:00 2001 From: hj kim Date: Thu, 7 May 2020 17:15:03 +0900 Subject: [PATCH 14/16] Use auto keyword and remove METADATA_EDITOR_ERROR_OUT_OF_MEMORY for "new" keyword Change-Id: I595c96bade904e724dc1674fcae7a5f6ac15c459 --- src/metadata_editor.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index f553a86..0d6f146 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -213,8 +213,7 @@ static int __ID3_setTwixFrameByName(metadata_editor_s* _metadata, TagLib::ID3v1: if (tag2->frameListMap()[frameID].isEmpty()) { metadata_editor_info("The frame %s does not exist. Creating", frameID); // This is a common frame type for textural frames except comment frame - TagLib::ID3v2::TextIdentificationFrame* fr = new TagLib::ID3v2::TextIdentificationFrame(frameID); - metadata_editor_retvm_if(fr == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + auto fr = new TagLib::ID3v2::TextIdentificationFrame(frameID); fr->setTextEncoding(TagLib::String::UTF8); fr->setText(TagLib::String(value, TagLib::String::UTF8)); @@ -291,8 +290,7 @@ static int __ID3_setFrameByName(metadata_editor_s* _metadata, TagLib::ID3v2::Tag if (tag2->frameListMap()[frameID].isEmpty()) { metadata_editor_info("The frame %s does not exist. Creating", frameID); // This is a common frame type for textural frames except comment frame - TagLib::ID3v2::TextIdentificationFrame* fr = new TagLib::ID3v2::TextIdentificationFrame(frameID); - metadata_editor_retvm_if(fr == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + auto fr = new TagLib::ID3v2::TextIdentificationFrame(frameID); fr->setTextEncoding(TagLib::String::UTF8); fr->setText(TagLib::String(value, TagLib::String::UTF8)); @@ -340,7 +338,7 @@ static int __ID3_getLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag metadata_editor_info("The frame USLT exists"); TagLib::ID3v2::FrameList::Iterator it = lst.begin(); - TagLib::ID3v2::UnsynchronizedLyricsFrame* frame = static_cast(*it); + auto frame = static_cast(*it); TagLib::String str = frame->text(); bool isUTF = false; if (!str.isLatin1()) isUTF = true; @@ -371,8 +369,8 @@ static int __ID3_setTwixCommentFrame(metadata_editor_s* _metadata, TagLib::ID3v1 // If the comment frame is empty - create the frame and add it to the list if (tag2->frameListMap()["COMM"].isEmpty()) { metadata_editor_info("The frame COMM does not exist. Creating"); - TagLib::ID3v2::CommentsFrame* fr = new TagLib::ID3v2::CommentsFrame; - metadata_editor_retvm_if(fr == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + auto fr = new TagLib::ID3v2::CommentsFrame; + fr->setText(TagLib::String(value, TagLib::String::UTF8)); fr->setTextEncoding(TagLib::String::UTF8); tag2->addFrame(fr); @@ -409,8 +407,7 @@ static int __ID3_setLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag if (lst.isEmpty()) { // No lyrics - create the frame and add it to the ID3v2 tag metadata_editor_info("The frame USLT does not exist. Creating"); - TagLib::ID3v2::UnsynchronizedLyricsFrame* frame = new TagLib::ID3v2::UnsynchronizedLyricsFrame; - metadata_editor_retvm_if(frame == NULL, METADATA_EDITOR_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); + auto frame = new TagLib::ID3v2::UnsynchronizedLyricsFrame; frame->setTextEncoding(TagLib::String::UTF8); frame->setText(TagLib::String(value, TagLib::String::UTF8)); @@ -418,7 +415,7 @@ static int __ID3_setLyricsFrame(metadata_editor_s* _metadata, TagLib::ID3v2::Tag } else { // the lyrics frames exist - change the existing one metadata_editor_info("USLT frames exist in file. Changing"); TagLib::ID3v2::FrameList::Iterator it = lst.begin(); - TagLib::ID3v2::UnsynchronizedLyricsFrame* frame = static_cast(*it); + auto frame = static_cast(*it); frame->setTextEncoding(TagLib::String::UTF8); frame->setText(TagLib::String(value, TagLib::String::UTF8)); } -- 2.7.4 From d56ae4a38716d7fd4e0fcdb6a3bd484937d558cb Mon Sep 17 00:00:00 2001 From: hj kim Date: Thu, 7 May 2020 17:27:48 +0900 Subject: [PATCH 15/16] Use defines for mime Change-Id: I5de8de8a0f6325dab8850bd25c8ac99be79c56e9 --- src/metadata_editor.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 0d6f146..9a60fcb 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -699,8 +699,6 @@ int __metadata_editor_get_file_type(const char *path) { static int __metadata_editor_get_picture_type(const char *path, char **type) { int ret = 0; char mimetype[255] = {0, }; - const char *type_jpeg = "image/jpeg"; - const char *type_png = "image/png"; /* get content type and mime type from file. */ ret = aul_get_mime_from_file(path, mimetype, sizeof(mimetype)); @@ -712,10 +710,10 @@ static int __metadata_editor_get_picture_type(const char *path, char **type) { metadata_editor_retvm_if(ret < 0, METADATA_EDITOR_ERROR_OPERATION_FAILED, "__metadata_editor_get_file_ext failed"); if (strcasecmp(ext, "JPG") == 0 || strcasecmp(ext, "JPEG") == 0) { - *type = g_strndup(type_jpeg, strlen(type_jpeg)); + *type = g_strdup(MIME_TYPE_JPEG); return METADATA_EDITOR_ERROR_NONE; } else if (strcasecmp(ext, "PNG") == 0) { - *type = g_strndup(type_png, strlen(type_png)); + *type = g_strdup(MIME_TYPE_JPEG); return METADATA_EDITOR_ERROR_NONE; } else { return METADATA_EDITOR_ERROR_NOT_SUPPORTED; @@ -1580,9 +1578,9 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const metadata_editor_info("The item exists. Adding picture"); TagLib::MP4::CoverArtList lst = it->second.toCoverArtList(); TagLib::MP4::CoverArt::Format format; - if (strncmp(type, "image/jpeg", strlen("image/jpeg")) == 0) + if (strncmp(type, MIME_TYPE_JPEG, strlen(MIME_TYPE_JPEG)) == 0) format = TagLib::MP4::CoverArt::JPEG; - else if (strncmp(type, "image/png", strlen("image/jpeg")) == 0) + else if (strncmp(type, MIME_TYPE_PNG, strlen(MIME_TYPE_PNG)) == 0) format = TagLib::MP4::CoverArt::PNG; else format = (TagLib::MP4::CoverArt::Format)0xFFFF; @@ -1595,9 +1593,9 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const } else { // Item was not found metadata_editor_info("The item does not exist. Adding picture"); TagLib::MP4::CoverArt::Format format; - if (strncmp(type, "image/jpeg", strlen("image/jpeg")) == 0) + if (strncmp(type, MIME_TYPE_JPEG, strlen(MIME_TYPE_JPEG)) == 0) format = TagLib::MP4::CoverArt::JPEG; - else if (strncmp(type, "image/png", strlen("image/jpeg")) == 0) + else if (strncmp(type, MIME_TYPE_PNG, strlen(MIME_TYPE_PNG)) == 0) format = TagLib::MP4::CoverArt::PNG; else format = (TagLib::MP4::CoverArt::Format)0xFFFF; -- 2.7.4 From eb7da85f959318f6e0f57000c3798beca09aedd4 Mon Sep 17 00:00:00 2001 From: hj kim Date: Thu, 7 May 2020 18:38:27 +0900 Subject: [PATCH 16/16] Improve metadata_editor_append_picture() API Change-Id: I030ebb2539b49eb9a1748cd9e529dd967432d45f --- src/metadata_editor.cpp | 207 ++++++++++++++++++++---------------------------- 1 file changed, 87 insertions(+), 120 deletions(-) diff --git a/src/metadata_editor.cpp b/src/metadata_editor.cpp index 9a60fcb..83c250e 100755 --- a/src/metadata_editor.cpp +++ b/src/metadata_editor.cpp @@ -734,7 +734,7 @@ static int __metadata_editor_get_picture_type(const char *path, char **type) { return METADATA_EDITOR_ERROR_NOT_SUPPORTED; } -int __metadata_editor_get_picture_info(const char *path, void **picture, int *size, char **type) { +int __metadata_editor_get_picture_info(const char *path, void **picture, size_t *size, char **type) { int ret; ret = __metadata_editor_get_picture_type(path, type); @@ -1423,16 +1423,12 @@ static int __get_mp4_picture(metadata_editor_s* metadata, int index, void **pict metadata_editor_retvm_if(!tag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag does not exist"); - // Get map of items directly from tag and launch a search of specific item - TagLib::MP4::ItemListMap& itemMap = tag->itemListMap(); - TagLib::MP4::ItemListMap::ConstIterator it = itemMap.find("covr"); - - if (it == itemMap.end()) { + if (!(tag->contains("covr"))) { metadata_editor_error("No item in file. No pictures in file"); return METADATA_EDITOR_ERROR_OPERATION_FAILED; } - TagLib::MP4::CoverArtList lst = it->second.toCoverArtList(); + TagLib::MP4::CoverArtList lst = tag->item("covr").toCoverArtList(); // Check if the index is in range of CoverArtList Item if ((index < 0) || ((uint)index >= lst.size())) { @@ -1519,12 +1515,81 @@ extern "C" int metadata_editor_get_picture(metadata_editor_h metadata, int index } } +static int __append_APIC(TagLib::ID3v2::Tag* tag, void *picture, size_t size, const char *mime_type) +{ + metadata_editor_retvm_if(!tag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Error. No ID3v2 tag in file."); + + auto pictureFrame = new TagLib::ID3v2::AttachedPictureFrame(); + + metadata_editor_info("New APIC frame will be added to the ID3v2 tag"); + + pictureFrame->setPicture(TagLib::ByteVector((char*)picture, size)); + pictureFrame->setType(TagLib::ID3v2::AttachedPictureFrame::FrontCover); + pictureFrame->setMimeType(mime_type); + + tag->addFrame(pictureFrame); + + return METADATA_EDITOR_ERROR_NONE; + +} +static int __append_mp3_picture(metadata_editor_s* metadata, void *picture ,size_t size, const char *mime_type) +{ + return __append_APIC(dynamic_cast(metadata->file)->ID3v2Tag(true), picture, size, mime_type); +} + +static int __append_mp4_picture(metadata_editor_s* metadata, void *picture, size_t size, const char *mime_type) +{ + auto tag = dynamic_cast(metadata->file->tag()); + + metadata_editor_retvm_if(!tag, METADATA_EDITOR_ERROR_OPERATION_FAILED, "Tag was not created"); + + TagLib::MP4::CoverArtList lst; + TagLib::MP4::CoverArt::Format format = TagLib::MP4::CoverArt::Unknown; + if (strncmp(mime_type, MIME_TYPE_JPEG, strlen(MIME_TYPE_JPEG)) == 0) + format = TagLib::MP4::CoverArt::JPEG; + else if (strncmp(mime_type, MIME_TYPE_PNG, strlen(MIME_TYPE_PNG)) == 0) + format = TagLib::MP4::CoverArt::PNG; + + if (tag->contains("covr")) { + metadata_editor_info("The item exists. Adding picture"); + lst = tag->item("covr").toCoverArtList(); + } + + lst.append(TagLib::MP4::CoverArt(format, TagLib::ByteVector((char*)picture, size))); + tag->setItem("covr", lst); + + return METADATA_EDITOR_ERROR_NONE; +} + +#if 0 +static int __append_flac_picture(metadata_editor_s* metadata, void *picture, size_t size, const char *mime_type) +{ + TagLib::FLAC::File* _file = (TagLib::FLAC::File*) metadata->file; + auto frontCover = new TagLib::FLAC::Picture; + + metadata_editor_debug_fenter(); + + frontCover->setData(TagLib::ByteVector((char*)picture, size)); + frontCover->setType(TagLib::FLAC::Picture::FrontCover); + frontCover->setMimeType(mime_type); + + _file->addPicture(frontCover); + + return METADATA_EDITOR_ERROR_NONE; +} + +static int __append_wav_picture(metadata_editor_s* metadata, void *picture, size_t size, const char *mime_type) +{ + return __append_APIC(dynamic_cast(metadata->file->tag()), picture, size, mime_type); +} +#endif + // *** This function appends a cover art picture to the file *** // extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const char *path) { int ret = METADATA_EDITOR_ERROR_NONE; void *picture = NULL; - int size = 0; - char *type = NULL; + size_t size = 0; + char *mime_type = NULL; metadata_editor_s* _metadata = (metadata_editor_s*) metadata; @@ -1532,124 +1597,26 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, ret, "fail to __check_metadata_set_parameter() [%d]", ret); metadata_editor_retvm_if(!path, METADATA_EDITOR_ERROR_INVALID_PARAMETER, "Invalid path"); - ret = __metadata_editor_get_picture_info(path, &picture, &size, &type); + ret = __metadata_editor_get_picture_info(path, &picture, &size, &mime_type); metadata_editor_retvm_if(ret != METADATA_EDITOR_ERROR_NONE, METADATA_EDITOR_ERROR_PERMISSION_DENIED, "File does not exist or you have no rights to open it"); - switch (_metadata->filetype) { // Process the file according to the specified file type - case METADATA_EDITOR_FORMAT_MP3: { - // Bring the pointer to actual file type and make tags pointers - TagLib::MPEG::File* _file = (TagLib::MPEG::File*)_metadata->file; - TagLib::ID3v2::Tag* tag2 = _file->ID3v2Tag(true); - // Check if the valid tag pointer exists - if (tag2 == NULL) { - metadata_editor_error("Error. ID3v2 tag was not created. Can not proceed metadata updating"); - ret = METADATA_EDITOR_ERROR_OPERATION_FAILED; - break; - } - TagLib::ID3v2::AttachedPictureFrame* pictureFrame = new TagLib::ID3v2::AttachedPictureFrame(); - if (pictureFrame == NULL) { - metadata_editor_error("OUT_OF_MEMORY"); - ret = METADATA_EDITOR_ERROR_OUT_OF_MEMORY; - break; - } - metadata_editor_info("New APIC frame will be added to the ID3v2 tag"); - pictureFrame->setPicture(TagLib::ByteVector((char*)picture, size)); - pictureFrame->setType(TagLib::ID3v2::AttachedPictureFrame::FrontCover); - pictureFrame->setMimeType(type); - - tag2->addFrame(pictureFrame); + switch (_metadata->filetype) { + case METADATA_EDITOR_FORMAT_MP3: + ret = __append_mp3_picture(_metadata, picture, size, mime_type); + break; - ret = METADATA_EDITOR_ERROR_NONE; + case METADATA_EDITOR_FORMAT_MP4: + ret = __append_mp4_picture(_metadata, picture, size, mime_type); break; - } - case METADATA_EDITOR_FORMAT_MP4: { - TagLib::MP4::File* _file = (TagLib::MP4::File*) _metadata->file; - TagLib::MP4::Tag* tag = _file->tag(); - if (!tag) { - metadata_editor_error("Tag was not created"); - ret = METADATA_EDITOR_ERROR_OPERATION_FAILED; - break; - } - // Get map of items directly from tag and launch a search of specific item - TagLib::MP4::ItemListMap& itemMap = tag->itemListMap(); - TagLib::MP4::ItemListMap::ConstIterator it = itemMap.find("covr"); - if (it != itemMap.end()) { // Item was found - metadata_editor_info("The item exists. Adding picture"); - TagLib::MP4::CoverArtList lst = it->second.toCoverArtList(); - TagLib::MP4::CoverArt::Format format; - if (strncmp(type, MIME_TYPE_JPEG, strlen(MIME_TYPE_JPEG)) == 0) - format = TagLib::MP4::CoverArt::JPEG; - else if (strncmp(type, MIME_TYPE_PNG, strlen(MIME_TYPE_PNG)) == 0) - format = TagLib::MP4::CoverArt::PNG; - else - format = (TagLib::MP4::CoverArt::Format)0xFFFF; - TagLib::MP4::CoverArt cover(format, TagLib::ByteVector((char*)picture, size)); - lst.append(cover); - itemMap.insert("covr", TagLib::MP4::Item(lst)); - - ret = METADATA_EDITOR_ERROR_NONE; - break; - } else { // Item was not found - metadata_editor_info("The item does not exist. Adding picture"); - TagLib::MP4::CoverArt::Format format; - if (strncmp(type, MIME_TYPE_JPEG, strlen(MIME_TYPE_JPEG)) == 0) - format = TagLib::MP4::CoverArt::JPEG; - else if (strncmp(type, MIME_TYPE_PNG, strlen(MIME_TYPE_PNG)) == 0) - format = TagLib::MP4::CoverArt::PNG; - else - format = (TagLib::MP4::CoverArt::Format)0xFFFF; - TagLib::MP4::CoverArt cover(format, TagLib::ByteVector((char*)picture, size)); - TagLib::MP4::CoverArtList lst; - lst.append(cover); - itemMap.insert("covr", TagLib::MP4::Item(lst)); - - ret = METADATA_EDITOR_ERROR_NONE; - break; - } - } #if 0 - case METADATA_EDITOR_FORMAT_FLAC: { - TagLib::FLAC::File* _file = (TagLib::FLAC::File*) _metadata->file; - TagLib::FLAC::Picture* frontCover = new TagLib::FLAC::Picture; - if (frontCover == NULL) { - metadata_editor_error("OUT_OF_MEMORY"); - ret = METADATA_EDITOR_ERROR_OUT_OF_MEMORY; - break; - } - frontCover->setData(TagLib::ByteVector((char*)picture, size)); - frontCover->setType(TagLib::FLAC::Picture::FrontCover); - frontCover->setMimeType(type); - - metadata_editor_info("Picture will be added to FLAC file"); - _file->addPicture(frontCover); - ret = METADATA_EDITOR_ERROR_NONE; + case METADATA_EDITOR_FORMAT_FLAC: + ret = __append_flac_picture(_metadata, picture, size, mime_type); break; - } - case METADATA_EDITOR_FORMAT_WAV: { - // Bring the pointer to actual file type and make tags pointers - TagLib::RIFF::WAV::File* _file = (TagLib::RIFF::WAV::File*)_metadata->file; - TagLib::ID3v2::Tag* tag2 = _file->tag(); - // Check if the valid tag pointer exists - if (tag2 == NULL) { - metadata_editor_error("Error. ID3v2 tag was not created. Can not proceed metadata updating"); - ret = METADATA_EDITOR_ERROR_OPERATION_FAILED; - break; - } - TagLib::ID3v2::AttachedPictureFrame* pictureFrame = new TagLib::ID3v2::AttachedPictureFrame(); - if (pictureFrame == NULL) { - metadata_editor_error("OUT_OF_MEMORY"); - ret = METADATA_EDITOR_ERROR_OUT_OF_MEMORY; - break; - } - metadata_editor_info("New APIC frame will be added to the ID3v2 tag"); - pictureFrame->setPicture(TagLib::ByteVector((char*)picture, size)); - pictureFrame->setType(TagLib::ID3v2::AttachedPictureFrame::FrontCover); - pictureFrame->setMimeType(type); - tag2->addFrame(pictureFrame); - ret = METADATA_EDITOR_ERROR_NONE; + + case METADATA_EDITOR_FORMAT_WAV: + ret = __append_wav_picture(_metadata, picture, size, mime_type); break; - } #endif default: { metadata_editor_error("Wrong file type"); @@ -1659,7 +1626,7 @@ extern "C" int metadata_editor_append_picture(metadata_editor_h metadata, const } META_SAFE_FREE(picture); - g_free(type); + g_free(mime_type); return ret; } -- 2.7.4