2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <dpl/log/log.h>
18 #include <dpl/scoped_ptr.h>
20 #include "Mediacontent.h"
21 #include "MediacontentManager.h"
22 #include "MediaFilterValidator.h"
23 #include "MediaSearchVisitor.h"
30 using namespace TizenApis::Api::Mediacontent;
31 using namespace WrtDeviceApis::Commons;
35 const string SELECT_FOLDER_QUERY =
36 "select folder_uuid, path, title, storage_type,modified_date from (select folder_uuid, path, folder_name as title, storage_type,modified_date from visual_folder where valid=1 union select folder_uuid, path, folder_name as title, storage_type,modified_date from audio_folder) where 1 ";
38 const string VIEW_MEDIA_QUERY_WITH_FOLDER =
39 "select visual_uuid, folder_uuid, content_type, display_name, path, thumbnail_path,created_date, released_date, modified_date, description,rating, album, artist, last_played_time, played_count,longitude, latitude, width, height, orientation, genre, author, duration,size from \
40 (select visual_uuid,folder_uuid, content_type, display_name, path, thumbnail_path,null as created_date, released_date, modified_date, description,rating, album, artist, last_played_time, null as played_count,longitude, latitude, width, height, orientation,null as genre, null as author, duration,size from visual_media join \
42 (select visual_uuid as meta_uuid, longitude, latitude, description, width, height, datetaken as released_date, orientation,null as album, null as artist, null as last_played_time,null as duration from image_meta \
44 select visual_uuid as meta_uuid, longitude, latitude, description, width, height, datetaken as released_date, null as orientation, album, artist, last_played_time,duration from video_meta)) \
45 on visual_uuid=meta_uuid \
47 select audio_uuid, folder_uuid as folder_uuid, content_type, title as display_name, path, thumbnail_path, added_time, year, modified_date, description, favourite, album, artist, last_played_time, played_count, null as longitude, null as latitude, null as width, null as height, null as orientation, genre, author, duration, size from audio_media) where 1 ";
49 const string SELECT_MEDIA_ID_WITH_FOLDER =
50 "select item_id from item_view where folder_uuid=";
51 const string SELECT_EXTRA_AUDIO =
52 "select copyright,bitrate,track_num,size from audio_media where audio_uuid=";
57 namespace Mediacontent{
59 Mediacontent::Mediacontent()
67 db_util_open(MEDIA_DB_PATH, &hDBCt, 0);
68 LogDebug("hDBCt:" << hDBCt);
71 Mediacontent::~Mediacontent()
76 if(db_connnect_count == 0)
78 ret = db_util_close(hDBCt);
86 tm Mediacontent::toDateTm(time_t date)
90 tm_date.tm_year = (date / 10000) - 1900;
91 tm_date.tm_mon = ((date - ((tm_date.tm_year + 1900) * 10000)) / 100) - 1;
92 tm_date.tm_mday = (date - ((tm_date.tm_year + 1900) * 10000) - tm_date.tm_mon * 100);
98 void Mediacontent::convertToPlatformFolder(folder_s &media_folder, MediacontentFolderPtr& newFolder)
100 if(media_folder.folder_uuid != NULL)
102 newFolder->setFolderUUID(media_folder.folder_uuid);
104 if(media_folder.folder_path != NULL)
106 newFolder->setFolderName(media_folder.folder_name);
108 if(media_folder.folder_name != NULL)
110 newFolder->setFolderPath(media_folder.folder_path);
113 newFolder->setFolderModifiedDate(toDateTm(media_folder.modified_date));
117 if(media_folder.storage_type == 0)
119 storageType = "INTERNAL";
121 else if( media_folder.storage_type == 1)
123 storageType = "EXTERNAL";
127 storageType = "UNKNOWN";
129 newFolder->setFolderStorageType(storageType);
134 string Mediacontent::makeQuerySortMode(SortModeArrayPtr attr)
139 SortModeArray::iterator it = attr->begin();
141 for (;it!=attr->end(); ++it)
143 attriName = (*it)->getAttributeName();
144 //convert to attribue's name
145 MediaSearchVisitor visitor;
146 attriName = visitor.getPlatformAttr(attriName);
147 if (attriName.compare("") != 0)
151 query.append(" ORDER BY ");
156 query.append(attriName);
158 if ((*it)->getOrder() == Api::Tizen::ASCENDING_SORT_ORDER)
160 query.append(" ASC");
164 query.append(" DESC");
175 void Mediacontent::OnRequestReceived(const IEventFindFolderPtr &eFolder)
183 string query(SELECT_FOLDER_QUERY);
186 MediaSearchVisitorPtr visitor(new MediaSearchVisitor());
188 if(eFolder->getFilterIsSet())
190 FilterPtr filter = eFolder->getFilter();
192 FilterValidatorPtr validator = MediaFilterValidatorFactory::getMediaFilterValidator(MediaFilterValidatorFactory::QUERY_FOLDER);
193 bool success = filter->validate(validator);
196 ThrowMsg(InvalidArgumentException, "Invalid filter arguments.");
198 IFilterVisitorPtr IVisitor = DPL::StaticPointerCast<IFilterVisitor>(visitor);
200 visitor->setQueryType(MediaSearchVisitor::QUERY_FOLDER);
201 filter->travel(IVisitor);
202 condition = visitor->getResult();
204 query.append(" and ");
205 query.append(condition);
208 if(eFolder->getSortModesIsSet())
210 sortMode = makeQuerySortMode(eFolder->getSortModes());
212 query.append(sortMode);
216 if (eFolder->getLimitIsSet())
218 limitOffset.append(" LIMIT ");
219 std::stringstream limitStream;
220 limitStream << eFolder->getLimit();
221 limitOffset.append(limitStream.str());
222 if(eFolder->getOffsetIsSet())
224 limitOffset.append(" OFFSET ");
225 std::stringstream offsetStream;
226 offsetStream << eFolder->getOffset();
227 limitOffset.append(offsetStream.str());
230 query.append(limitOffset);
232 LogDebug("execute condition [" << condition << "]");
233 LogDebug("execute projection [" << projection << "]");
234 LogDebug("execute sortMode [" << sortMode << "]");
235 LogDebug("execute limitOffset [" << limitOffset << "]");
236 LogDebug("execute query [" << query << "]");
240 sqlite3_stmt* pStmt = NULL;
241 folder_s media_folder;
242 sqlite3_prepare_v2(hDBCt, (char *)(query.c_str()), strlen((char *)(query.c_str())), &pStmt, NULL);
243 while( sqlite3_step(pStmt) == SQLITE_ROW)
245 media_folder.folder_uuid = (char *)sqlite3_column_text(pStmt, 0);
246 media_folder.folder_path = (char *)sqlite3_column_text(pStmt, 1);
247 media_folder.folder_name = (char *)sqlite3_column_text(pStmt, 2);
248 media_folder.storage_type = sqlite3_column_int(pStmt, 3);
249 media_folder.modified_date = sqlite3_column_int(pStmt, 4);
251 MediacontentFolderPtr newFolder(new MediacontentFolder());
252 convertToPlatformFolder(media_folder, newFolder);
254 eFolder->addFolder(newFolder);
256 sqlite3_finalize(pStmt);
257 eFolder->setResult(true);
260 catch (const Exception &ex)
262 LogError("Exception: " << ex.DumpToString());
263 eFolder->setResult(false);
265 eFolder->setCancelAllowed(true);
269 void Mediacontent::OnRequestReceived(const IEventFindMediaPtr &eMedia)
271 LogDebug("OnRequestReceived::IEventFindMediaPtr entered");
278 string query(VIEW_MEDIA_QUERY_WITH_FOLDER);
280 MediaSearchVisitorPtr visitor(new MediaSearchVisitor());
282 if(eMedia->getFilterIsSet())
284 FilterPtr filter = eMedia->getFilter();
286 // FIXME validator have to be placed at JS binding.
287 /* FilterValidatorPtr validator = MediaFilterValidatorFactory::getMediaFilterValidator(MediaFilterValidatorFactory::QUERY_MEDIA);
288 bool success = filter->validate(validator);
291 ThrowMsg(InvalidArgumentException, "Invalid filter arguments.");
293 IFilterVisitorPtr IVisitor = DPL::StaticPointerCast<IFilterVisitor>(visitor);
295 visitor->setQueryType(MediaSearchVisitor::QUERY_MEDIA);
296 filter->travel(IVisitor);
297 condition = visitor->getResult();
298 query.append(" and ");
299 query.append(condition);
302 if(eMedia->getSortModesIsSet())
304 sortMode = makeQuerySortMode(eMedia->getSortModes());
306 query.append(sortMode);
308 if (eMedia->getLimitIsSet())
310 limitOffset.append(" LIMIT ");
311 std::stringstream limitStream;
312 limitStream << eMedia->getLimit();
313 limitOffset.append(limitStream.str());
314 if(eMedia->getOffsetIsSet())
316 limitOffset.append(" OFFSET ");
317 std::stringstream offsetStream;
318 offsetStream << eMedia->getOffset();
319 limitOffset.append(offsetStream.str());
322 query.append(limitOffset);
325 LogDebug("execute condition [" << condition << "]");
326 LogDebug("execute projection [" << projection << "]");
327 LogDebug("execute sortMode [" << sortMode << "]");
328 LogDebug("execute limitOffset [" << limitOffset << "]");
329 LogDebug("execute query [" << query << "]");
336 sqlite3_stmt* pStmt = NULL;
338 ret = sqlite3_prepare_v2(hDBCt, (char *)(query.c_str()), query.length(), &pStmt, NULL);
340 while( sqlite3_step(pStmt) == SQLITE_ROW)
343 content_type = sqlite3_column_int(pStmt, 2);
345 if(content_type == MEDIA_TYPE_IMAGE)
348 MediacontentImage *newImage(new MediacontentImage());
349 readImageFromDB(pStmt,newImage);
350 eMedia->addMedia(newImage);
352 else if(content_type == MEDIA_TYPE_VIDEO)
354 MediacontentVideo *newVideo(new MediacontentVideo());
355 readVideoFromDB(pStmt,newVideo);
356 eMedia->addMedia(newVideo);
358 else if(content_type == MEDIA_TYPE_AUDIO)
360 MediacontentAudio *newVAudio(new MediacontentAudio());
361 readAudioFromDB(pStmt,newVAudio);
362 eMedia->addMedia(newVAudio);
367 sqlite3_finalize(pStmt);
368 eMedia->setResult(true);
371 catch (const Exception &ex)
373 LogError("Exception: " << ex.DumpToString());
374 eMedia->setResult(false);
376 eMedia->setCancelAllowed(true);
379 void Mediacontent::OnRequestReceived(const IEventBrowseFolderPtr &eBrowse)
381 LogDebug("OnRequestReceived::IEventFindMediaPtr entered");
388 string query(VIEW_MEDIA_QUERY_WITH_FOLDER);
389 std::stringstream folderStream;
390 folderStream <<" and folder_uuid='" << eBrowse->getFolderID() <<"' ";
391 query.append(folderStream.str());
393 MediaSearchVisitorPtr visitor(new MediaSearchVisitor());
395 if(eBrowse->getFilterIsSet())
397 FilterPtr filter = eBrowse->getFilter();
399 // FIXME validator have to be placed at JS binding.
400 FilterValidatorPtr validator = MediaFilterValidatorFactory::getMediaFilterValidator(MediaFilterValidatorFactory::QUERY_MEDIA);
401 bool success = filter->validate(validator);
404 ThrowMsg(InvalidArgumentException, "Invalid filter arguments.");
406 IFilterVisitorPtr IVisitor = DPL::StaticPointerCast<IFilterVisitor>(visitor);
408 visitor->setQueryType(MediaSearchVisitor::QUERY_MEDIA);
409 filter->travel(IVisitor);
410 condition = visitor->getResult();
411 query.append(" and ");
412 query.append(condition);
415 if(eBrowse->getSortModesIsSet())
417 sortMode = makeQuerySortMode(eBrowse->getSortModes());
419 query.append(sortMode);
421 if (eBrowse->getLimitIsSet())
423 limitOffset.append(" LIMIT ");
424 std::stringstream limitStream;
425 limitStream << eBrowse->getLimit();
426 limitOffset.append(limitStream.str());
427 if(eBrowse->getOffsetIsSet())
429 limitOffset.append(" OFFSET ");
430 std::stringstream offsetStream;
431 offsetStream << eBrowse->getOffset();
432 limitOffset.append(offsetStream.str());
435 query.append(limitOffset);
438 LogDebug("execute condition [" << condition << "]");
439 LogDebug("execute projection [" << projection << "]");
440 LogDebug("execute sortMode [" << sortMode << "]");
441 LogDebug("execute limitOffset [" << limitOffset << "]");
442 LogDebug("execute query [" << query << "]");
447 sqlite3_stmt* pStmt = NULL;
449 ret = sqlite3_prepare_v2(hDBCt, (char *)(query.c_str()), query.length(), &pStmt, NULL);
451 while( sqlite3_step(pStmt) == SQLITE_ROW)
454 content_type = sqlite3_column_int(pStmt, 2);
456 if(content_type == MEDIA_TYPE_IMAGE)
459 MediacontentImage *newImage(new MediacontentImage());
460 readImageFromDB(pStmt,newImage);
461 eBrowse->addMedia(newImage);
463 else if(content_type == MEDIA_TYPE_VIDEO)
465 MediacontentVideo *newVideo(new MediacontentVideo());
466 readVideoFromDB(pStmt,newVideo);
467 eBrowse->addMedia(newVideo);
469 else if(content_type == MEDIA_TYPE_AUDIO)
471 MediacontentAudio *newVAudio(new MediacontentAudio());
472 readAudioFromDB(pStmt,newVAudio);
473 eBrowse->addMedia(newVAudio);
478 sqlite3_finalize(pStmt);
479 eBrowse->setResult(true);
482 catch (const Exception &ex)
484 LogError("Exception: " << ex.DumpToString());
485 eBrowse->setResult(false);
488 eBrowse->setCancelAllowed(true);
492 bool Mediacontent::updateMediaToDB(MediacontentMediaPtr mediaPtr)
498 string type = mediaPtr->getMediaType();
500 if(type.compare("IMAGE")==0)
503 MediacontentImagePtr imagePtr = DPL::DynamicPointerCast<MediacontentImage>(mediaPtr);
508 if(imagePtr->getIsChangedFavorite())
510 query.append("update visual_media set rating=");
511 std::stringstream offsetStream;
512 offsetStream << imagePtr->getFavorite();
513 query.append(offsetStream.str());
514 query.append(" where visual_uuid='");
515 query.append(imagePtr->getMediaUUID());
517 LogDebug("QUERY : " << query);
519 err = sqlite3_exec(hDBCt, query.c_str(), NULL, NULL, &errMsg);
520 if (SQLITE_OK != err)
524 sqlite3_free(errMsg);
531 if(type.compare("VIDEO")==0)
534 MediacontentVideoPtr videoPtr = DPL::DynamicPointerCast<MediacontentVideo>(mediaPtr);
538 if(videoPtr->getIsChangedFavorite())
540 std::stringstream offsetStream;
541 offsetStream << "update visual_media set rating=" << videoPtr->getFavorite() << " where visual_uuid=" << "'" << videoPtr->getMediaUUID() << "'";
542 query = offsetStream.str();
543 err = sqlite3_exec(hDBCt, query.c_str(), NULL, NULL, &errMsg);
544 if (SQLITE_OK != err)
548 sqlite3_free(errMsg);
552 if(videoPtr->isChangedPlayedTime() || videoPtr->isChangedPlayCount())
554 std::stringstream offsetStream;
555 offsetStream << "update video_meta set last_played_time=" << videoPtr->getVideoPlayedTime() << " where visual_uuid=" << "'" << videoPtr->getMediaUUID() << "'";
556 query = offsetStream.str();
557 err = sqlite3_exec(hDBCt, query.c_str(), NULL, NULL, &errMsg);
558 if (SQLITE_OK != err)
562 sqlite3_free(errMsg);
569 if(type.compare("AUDIO")==0)
572 MediacontentAudioPtr audioPtr = DPL::DynamicPointerCast<MediacontentAudio>(mediaPtr);
576 if(audioPtr->getIsChangedFavorite())
578 std::stringstream offsetStream;
579 offsetStream << "update audio_media set rating=" << audioPtr->getFavorite() << " where audio_uuid=" << "'" << audioPtr->getMediaUUID() << "'";
580 query = offsetStream.str();
581 err = sqlite3_exec(hDBCt, query.c_str(), NULL, NULL, &errMsg);
582 if (SQLITE_OK != err)
586 sqlite3_free(errMsg);
592 if(audioPtr->isChangedPlayedTime() || audioPtr->isChangedPlayCount())
594 std::stringstream offsetStream;
595 offsetStream << "update audio_media set last_played_time=" <<audioPtr->getAudioPlayedTime()<< ",played_count="<<audioPtr->getAudioPlayCount()<<" where audio_uuid=" << "'" << audioPtr->getMediaUUID() << "'";
596 query = offsetStream.str();
597 err = sqlite3_exec(hDBCt, query.c_str(), NULL, NULL, &errMsg);
598 if (SQLITE_OK != err)
602 sqlite3_free(errMsg);
613 void Mediacontent::OnRequestReceived(const IEventUpdateMediaPtr &eMedia)
615 LogDebug("OnRequestReceived::IEventUpdateMediaPtr entered");
618 MediacontentMediaPtr mediaPtr = eMedia->getMediaItem();
620 if(updateMediaToDB(mediaPtr))
622 eMedia->setResult(true);
626 eMedia->setResult(false);
629 catch (const Exception &ex)
631 LogError("Exception: " << ex.DumpToString());
632 eMedia->setResult(false);
634 eMedia->setCancelAllowed(true);
638 void Mediacontent::OnRequestReceived(const IEventUpdateMediaItemsPtr &eItems)
640 LogDebug("OnRequestReceived::IEventUpdateMediaItemsPtr entered");
644 MediacontentMediaListPtr mediaListPtr = eItems->getMediaItems();
645 if (mediaListPtr->empty())
647 ThrowMsg(NullPointerException, "Item vector parameter is empty");
650 for(unsigned int i=0; i<mediaListPtr->size(); i++)
652 MediacontentMediaPtr mediaPtr = mediaListPtr->at(i);
653 if(!updateMediaToDB(mediaPtr))
655 ThrowMsg(NullPointerException, "DB operation is failed");
658 eItems->setResult(true);
660 catch (const Exception &ex)
662 LogError("Exception: " << ex.DumpToString());
663 eItems->setResult(false);
665 eItems->setCancelAllowed(true);
669 void Mediacontent::readImageFromDB(sqlite3_stmt* pStmt, MediacontentImage* newImage)
675 tmp = (char*)sqlite3_column_text(pStmt,0);
677 newImage->setMediaUUID(tmp);
679 newImage->setMediaType("IMAGE");
682 tmp = (char*)sqlite3_column_text(pStmt,3);
684 newImage->setDisplayName(tmp);
686 tmp = (char*)sqlite3_column_text(pStmt,4);
688 newImage->setFilePath(tmp);
690 tmp = (char*)sqlite3_column_text(pStmt,5);
692 newImage->setThumbnailPath(tmp);
694 newImage->setCreatedDate(toDateTm(sqlite3_column_int(pStmt,6)));
695 newImage->setReleasedDate(toDateTm(sqlite3_column_int(pStmt,7)));
696 newImage->setModifiedDate(toDateTm(sqlite3_column_int(pStmt,8)));
698 tmp = (char*)sqlite3_column_text(pStmt,9);
700 newImage->setDescription(tmp);
702 newImage->setFavorite(sqlite3_column_int(pStmt,10));
703 newImage->setImageLatitude(sqlite3_column_double(pStmt,15));
704 newImage->setImageLongitude(sqlite3_column_double(pStmt,16));
705 newImage->setImageWidth(sqlite3_column_int(pStmt,17));
706 newImage->setImageHeight(sqlite3_column_int(pStmt,18));
707 int orientation = (sqlite3_column_int(pStmt,19));
708 string orientationStr;
712 orientationStr = "NORMAL";
715 orientationStr = "FLIP_HORIZONTAL";
718 orientationStr = "ROTATE_180";
721 orientationStr = "FLIP_VERTICAL";
724 orientationStr = "TRANSPOSE";
727 orientationStr = "ROTATE_90";
730 orientationStr = "TRANSVERSE";
733 orientationStr = "ROTATE_270";
736 newImage->setImageOrientation(orientationStr);
737 newImage->setSize(sqlite3_column_double(pStmt,23));
744 void Mediacontent::readVideoFromDB(sqlite3_stmt* pStmt, MediacontentVideo* newVideo)
750 tmp = (char*)sqlite3_column_text(pStmt,0);
752 newVideo->setMediaUUID(tmp);
754 newVideo->setMediaType("VIDEO");
757 tmp = (char*)sqlite3_column_text(pStmt,3);
759 newVideo->setDisplayName(tmp);
761 tmp = (char*)sqlite3_column_text(pStmt,4);
763 newVideo->setFilePath(tmp);
765 tmp = (char*)sqlite3_column_text(pStmt,5);
767 newVideo->setThumbnailPath(tmp);
769 newVideo->setCreatedDate(toDateTm(sqlite3_column_int(pStmt,6)));
770 newVideo->setReleasedDate(toDateTm(sqlite3_column_int(pStmt,7)));
771 newVideo->setModifiedDate(toDateTm(sqlite3_column_int(pStmt,8)));
773 tmp = (char*)sqlite3_column_text(pStmt,9);
775 newVideo->setDescription(tmp);
777 newVideo->setFavorite(sqlite3_column_int(pStmt,10));
779 tmp = (char*)sqlite3_column_text(pStmt,11);
781 newVideo->setVideoAlbum(tmp);
783 tmp = (char*)sqlite3_column_text(pStmt,12);
785 newVideo->setVideoArtist(tmp);
787 newVideo->setVideoPlayedTime(sqlite3_column_int(pStmt,13));
788 newVideo->setVideoPlayCount(sqlite3_column_int(pStmt,14));
790 newVideo->setVideoLongitude(sqlite3_column_double(pStmt,15));
791 newVideo->setVideoLatitude(sqlite3_column_double(pStmt,16));
793 newVideo->setVideoWidth(sqlite3_column_int(pStmt,17));
794 newVideo->setVideoHeight(sqlite3_column_int(pStmt,18));
796 newVideo->setVideoDuration(sqlite3_column_int(pStmt,22));
797 newVideo->setSize(sqlite3_column_double(pStmt,23));
803 void Mediacontent::readAudioFromDB(sqlite3_stmt* pStmt, MediacontentAudio* newAudio)
809 tmp = (char*)sqlite3_column_text(pStmt,0);
811 newAudio->setMediaUUID(tmp);
813 newAudio->setMediaType("AUDIO");
816 tmp = (char*)sqlite3_column_text(pStmt,3);
818 newAudio->setDisplayName(tmp);
820 tmp = (char*)sqlite3_column_text(pStmt,4);
822 newAudio->setFilePath(tmp);
824 tmp = (char*)sqlite3_column_text(pStmt,5);
826 newAudio->setThumbnailPath(tmp);
828 newAudio->setCreatedDate(toDateTm(sqlite3_column_int(pStmt,6)));
829 newAudio->setReleasedDate(toDateTm(sqlite3_column_int(pStmt,7)));
830 newAudio->setModifiedDate(toDateTm(sqlite3_column_int(pStmt,8)));
832 tmp = (char*)sqlite3_column_text(pStmt,9);
834 newAudio->setDescription(tmp);
836 newAudio->setFavorite(sqlite3_column_int(pStmt,10));
838 tmp = (char*)sqlite3_column_text(pStmt,11);
840 newAudio->setAudioAlbum(tmp);
842 tmp = (char*)sqlite3_column_text(pStmt,12);
844 newAudio->setAudioArtist(tmp);
846 newAudio->setAudioPlayedTime(sqlite3_column_int(pStmt,13));
847 newAudio->setAudioPlayCount(sqlite3_column_int(pStmt,14));
849 tmp = (char*)sqlite3_column_text(pStmt,20);
851 newAudio->setAudioGenre(tmp);
853 tmp = (char*)sqlite3_column_text(pStmt,21);
855 newAudio->setAudioComposer(tmp);
857 newAudio->setAudioDuration(sqlite3_column_int(pStmt,22));
858 newAudio->setSize(sqlite3_column_double(pStmt,23));
860 string queryExtraAudio(SELECT_EXTRA_AUDIO);
861 queryExtraAudio.append("'");
862 queryExtraAudio.append(newAudio->getMediaUUID());
863 queryExtraAudio.append("'");
864 sqlite3_stmt* pStmt1 = NULL;
865 //"select copyright,bitrate,track_num,size from audio_media where audio_id=";
866 if(sqlite3_prepare_v2(hDBCt, (char *)(queryExtraAudio.c_str()), strlen((char *)(queryExtraAudio.c_str())), &pStmt1, NULL) == SQLITE_OK)
868 while( sqlite3_step(pStmt1) == SQLITE_ROW)
870 tmp = (char*)sqlite3_column_text(pStmt,0);
872 newAudio->setAudioCopyright(tmp);
873 newAudio->setAudioBitrate(sqlite3_column_int(pStmt,1));
874 newAudio->setAudioTrackNum(sqlite3_column_int(pStmt,2));
875 newAudio->setAudioSize(sqlite3_column_int(pStmt,3));
877 sqlite3_finalize(pStmt1);
880 MMHandleType tag_attrs = 0;
881 LogDebug("AUDIO PATH: " << newAudio->getFilePath());
882 int ret = mm_file_create_tag_attrs(&tag_attrs, newAudio->getFilePath().c_str());
884 char *err_attr_name = NULL;
888 if (ret == MM_ERROR_NONE && tag_attrs)
890 ret = mm_file_get_attrs( tag_attrs,
892 MM_FILE_TAG_UNSYNCLYRICS, &unSyncText, &unSyncLen,
893 MM_FILE_TAG_SYNCLYRICS_NUM, &syncTextNum,
896 if (ret != MM_ERROR_NONE && err_attr_name)
898 MediacontentLyricsPtr lyricsPtr(new MediacontentLyrics());
901 lyricsPtr->setMediaLyricsType("SYNCHRONIZED");
902 for(int i=0; i < syncTextNum; i++)
904 unsigned long time_info = 0;
905 char * lyrics_info = NULL;
906 mm_file_get_synclyrics_info(tag_attrs,i,&time_info,&lyrics_info);
907 lyricsPtr->addMediaLyricsTimeStamp(time_info);
908 lyricsPtr->addMediaLyricsText(lyrics_info);
909 LogDebug("SYNCHRONIZED: " << lyrics_info);
914 LogDebug("UNSYNCHRONIZED: " << unSyncText);
915 lyricsPtr->setMediaLyricsType("UNSYNCHRONIZED");
916 lyricsPtr->addMediaLyricsTimeStamp(0);
917 lyricsPtr->addMediaLyricsText(unSyncText);
920 newAudio->setAudioLyrics(lyricsPtr);