e61ca34876226ee5d74bfcf9049db4ebb9091876
[platform/core/api/media-content.git] / src / media_info.c
1 /*
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17 #include <media_info.h>
18 #include <media_info_private.h>
19 #include <media_util_private.h>
20 #include <system_info.h>
21
22 static void __media_info_insert_completed_cb(media_request_result_s *result, void *user_data);
23 static int __media_info_insert_batch(const char **path_array, unsigned int array_length, media_insert_completed_cb completed_cb, void *user_data);
24 static int __media_info_check_file_validity(const char *path);
25
26 static void __media_info_insert_completed_cb(media_request_result_s *result, void *user_data)
27 {
28         int ret = MEDIA_CONTENT_ERROR_NONE;
29         media_insert_cb_s *_cb_data = (media_insert_cb_s *)user_data;
30
31         if (_cb_data) {
32                 if (result)
33                         ret = _content_error_capi(result->result);
34
35                 if (_cb_data->insert_completed_cb) {
36                         content_debug("User callback is being called now");
37                         _cb_data->insert_completed_cb(ret, _cb_data->user_data);
38                 }
39
40                 if (STRING_VALID(_cb_data->insert_list_path)) {
41                         if (unlink(_cb_data->insert_list_path) < 0)
42                                 content_stderror("failed to delete");
43                         g_free(_cb_data->insert_list_path);
44                 }
45         }
46
47         g_free(_cb_data);
48 }
49 // LCOV_EXCL_START
50 static bool __media_info_isFaceRecognition_feature_supported(void)
51 {
52         bool isFaceRecognitionSupported = false;
53
54         const int nRetVal = system_info_get_platform_bool("http://tizen.org/feature/vision.face_recognition", &isFaceRecognitionSupported);
55
56         if (nRetVal != SYSTEM_INFO_ERROR_NONE) {
57                 content_debug("SYSTEM_INFO_ERROR: vision.face_recognition [%d]", nRetVal);
58                 return false;
59         }
60
61         return isFaceRecognitionSupported;
62 }
63 // LCOV_EXCL_STOP
64 static int __media_info_insert_batch(const char **path_array,
65                                         unsigned int array_length,
66                                         media_insert_completed_cb completed_cb,
67                                         void *user_data)
68 {
69         int ret = MEDIA_CONTENT_ERROR_NONE;
70         FILE *fp = NULL;
71         char list_path[BATCH_REQUEST_FILE_LEN] = {0, };
72         unsigned int idx = 0;
73         size_t size = 0;
74
75         for (idx = 0; idx < BATCH_REQUEST_MAX; idx++) {
76                 snprintf(list_path, BATCH_REQUEST_FILE_LEN, "/tmp/request-%ld-%d", media_content_gettid(), idx);
77
78                 if (g_file_test(list_path, G_FILE_TEST_EXISTS)) {
79                         memset(list_path, 0x00, BATCH_REQUEST_FILE_LEN);
80                         continue;
81                 } else {
82                         content_sec_debug("The request file list path : %s", list_path);
83                         break;
84                 }
85         }
86
87         content_retvm_if(idx == BATCH_REQUEST_MAX, MEDIA_CONTENT_ERROR_DB_BUSY, "Too many request");
88
89         fp = fopen(list_path, "w");
90         if (fp == NULL) {
91                 content_stderror("failed to open file");
92                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
93         }
94
95         for (idx = 0; idx < array_length; idx++) {
96                 if (!STRING_VALID(path_array[idx])) {
97                         content_error("path[%d] is invalid string", idx);
98                         continue;
99                 }
100
101                 ret = __media_info_check_file_validity(path_array[idx]);
102                 if (ret != MEDIA_CONTENT_ERROR_NONE)
103                         goto ERROR;
104
105                 if (!_media_util_check_support_media_type(path_array[idx])) {
106                         content_error("Not supported type: index[%d]", idx);
107                         ret = MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
108                         goto ERROR;
109                 }
110
111                 size = strlen(path_array[idx]);
112                 if (fwrite(path_array[idx], 1, size, fp) != size) {
113                         content_stderror("failed to write");
114                         ret = MEDIA_CONTENT_ERROR_INVALID_OPERATION;
115                         goto ERROR;
116                 }
117
118                 if (fwrite("\n", 1, 1, fp) != 1) {
119                         content_stderror("failed to write");
120                         ret = MEDIA_CONTENT_ERROR_INVALID_OPERATION;
121                         goto ERROR;
122                 }
123         }
124
125         fclose(fp);
126
127         media_insert_cb_s *_cb_data = g_new0(media_insert_cb_s, 1);
128
129         _cb_data->insert_completed_cb = completed_cb;
130         _cb_data->user_data = user_data;
131         _cb_data->insert_list_path = g_strdup(list_path);
132
133         ret = media_files_register(list_path, __media_info_insert_completed_cb, _cb_data, _content_get_uid());
134         if (ret != MEDIA_CONTENT_ERROR_NONE) {
135                 content_error("media_files_register failed : %d", ret);
136                 if (unlink(list_path) < 0)
137                         content_stderror("failed to delete");
138                 g_free(_cb_data);
139                 return _content_error_capi(ret);
140         }
141
142         return MEDIA_CONTENT_ERROR_NONE;
143 ERROR:
144         fclose(fp);
145         if (unlink(list_path) < 0)
146                 content_stderror("failed to delete");
147
148         return ret;
149 }
150
151 static int __media_info_check_file_validity(const char *path)
152 {
153         g_autofree gchar *folder_path = NULL;
154         int ret = MEDIA_CONTENT_ERROR_NONE;
155
156         content_retip_if_fail(path);
157         content_retvm_if(_media_util_is_ignorable_file(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid ignore path");
158
159         ret = _media_util_check_file_exist(path);
160         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "invalid path");
161
162         folder_path = g_path_get_dirname(path);
163         if (_media_util_is_ignorable_dir(folder_path))
164                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
165
166         return MEDIA_CONTENT_ERROR_NONE;
167 }
168
169 void _media_info_item_get_detail(sqlite3_stmt *stmt, media_info_h media)
170 {
171         media_info_s *_media = (media_info_s*)media;
172
173         if (!_media)
174                 return;
175
176         _media->media_id = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_UUID));
177         _media->file_path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_PATH));
178         _media->display_name = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_FILE_NAME));
179         _media->media_type = (int)sqlite3_column_int(stmt, MEDIA_INFO_TYPE);
180         _media->mime_type = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_MIME_TYPE));
181         _media->size = (unsigned long long)sqlite3_column_int64(stmt, MEDIA_INFO_SIZE);
182         _media->added_time = (int)sqlite3_column_int(stmt, MEDIA_INFO_ADDED_TIME);
183         _media->modified_time = (int)sqlite3_column_int(stmt, MEDIA_INFO_MODIFIED_TIME);
184         _media->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_THUMBNAIL_PATH));
185         _media->description = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_DESCRIPTION));
186         _media->rating = (int)sqlite3_column_int(stmt, MEDIA_INFO_RATING);
187         _media->favourite = (int)sqlite3_column_int(stmt, MEDIA_INFO_FAVOURITE);
188         _media->is_drm = (int)sqlite3_column_int(stmt, MEDIA_INFO_IS_DRM);
189         _media->longitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_LONGITUDE);
190         _media->latitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_LATITUDE);
191         _media->altitude = (double)sqlite3_column_double(stmt, MEDIA_INFO_ALTITUDE);
192         _media->title = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TITLE));
193         _media->timeline = (double)sqlite3_column_double(stmt, MEDIA_INFO_TIMELINE);
194         _media->storage_uuid = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_STORAGE_UUID));
195         _media->is_360 = (int)sqlite3_column_int(stmt, MEDIA_INFO_IS_360);
196 #ifdef _USE_TVPD_MODE
197         _media->played_count = sqlite3_column_int(stmt, MEDIA_INFO_PLAYED_COUNT);
198         _media->played_time = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_TIME);
199         _media->played_position = sqlite3_column_int(stmt, MEDIA_INFO_LAST_PLAYED_POSITION);
200         _media->stitched_info = (int)sqlite3_column_int(stmt, MEDIA_INFO_STITCHED_INFO);
201 #endif
202
203         if (_media->media_type == MEDIA_CONTENT_TYPE_IMAGE) {
204                 _media->image_meta = g_new0(image_meta_s, 1);
205
206                 _media->image_meta->media_id = g_strdup(_media->media_id);
207                 _media->image_meta->width = sqlite3_column_int(stmt, MEDIA_INFO_WIDTH);
208                 _media->image_meta->height = sqlite3_column_int(stmt, MEDIA_INFO_HEIGHT);
209                 _media->image_meta->fnumber = (double)sqlite3_column_double(stmt, MEDIA_INFO_FNUMBER);
210                 _media->image_meta->iso = sqlite3_column_int(stmt, MEDIA_INFO_ISO);
211                 _media->image_meta->date_taken = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_DATETAKEN));
212                 _media->image_meta->orientation = sqlite3_column_int(stmt, MEDIA_INFO_ORIENTATION);
213                 _media->image_meta->exposure_time = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_EXPOSURE_TIME));
214                 _media->image_meta->model = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_MODEL));
215
216         } else if (_media->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
217                 _media->video_meta = g_new0(video_meta_s, 1);
218
219                 _media->video_meta->media_id = g_strdup(_media->media_id);
220                 _media->video_meta->width = sqlite3_column_int(stmt, MEDIA_INFO_WIDTH);
221                 _media->video_meta->height = sqlite3_column_int(stmt, MEDIA_INFO_HEIGHT);
222                 _media->video_meta->album = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM));
223                 _media->video_meta->artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ARTIST));
224                 _media->video_meta->album_artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM_ARTIST));
225                 _media->video_meta->genre = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_GENRE));
226                 _media->video_meta->composer = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COMPOSER));
227                 _media->video_meta->year = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_YEAR));
228                 _media->video_meta->recorded_date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_RECORDED_DATE));
229                 _media->video_meta->copyright = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COPYRIGHT));
230                 _media->video_meta->track_num = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TRACK_NUM));
231                 _media->video_meta->bitrate = sqlite3_column_int(stmt, MEDIA_INFO_BITRATE);
232                 _media->video_meta->duration = sqlite3_column_int(stmt, MEDIA_INFO_DURATION);
233                 _media->video_meta->rotation = sqlite3_column_int(stmt, MEDIA_INFO_ORIENTATION);
234
235         } else if ((_media->media_type == MEDIA_CONTENT_TYPE_MUSIC) || (_media->media_type == MEDIA_CONTENT_TYPE_SOUND)) {
236                 _media->audio_meta = g_new0(audio_meta_s, 1);
237
238                 _media->audio_meta->media_id = g_strdup(_media->media_id);
239                 _media->audio_meta->album = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM));
240                 _media->audio_meta->artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ARTIST));
241                 _media->audio_meta->album_artist = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ALBUM_ARTIST));
242                 _media->audio_meta->genre = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_GENRE));
243                 _media->audio_meta->composer = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COMPOSER));
244                 _media->audio_meta->year = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_YEAR));
245                 _media->audio_meta->recorded_date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_RECORDED_DATE));
246                 _media->audio_meta->copyright = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COPYRIGHT));
247                 _media->audio_meta->track_num = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_TRACK_NUM));
248                 _media->audio_meta->bitrate = sqlite3_column_int(stmt, MEDIA_INFO_BITRATE);
249                 _media->audio_meta->bitpersample = sqlite3_column_int(stmt, MEDIA_INFO_BITPERSAMPLE);
250                 _media->audio_meta->duration = sqlite3_column_int(stmt, MEDIA_INFO_DURATION);
251                 _media->audio_meta->samplerate = sqlite3_column_int(stmt, MEDIA_INFO_SAMPLERATE);
252                 _media->audio_meta->channel = sqlite3_column_int(stmt, MEDIA_INFO_CHANNEL);
253         } else if (_media->media_type == MEDIA_CONTENT_TYPE_BOOK) {
254                 _media->book_meta = g_new0(book_meta_s, 1);
255
256                 _media->book_meta->subject = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_GENRE));
257                 _media->book_meta->author = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_ARTIST));
258                 _media->book_meta->date = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_RECORDED_DATE));
259                 _media->book_meta->publisher = g_strdup((const char *)sqlite3_column_text(stmt, MEDIA_INFO_COPYRIGHT));
260         }
261 }
262 #ifdef _USE_TVPD_MODE
263 int _media_info_get_media_info_from_db(const char *path, const char *storage_id, media_info_h media)
264 {
265         int ret = MEDIA_CONTENT_ERROR_NONE;
266         sqlite3_stmt *stmt = NULL;
267         char *select_query = NULL;
268         media_info_s *_media = (media_info_s*)media;
269
270         content_retip_if_fail(media);
271
272         select_query = sqlite3_mprintf(SELECT_MEDIA_BY_PATH, storage_id, path);
273
274         ret = _content_get_result(select_query, &stmt);
275         SQLITE3_SAFE_FREE(select_query);
276         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
277
278         if (sqlite3_step(stmt) == SQLITE_ROW) {
279                 _media_info_item_get_detail(stmt, (media_info_h)_media);
280         } else {
281                 content_sec_error("No media : path[%s] storage id[%s]", path, storage_id);
282                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
283         }
284
285         SQLITE3_FINALIZE(stmt);
286
287         return ret;
288 }
289 #else
290 int _media_info_get_media_info_from_db(const char *path, media_info_h media)
291 {
292         int ret = MEDIA_CONTENT_ERROR_NONE;
293         sqlite3_stmt *stmt = NULL;
294         char *select_query = NULL;
295         media_info_s *_media = (media_info_s*)media;
296
297         content_retip_if_fail(path);
298         content_retip_if_fail(media);
299
300         select_query = sqlite3_mprintf(SELECT_MEDIA_BY_PATH, path);
301
302         ret = _content_get_result(select_query, &stmt);
303         SQLITE3_SAFE_FREE(select_query);
304         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
305
306         if (sqlite3_step(stmt) == SQLITE_ROW) {
307                 _media_info_item_get_detail(stmt, (media_info_h)_media);
308         } else {
309                 content_sec_error("No media : path[%s]", path);
310                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
311         }
312
313         SQLITE3_FINALIZE(stmt);
314
315         return ret;
316 }
317 #endif
318
319 int media_info_insert_to_db(const char *path, media_info_h *info)
320 {
321         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
322         int ret = MEDIA_CONTENT_ERROR_NONE;
323         int modified_time = 0;
324
325         content_retip_if_fail(STRING_VALID(path));
326         content_retip_if_fail(info);
327
328         content_sec_debug("path [%s]", path);
329
330         ret = __media_info_check_file_validity(path);
331         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
332
333         ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id, _content_get_uid());
334         if (ret != MS_MEDIA_ERR_NONE) {
335                 content_error("media_svc_get_storage_id failed : %d", ret);
336                 return _content_error_capi(ret);
337         }
338
339         /* Get modified time for check exists */
340         ret = media_svc_get_modified_time(_content_get_db_handle(), storage_id, path, &modified_time);
341         if (ret == MS_MEDIA_ERR_NONE) {
342                 /* Refresh if need */
343                 if (modified_time != _media_util_get_file_time(path)) {
344                         ret = media_svc_refresh_item(_content_get_db_handle(), false, storage_id, path, _content_get_uid());
345                         if (ret != MS_MEDIA_ERR_NONE) {
346                                 content_error("media_svc_refresh_item failed : %d", ret);
347                                 return _content_error_capi(ret);
348                         }
349                 }
350         } else if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
351                 content_retvm_if(!_media_util_check_support_media_type(path), MEDIA_CONTENT_ERROR_NOT_SUPPORTED, "Unsupported media type");
352
353                 ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_id, path, _content_get_uid());
354                 if (ret != MS_MEDIA_ERR_NONE) {
355                         if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
356                                 content_info("This item is already inserted. This may be normal operation because other process already did this");
357                                 ret = MEDIA_CONTENT_ERROR_NONE;
358                         } else {
359                                 content_error("media_svc_insert_item_immediately failed : %d", ret);
360                         }
361
362                         return _content_error_capi(ret);
363                 }
364         } else {
365                 content_error("media_svc_get_modified_time failed : %d", ret);
366                 return _content_error_capi(ret);
367         }
368
369         media_info_s *_media = g_new0(media_info_s, 1);
370
371 #ifdef _USE_TVPD_MODE
372         if (STRING_VALID(storage_id))
373                 ret = _media_info_get_media_info_from_db(path, storage_id, (media_info_h)_media);
374         else
375                 ret = _media_info_get_media_info_from_db(path, DB_TABLE_MEDIA, (media_info_h)_media);
376
377         *info = (media_info_h)_media;
378 #else
379         ret = _media_info_get_media_info_from_db(path, (media_info_h)_media);
380
381         *info = (media_info_h)_media;
382 #endif
383         return ret;
384 }
385
386 int media_info_insert_batch_to_db(const char **path_array, unsigned int array_length, media_insert_completed_cb completed_cb, void *user_data)
387 {
388         content_retip_if_fail(path_array);
389         content_retip_if_fail(array_length > 0);
390         content_retip_if_fail(completed_cb);
391
392         return __media_info_insert_batch(path_array, array_length, completed_cb, user_data);
393 }
394
395 #ifdef _USE_TVPD_MODE
396 int media_info_get_media_info_by_path_from_db(const char* path, media_info_h* media)
397 {
398         int ret = MEDIA_CONTENT_ERROR_NONE;
399         char storage_id[MEDIA_CONTENT_UUID_SIZE+1] = {0, };
400
401         content_retip_if_fail(STRING_VALID(path));
402         content_retip_if_fail(media);
403
404         ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id, tzplatform_getuid(TZ_USER_NAME));
405         if (ret != MS_MEDIA_ERR_NONE) {
406                 content_error("media_svc_get_storage_id failed : %d", ret);
407                 return _content_error_capi(ret);
408         }
409
410         media_info_s *_media = g_new0(media_info_s, 1);
411
412         ret =  _media_info_get_media_info_from_db(path, storage_id, (media_info_h)_media);
413         *media = (media_info_h)_media;
414
415         return ret;
416 }
417
418 static int __media_info_get_media_path_by_id_from_db(const char *media_id, char **path)
419 {
420         int ret = MEDIA_CONTENT_ERROR_NONE;
421         sqlite3_stmt *stmt = NULL;
422         char *select_query = NULL;
423
424         content_retip_if_fail(STRING_VALID(media_id));
425
426         select_query = sqlite3_mprintf(SELECT_MEDIA_PATH_BY_ID, media_id);
427
428         ret = _content_get_result(select_query, &stmt);
429         SQLITE3_SAFE_FREE(select_query);
430         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
431
432         if (sqlite3_step(stmt) == SQLITE_ROW) {
433                 *path = g_strdup((const char *)sqlite3_column_text(stmt, 0));
434         } else {
435                 content_error("There's no media with this ID : %s", media_id);
436                 *path = NULL;
437                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
438         }
439
440         SQLITE3_FINALIZE(stmt);
441
442         return ret;
443 }
444
445 int media_info_delete_from_db(const char *media_id)
446 {
447         int ret = MEDIA_CONTENT_ERROR_NONE;
448         char *path = NULL;
449         char *storage_id = NULL;
450
451         content_retip_if_fail(STRING_VALID(media_id));
452
453         ret = __media_info_get_media_path_by_id_from_db(media_id, &path);
454         if (ret != MEDIA_CONTENT_ERROR_NONE) {
455                 content_error("__media_info_get_media_path_by_id_from_db failed : %d", ret);
456                 g_free(path);
457                 return ret;
458         }
459
460         ret = _media_db_get_storage_id_by_media_id(media_id, &storage_id);
461         if (ret != MEDIA_CONTENT_ERROR_NONE) {
462                 content_error("_media_db_get_storage_id_by_media_id failed : %d", ret);
463                 g_free(path);
464                 return ret;
465         }
466
467         ret = media_svc_delete_item_by_path(_content_get_db_handle(), storage_id, path, _content_get_uid());
468         g_free(path);
469         g_free(storage_id);
470
471         return _content_error_capi(ret);
472 }
473 #endif
474
475 int media_info_destroy(media_info_h media)
476 {
477         media_info_s *_media = (media_info_s*)media;
478
479         content_retip_if_fail(media);
480
481         g_free(_media->media_id);
482         g_free(_media->file_path);
483         g_free(_media->display_name);
484         g_free(_media->mime_type);
485         g_free(_media->thumbnail_path);
486         g_free(_media->description);
487         g_free(_media->title);
488         g_free(_media->storage_uuid);
489
490         if (_media->image_meta) {
491                 g_free(_media->image_meta->media_id);
492                 g_free(_media->image_meta->date_taken);
493                 g_free(_media->image_meta->exposure_time);
494                 g_free(_media->image_meta->model);
495
496                 g_free(_media->image_meta);
497         }
498
499         if (_media->video_meta) {
500                 g_free(_media->video_meta->media_id);
501                 g_free(_media->video_meta->album);
502                 g_free(_media->video_meta->artist);
503                 g_free(_media->video_meta->album_artist);
504                 g_free(_media->video_meta->genre);
505                 g_free(_media->video_meta->composer);
506                 g_free(_media->video_meta->year);
507                 g_free(_media->video_meta->recorded_date);
508                 g_free(_media->video_meta->copyright);
509                 g_free(_media->video_meta->track_num);
510
511                 g_free(_media->video_meta);
512         }
513
514         if (_media->audio_meta) {
515                 g_free(_media->audio_meta->media_id);
516                 g_free(_media->audio_meta->album);
517                 g_free(_media->audio_meta->artist);
518                 g_free(_media->audio_meta->album_artist);
519                 g_free(_media->audio_meta->genre);
520                 g_free(_media->audio_meta->composer);
521                 g_free(_media->audio_meta->year);
522                 g_free(_media->audio_meta->recorded_date);
523                 g_free(_media->audio_meta->copyright);
524                 g_free(_media->audio_meta->track_num);
525
526                 g_free(_media->audio_meta);
527         }
528
529         if (_media->book_meta) {
530                 g_free(_media->book_meta->media_id);
531                 g_free(_media->book_meta->author);
532                 g_free(_media->book_meta->date);
533                 g_free(_media->book_meta->publisher);
534                 g_free(_media->book_meta->subject);
535
536                 g_free(_media->book_meta);
537         }
538
539         g_free(_media);
540
541         return MEDIA_CONTENT_ERROR_NONE;
542 }
543
544 int media_info_clone(media_info_h *dst, media_info_h src)
545 {
546         media_info_s *_src = (media_info_s*)src;
547
548         content_retip_if_fail(dst);
549         content_retip_if_fail(src);
550
551         media_info_s *_dst = g_new0(media_info_s, 1);
552
553         _dst->media_id = g_strdup(_src->media_id);
554         _dst->file_path = g_strdup(_src->file_path);
555         _dst->display_name = g_strdup(_src->display_name);
556         _dst->mime_type = g_strdup(_src->mime_type);
557         _dst->thumbnail_path = g_strdup(_src->thumbnail_path);
558         _dst->description = g_strdup(_src->description);
559         _dst->title = g_strdup(_src->title);
560         _dst->storage_uuid = g_strdup(_src->storage_uuid);
561         _dst->media_type = _src->media_type;
562         _dst->size = _src->size;
563         _dst->added_time = _src->added_time;
564         _dst->modified_time = _src->modified_time;
565         _dst->timeline = _src->timeline;
566         _dst->longitude = _src->longitude;
567         _dst->latitude = _src->latitude;
568         _dst->altitude = _src->altitude;
569         _dst->rating = _src->rating;
570         _dst->favourite = _src->favourite;
571         _dst->is_drm = _src->is_drm;
572         _dst->face_request_id = _src->face_request_id;
573         _dst->is_360 = _src->is_360;
574 #ifdef _USE_TVPD_MODE
575         _dst->played_count = _src->played_count;
576         _dst->played_time = _src->played_time;
577         _dst->played_position = _src->played_position;
578         _dst->stitched_info = _src->stitched_info;
579         _dst->extract_flag = _src->extract_flag;
580 #endif
581
582         if (_src->media_type == MEDIA_CONTENT_TYPE_IMAGE && _src->image_meta) {
583                 _dst->image_meta = g_new0(image_meta_s, 1);
584
585                 _dst->image_meta->media_id = g_strdup(_src->image_meta->media_id);
586                 _dst->image_meta->date_taken = g_strdup(_src->image_meta->date_taken);
587                 _dst->image_meta->exposure_time = g_strdup(_src->image_meta->exposure_time);
588                 _dst->image_meta->model = g_strdup(_src->image_meta->model);
589                 _dst->image_meta->fnumber = _src->image_meta->fnumber;
590                 _dst->image_meta->iso = _src->image_meta->iso;
591                 _dst->image_meta->width = _src->image_meta->width;
592                 _dst->image_meta->height = _src->image_meta->height;
593                 _dst->image_meta->orientation = _src->image_meta->orientation;
594
595         } else if (_src->media_type == MEDIA_CONTENT_TYPE_VIDEO && _src->video_meta) {
596                 _dst->video_meta = g_new0(video_meta_s, 1);
597
598                 _dst->video_meta->media_id = g_strdup(_src->video_meta->media_id);
599                 _dst->video_meta->album = g_strdup(_src->video_meta->album);
600                 _dst->video_meta->artist = g_strdup(_src->video_meta->artist);
601                 _dst->video_meta->album_artist = g_strdup(_src->video_meta->album_artist);
602                 _dst->video_meta->genre = g_strdup(_src->video_meta->genre);
603                 _dst->video_meta->composer = g_strdup(_src->video_meta->composer);
604                 _dst->video_meta->year = g_strdup(_src->video_meta->year);
605                 _dst->video_meta->recorded_date = g_strdup(_src->video_meta->recorded_date);
606                 _dst->video_meta->copyright = g_strdup(_src->video_meta->copyright);
607                 _dst->video_meta->track_num = g_strdup(_src->video_meta->track_num);
608                 _dst->video_meta->width = _src->video_meta->width;
609                 _dst->video_meta->height = _src->video_meta->height;
610                 _dst->video_meta->duration = _src->video_meta->duration;
611                 _dst->video_meta->bitrate = _src->video_meta->bitrate;
612                 _dst->video_meta->rotation = _src->video_meta->rotation;
613
614         } else if ((_src->media_type == MEDIA_CONTENT_TYPE_MUSIC || _src->media_type == MEDIA_CONTENT_TYPE_SOUND) && _src->audio_meta) {
615                 _dst->audio_meta = g_new0(audio_meta_s, 1);
616
617                 _dst->audio_meta->media_id = g_strdup(_src->audio_meta->media_id);
618                 _dst->audio_meta->album = g_strdup(_src->audio_meta->album);
619                 _dst->audio_meta->artist = g_strdup(_src->audio_meta->artist);
620                 _dst->audio_meta->album_artist = g_strdup(_src->audio_meta->album_artist);
621                 _dst->audio_meta->genre = g_strdup(_src->audio_meta->genre);
622                 _dst->audio_meta->composer = g_strdup(_src->audio_meta->composer);
623                 _dst->audio_meta->year = g_strdup(_src->audio_meta->year);
624                 _dst->audio_meta->recorded_date = g_strdup(_src->audio_meta->recorded_date);
625                 _dst->audio_meta->copyright = g_strdup(_src->audio_meta->copyright);
626                 _dst->audio_meta->track_num = g_strdup(_src->audio_meta->track_num);
627                 _dst->audio_meta->channel = _src->audio_meta->channel;
628                 _dst->audio_meta->samplerate = _src->audio_meta->samplerate;
629                 _dst->audio_meta->duration = _src->audio_meta->duration;
630                 _dst->audio_meta->bitrate = _src->audio_meta->bitrate;
631                 _dst->audio_meta->bitpersample = _src->audio_meta->bitpersample;
632         } else if (_src->media_type == MEDIA_CONTENT_TYPE_BOOK && _src->book_meta) {
633                 _dst->book_meta = g_new0(book_meta_s, 1);
634
635                 _dst->book_meta->media_id = g_strdup(_src->book_meta->media_id);
636                 _dst->book_meta->author = g_strdup(_src->book_meta->author);
637                 _dst->book_meta->date = g_strdup(_src->book_meta->date);
638                 _dst->book_meta->publisher = g_strdup(_src->book_meta->publisher);
639                 _dst->book_meta->subject = g_strdup(_src->book_meta->subject);
640         }
641
642         *dst = (media_info_h)_dst;
643
644         return MEDIA_CONTENT_ERROR_NONE;
645 }
646
647 int media_info_get_media_count_from_db(filter_h filter, int *media_count)
648 {
649         content_retip_if_fail(media_count);
650
651         return _media_db_get_group_item_count(NULL, filter, MEDIA_GROUP_NONE, media_count);
652 }
653
654 int media_info_foreach_media_from_db(filter_h filter, media_info_cb callback, void *user_data)
655 {
656         content_retip_if_fail(callback);
657
658         return _media_db_get_group_item(NULL, filter, callback, user_data, MEDIA_GROUP_NONE);
659 }
660 // LCOV_EXCL_START
661 int media_info_get_tag_count_from_db(const char *media_id, filter_h filter, int *tag_count)
662 {
663         content_warn("DEPRECATION WARNING: media_info_get_tag_count_from_db() is deprecated and will be removed from next release.");
664         content_retip_if_fail(STRING_VALID(media_id));
665         content_retip_if_fail(tag_count);
666
667         return _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_TAG_BY_MEDIA_ID, tag_count);
668 }
669
670 int media_info_foreach_tag_from_db(const char *media_id, filter_h filter, media_tag_cb callback, void *user_data)
671 {
672         content_warn("DEPRECATION WARNING: media_info_foreach_tag_from_db() is deprecated and will be removed from next release.");
673         content_retip_if_fail(STRING_VALID(media_id));
674         content_retip_if_fail(callback);
675
676         return _media_db_get_tag(media_id, filter, callback, user_data);
677 }
678
679 int media_info_get_bookmark_count_from_db(const char *media_id, filter_h filter, int *bookmark_count)
680 {
681         content_warn("DEPRECATION WARNING: media_info_get_bookmark_count_from_db() is deprecated and will be removed from next release.");
682         content_retip_if_fail(STRING_VALID(media_id));
683         content_retip_if_fail(bookmark_count);
684
685         return _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_BOOKMARK_BY_MEDIA_ID, bookmark_count);
686 }
687
688 int media_info_foreach_bookmark_from_db(const char *media_id, filter_h filter, media_bookmark_cb callback, void *user_data)
689 {
690         content_warn("DEPRECATION WARNING: media_info_foreach_bookmark_from_db() is deprecated and will be removed from next release.");
691         content_retip_if_fail(STRING_VALID(media_id));
692         content_retip_if_fail(callback);
693
694         return _media_db_get_bookmark(media_id, filter, callback, user_data);
695 }
696
697 int media_info_get_face_count_from_db(const char *media_id, filter_h filter, int *face_count)
698 {
699         content_warn("DEPRECATION WARNING: media_info_get_face_count_from_db() is deprecated and will be removed from next release.");
700         content_retip_if_fail(STRING_VALID(media_id));
701         content_retip_if_fail(face_count);
702
703         return _media_db_get_group_item_count(media_id, filter, MEDIA_GROUP_FACE_BY_MEDIA_ID, face_count);
704 }
705
706 int media_info_foreach_face_from_db(const char *media_id, filter_h filter, media_face_cb callback, void *user_data)
707 {
708         content_warn("DEPRECATION WARNING: media_info_foreach_face_from_db() is deprecated and will be removed from next release.");
709         content_retip_if_fail(STRING_VALID(media_id));
710         content_retip_if_fail(callback);
711
712         return _media_db_get_face(media_id, filter, callback, user_data);
713 }
714 // LCOV_EXCL_STOP
715 int media_info_get_image(media_info_h media, image_meta_h *image)
716 {
717         int ret = MEDIA_CONTENT_ERROR_NONE;
718
719         media_info_s *_media = (media_info_s*)media;
720
721         content_retip_if_fail(media);
722         content_retip_if_fail(_media->media_type == MEDIA_CONTENT_TYPE_IMAGE);
723         content_retip_if_fail(_media->image_meta);
724         content_retip_if_fail(image);
725
726         image_meta_s *_image = g_new0(image_meta_s, 1);
727
728         _image->media_id = g_strdup(_media->media_id);
729         _image->width = _media->image_meta->width;
730         _image->height = _media->image_meta->height;
731         _image->orientation = _media->image_meta->orientation;
732         _image->fnumber = _media->image_meta->fnumber;
733         _image->iso = _media->image_meta->iso;
734         _image->date_taken = g_strdup(_media->image_meta->date_taken);
735         _image->exposure_time = g_strdup(_media->image_meta->exposure_time);
736         _image->model = g_strdup(_media->image_meta->model);
737
738         *image = (image_meta_h)_image;
739
740         return ret;
741 }
742 // LCOV_EXCL_START
743 int media_info_get_video(media_info_h media, video_meta_h *video)
744 {
745         content_warn("DEPRECATION WARNING: media_info_get_video() is deprecated and will be removed from next release.");
746         int ret = MEDIA_CONTENT_ERROR_NONE;
747
748         media_info_s *_media = (media_info_s*)media;
749
750         content_retip_if_fail(media);
751         content_retip_if_fail(_media->media_type == MEDIA_CONTENT_TYPE_VIDEO);
752         content_retip_if_fail(_media->video_meta);
753         content_retip_if_fail(video);
754
755         video_meta_s *_video = g_new0(video_meta_s, 1);
756
757         _video->media_id = g_strdup(_media->media_id);
758         _video->album = g_strdup(_media->video_meta->album);
759         _video->artist = g_strdup(_media->video_meta->artist);
760         _video->album_artist = g_strdup(_media->video_meta->album_artist);
761         _video->genre = g_strdup(_media->video_meta->genre);
762         _video->composer = g_strdup(_media->video_meta->composer);
763         _video->year = g_strdup(_media->video_meta->year);
764         _video->recorded_date = g_strdup(_media->video_meta->recorded_date);
765         _video->copyright = g_strdup(_media->video_meta->copyright);
766         _video->track_num = g_strdup(_media->video_meta->track_num);
767
768         _video->width = _media->video_meta->width;
769         _video->height = _media->video_meta->height;
770         _video->duration = _media->video_meta->duration;
771         _video->bitrate = _media->video_meta->bitrate;
772         _video->rotation = _media->video_meta->rotation;
773
774         *video = (video_meta_h)_video;
775
776         return ret;
777 }
778 // LCOV_EXCL_STOP
779 int media_info_get_audio(media_info_h media, audio_meta_h *audio)
780 {
781         int ret = MEDIA_CONTENT_ERROR_NONE;
782
783         media_info_s *_media = (media_info_s*)media;
784
785         content_retip_if_fail(media);
786         content_retip_if_fail(_media->media_type == MEDIA_CONTENT_TYPE_MUSIC);
787         content_retip_if_fail(_media->audio_meta);
788         content_retip_if_fail(audio);
789
790         audio_meta_s *_audio = g_new0(audio_meta_s, 1);
791
792         _audio->media_id = g_strdup(_media->media_id);
793         _audio->album = g_strdup(_media->audio_meta->album);
794         _audio->artist = g_strdup(_media->audio_meta->artist);
795         _audio->album_artist = g_strdup(_media->audio_meta->album_artist);
796         _audio->genre = g_strdup(_media->audio_meta->genre);
797         _audio->composer = g_strdup(_media->audio_meta->composer);
798         _audio->year = g_strdup(_media->audio_meta->year);
799         _audio->recorded_date = g_strdup(_media->audio_meta->recorded_date);
800         _audio->copyright = g_strdup(_media->audio_meta->copyright);
801         _audio->track_num = g_strdup(_media->audio_meta->track_num);
802
803         _audio->duration = _media->audio_meta->duration;
804         _audio->bitrate = _media->audio_meta->bitrate;
805         _audio->bitpersample = _media->audio_meta->bitpersample;
806         _audio->samplerate = _media->audio_meta->samplerate;
807         _audio->channel = _media->audio_meta->channel;
808
809         *audio = (audio_meta_h)_audio;
810
811         return ret;
812 }
813
814 int media_info_get_book(media_info_h media, book_meta_h *book)
815 {
816         int ret = MEDIA_CONTENT_ERROR_NONE;
817
818         media_info_s *_media = (media_info_s*)media;
819
820         content_retip_if_fail(media);
821         content_retip_if_fail(_media->media_type == MEDIA_CONTENT_TYPE_BOOK);
822         content_retip_if_fail(book);
823
824         book_meta_s *_book = g_new0(book_meta_s, 1);
825
826         _book->media_id = g_strdup(_media->media_id);
827         _book->author = g_strdup(_media->book_meta->author);
828         _book->publisher = g_strdup(_media->book_meta->publisher);
829         _book->date = g_strdup(_media->book_meta->date);
830         _book->subject = g_strdup(_media->book_meta->subject);
831
832         *book = (book_meta_h)_book;
833
834         return ret;
835 }
836
837 int media_info_get_media_id(media_info_h media, char **media_id)
838 {
839         media_info_s *_media = (media_info_s*)media;
840
841         content_retip_if_fail(media);
842         content_retip_if_fail(media_id);
843
844         *media_id = g_strdup(_media->media_id);
845
846         return MEDIA_CONTENT_ERROR_NONE;
847 }
848
849 int media_info_get_file_path(media_info_h media, char **path)
850 {
851         media_info_s *_media = (media_info_s*)media;
852
853         content_retip_if_fail(media);
854         content_retip_if_fail(path);
855
856         *path = g_strdup(_media->file_path);
857
858         return MEDIA_CONTENT_ERROR_NONE;
859 }
860
861 int media_info_get_display_name(media_info_h media, char **name)
862 {
863         media_info_s *_media = (media_info_s*)media;
864
865         content_retip_if_fail(media);
866         content_retip_if_fail(name);
867
868         *name = g_strdup(_media->display_name);
869
870         return MEDIA_CONTENT_ERROR_NONE;
871 }
872
873 int media_info_get_media_type(media_info_h media, media_content_type_e *type)
874 {
875         media_info_s *_media = (media_info_s*)media;
876
877         content_retip_if_fail(media);
878         content_retip_if_fail(type);
879
880         *type = _media->media_type;
881
882         return MEDIA_CONTENT_ERROR_NONE;
883 }
884
885 int media_info_get_mime_type(media_info_h media, char **mime_type)
886 {
887         media_info_s *_media = (media_info_s*)media;
888
889         content_retip_if_fail(media);
890         content_retip_if_fail(mime_type);
891
892         *mime_type = g_strdup(_media->mime_type);
893
894         return MEDIA_CONTENT_ERROR_NONE;
895 }
896
897 int media_info_get_size(media_info_h media, unsigned long long *size)
898 {
899         media_info_s *_media = (media_info_s*)media;
900
901         content_retip_if_fail(media);
902         content_retip_if_fail(size);
903
904         *size = _media->size;
905
906         return MEDIA_CONTENT_ERROR_NONE;
907 }
908
909 int media_info_get_added_time(media_info_h media, time_t *added_time)
910 {
911         media_info_s *_media = (media_info_s*)media;
912
913         content_retip_if_fail(media);
914         content_retip_if_fail(added_time);
915
916         *added_time = _media->added_time;
917
918         return MEDIA_CONTENT_ERROR_NONE;
919 }
920
921 int media_info_get_modified_time(media_info_h media, time_t* time)
922 {
923         media_info_s *_media = (media_info_s*)media;
924
925         content_retip_if_fail(media);
926         content_retip_if_fail(time);
927
928         *time = _media->modified_time;
929
930         return MEDIA_CONTENT_ERROR_NONE;
931 }
932 // LCOV_EXCL_START
933 int media_info_get_timeline(media_info_h media, time_t* time)
934 {
935         content_warn("DEPRECATION WARNING: media_info_get_timeline() is deprecated and will be removed from next release.");
936         media_info_s *_media = (media_info_s*)media;
937
938         content_retip_if_fail(media);
939         content_retip_if_fail(time);
940
941         *time = _media->timeline;
942
943         return MEDIA_CONTENT_ERROR_NONE;
944 }
945 // LCOV_EXCL_STOP
946 int media_info_get_thumbnail_path(media_info_h media, char **path)
947 {
948         media_info_s *_media = (media_info_s*)media;
949
950         content_retip_if_fail(media);
951         content_retip_if_fail(path);
952
953         *path = g_strdup(_media->thumbnail_path);
954
955         return MEDIA_CONTENT_ERROR_NONE;
956 }
957
958 int media_info_get_title(media_info_h media, char **title)
959 {
960         media_info_s *_media = (media_info_s*)media;
961
962         content_retip_if_fail(media);
963         content_retip_if_fail(title);
964
965         *title = g_strdup(_media->title);
966
967         return MEDIA_CONTENT_ERROR_NONE;
968 }
969 // LCOV_EXCL_START
970 int media_info_get_description(media_info_h media, char **description)
971 {
972         content_warn("DEPRECATION WARNING: media_info_get_description() is deprecated and will be removed from next release.");
973         media_info_s *_media = (media_info_s*)media;
974
975         content_retip_if_fail(media);
976         content_retip_if_fail(description);
977
978         *description = g_strdup(_media->description);
979
980         return MEDIA_CONTENT_ERROR_NONE;
981 }
982
983 int media_info_get_longitude(media_info_h media, double* longitude)
984 {
985         content_warn("DEPRECATION WARNING: media_info_get_longitude() is deprecated and will be removed from next release.");
986         media_info_s *_media = (media_info_s*)media;
987
988         content_retip_if_fail(media);
989         content_retip_if_fail(longitude);
990
991         *longitude = _media->longitude;
992
993         return MEDIA_CONTENT_ERROR_NONE;
994 }
995 int media_info_get_latitude(media_info_h media, double* latitude)
996 {
997         content_warn("DEPRECATION WARNING: media_info_get_latitude() is deprecated and will be removed from next release.");
998         media_info_s *_media = (media_info_s*)media;
999
1000         content_retip_if_fail(media);
1001         content_retip_if_fail(latitude);
1002
1003         *latitude = _media->latitude;
1004
1005         return MEDIA_CONTENT_ERROR_NONE;
1006 }
1007
1008 int media_info_get_altitude(media_info_h media, double *altitude)
1009 {
1010         content_warn("DEPRECATION WARNING: media_info_get_altitude() is deprecated and will be removed from next release.");
1011         media_info_s *_media = (media_info_s*)media;
1012
1013         content_retip_if_fail(media);
1014         content_retip_if_fail(altitude);
1015
1016         *altitude = _media->altitude;
1017
1018         return MEDIA_CONTENT_ERROR_NONE;
1019 }
1020
1021 int media_info_get_rating(media_info_h media, int *rating)
1022 {
1023         content_warn("DEPRECATION WARNING: media_info_get_rating() is deprecated and will be removed from next release.");
1024         media_info_s *_media = (media_info_s*)media;
1025
1026         content_retip_if_fail(media);
1027         content_retip_if_fail(rating);
1028
1029         *rating = _media->rating;
1030
1031         return MEDIA_CONTENT_ERROR_NONE;
1032 }
1033
1034 int media_info_get_favorite(media_info_h media, bool* favorite)
1035 {
1036         content_warn("DEPRECATION WARNING: media_info_get_favorite() is deprecated and will be removed from next release.");
1037         media_info_s *_media = (media_info_s*)media;
1038
1039         content_retip_if_fail(media);
1040         content_retip_if_fail(favorite);
1041
1042         *favorite = _media->favourite;
1043
1044         return MEDIA_CONTENT_ERROR_NONE;
1045 }
1046
1047 int media_info_is_drm(media_info_h media, bool *is_drm)
1048 {
1049         content_warn("DEPRECATION WARNING: media_info_is_drm() is deprecated and will be removed from next release.");
1050         media_info_s *_media = (media_info_s*)media;
1051
1052         content_retip_if_fail(media);
1053         content_retip_if_fail(is_drm);
1054
1055         *is_drm = _media->is_drm;
1056
1057         return MEDIA_CONTENT_ERROR_NONE;
1058 }
1059
1060 int media_info_is_360_content(media_info_h media, bool *is_360)
1061 {
1062         content_warn("DEPRECATION WARNING: media_info_is_360_content() is deprecated and will be removed from next release.");
1063         media_info_s *_media = (media_info_s*)media;
1064
1065         content_retip_if_fail(media);
1066         content_retip_if_fail(is_360);
1067
1068         *is_360 = _media->is_360;
1069
1070         return MEDIA_CONTENT_ERROR_NONE;
1071 }
1072 // LCOV_EXCL_STOP
1073 #ifdef _USE_TVPD_MODE
1074 int media_info_get_played_count(media_info_h media, int *played_count)
1075 {
1076         media_info_s *_media = (media_info_s*)media;
1077
1078         content_retip_if_fail(media);
1079         content_retip_if_fail(played_count);
1080
1081         *played_count = _media->played_count;
1082
1083         return MEDIA_CONTENT_ERROR_NONE;
1084 }
1085
1086 int media_info_set_played_count(media_info_h media, int played_count)
1087 {
1088         media_info_s *_media = (media_info_s*)media;
1089
1090         content_retip_if_fail(media);
1091
1092         _media->played_count = played_count;
1093
1094         return MEDIA_CONTENT_ERROR_NONE;
1095 }
1096
1097 int media_info_set_played_position(media_info_h media, int played_position)
1098 {
1099         media_info_s *_media = (media_info_s*)media;
1100
1101         content_retip_if_fail(media);
1102         content_retip_if_fail(played_position >= 0);
1103
1104         _media->played_position = played_position;
1105
1106         return MEDIA_CONTENT_ERROR_NONE;
1107 }
1108
1109 int media_info_get_played_position(media_info_h media, int *played_position)
1110 {
1111         media_info_s *_media = (media_info_s*)media;
1112
1113         content_retip_if_fail(media);
1114         content_retip_if_fail(played_position);
1115
1116         *played_position = _media->played_position;
1117
1118         return MEDIA_CONTENT_ERROR_NONE;
1119 }
1120
1121 int media_info_set_played_time(media_info_h media)
1122 {
1123         time_t current_time;
1124
1125         media_info_s *_media = (media_info_s*)media;
1126
1127         content_retip_if_fail(media);
1128
1129         time(&current_time);
1130         _media->played_time = current_time;
1131
1132         return MEDIA_CONTENT_ERROR_NONE;
1133 }
1134
1135 int media_info_get_played_time(media_info_h media, time_t* played_time)
1136 {
1137         media_info_s *_media = (media_info_s*)media;
1138
1139         content_retip_if_fail(media);
1140         content_retip_if_fail(played_time);
1141
1142         *played_time = _media->played_time;
1143
1144         return MEDIA_CONTENT_ERROR_NONE;
1145 }
1146
1147 int media_info_get_extract_flag(media_info_h media, int *extract_flag)
1148 {
1149         media_info_s *_media = (media_info_s *)media;
1150
1151         content_retip_if_fail(media);
1152         content_retip_if_fail(extract_flag);
1153
1154         *extract_flag = _media->extract_flag;
1155
1156         return MEDIA_CONTENT_ERROR_NONE;
1157 }
1158
1159 int media_info_get_stitched_state(media_info_h media, int *stitched_info)
1160 {
1161         media_info_s *_media = (media_info_s*)media;
1162
1163         content_retip_if_fail(media);
1164         content_retip_if_fail(stitched_info);
1165
1166         *stitched_info = (_media->stitched_info & 0xFFFF0000) >> 16;
1167
1168         return MEDIA_CONTENT_ERROR_NONE;
1169 }
1170 #endif
1171
1172 int media_info_get_media_from_db(const char *media_id, media_info_h *media)
1173 {
1174         int ret = MEDIA_CONTENT_ERROR_NONE;
1175         char select_query[DEFAULT_QUERY_SIZE] = {0, };
1176         sqlite3_stmt *stmt = NULL;
1177
1178         content_retip_if_fail(STRING_VALID(media_id));
1179         content_retip_if_fail(media);
1180
1181 #ifdef _USE_TVPD_MODE
1182         char *storage_id = NULL;
1183
1184         ret = _media_db_get_storage_id_by_media_id(media_id, &storage_id);
1185         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1186         snprintf(select_query, DEFAULT_QUERY_SIZE, SELECT_MEDIA_FROM_MEDIA, storage_id, media_id);
1187         g_free(storage_id);
1188 #else
1189         snprintf(select_query, DEFAULT_QUERY_SIZE, SELECT_MEDIA_FROM_MEDIA, media_id);
1190 #endif
1191         ret = _content_get_result(select_query, &stmt);
1192         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1193
1194         media_info_s *_media = NULL;
1195
1196         if (sqlite3_step(stmt) == SQLITE_ROW) {
1197                 _media = g_new0(media_info_s, 1);
1198
1199                 _media_info_item_get_detail(stmt, (media_info_h)_media);
1200
1201                 *media = (media_info_h)_media;
1202         } else {
1203                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1204         }
1205
1206         SQLITE3_FINALIZE(stmt);
1207
1208         return ret;
1209 }
1210
1211 int media_info_get_media_from_db_by_path(const char *path, media_info_h *media)
1212 {
1213         int ret = MEDIA_CONTENT_ERROR_NONE;
1214         media_info_s *_media = NULL;
1215
1216         content_retip_if_fail(STRING_VALID(path));
1217         content_retip_if_fail(media);
1218         ret = _media_util_check_file_exist(path);
1219         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "_media_util_check_file_exist failed : %d", ret);
1220
1221 #ifdef _USE_TVPD_MODE
1222         char storage_id[MEDIA_CONTENT_UUID_SIZE + 1] = {0, };
1223
1224         ret = media_svc_get_storage_id(_content_get_db_handle(), path, storage_id, _content_get_uid());
1225         if (ret != MS_MEDIA_ERR_NONE) {
1226                 content_error("media_svc_get_storage_id failed : %d", ret);
1227                 return _content_error_capi(ret);
1228         }
1229 #endif
1230
1231         _media = g_new0(media_info_s, 1);
1232
1233 #ifdef _USE_TVPD_MODE
1234         ret = _media_info_get_media_info_from_db(path, STRING_VALID(storage_id) ? storage_id : DB_TABLE_MEDIA, (media_info_h)_media);
1235 #else
1236         ret = _media_info_get_media_info_from_db(path, (media_info_h)_media);
1237 #endif
1238         if (ret != MEDIA_CONTENT_ERROR_NONE) {
1239                 g_free(_media);
1240                 _media = NULL;
1241         }
1242
1243         *media = (media_info_h)_media;
1244
1245         return ret;
1246 }
1247 // LCOV_EXCL_START
1248 int media_info_set_favorite(media_info_h media, bool favorite)
1249 {
1250         content_warn("DEPRECATION WARNING: media_info_set_favorite() is deprecated and will be removed from next release.");
1251         media_info_s *_media = (media_info_s*)media;
1252
1253         content_retip_if_fail(media);
1254
1255         if (favorite == TRUE)
1256                 time(&_media->favourite);
1257         else
1258                 _media->favourite = 0;
1259
1260         return MEDIA_CONTENT_ERROR_NONE;
1261 }
1262
1263 int media_info_update_to_db(media_info_h media)
1264 {
1265         content_warn("DEPRECATION WARNING: media_info_update_to_db() is deprecated and will be removed from next release.");
1266         int ret = MEDIA_CONTENT_ERROR_NONE;
1267         media_info_s *_media = (media_info_s*)media;
1268         char *sql = NULL;
1269
1270         content_retip_if_fail(media);
1271         content_retip_if_fail(STRING_VALID(_media->media_id));
1272
1273 #ifdef _USE_TVPD_MODE
1274         sql = sqlite3_mprintf("UPDATE %Q SET played_count=%d, last_played_time=%d, last_played_position=%d, media_favourite=%d WHERE media_id=%Q", _media->storage_uuid, _media->played_count, _media->played_time, _media->played_position, _media->favourite, _media->media_id);
1275 #else
1276         sql = sqlite3_mprintf("UPDATE %q SET media_favourite=%d WHERE media_id=%Q", DB_TABLE_MEDIA, _media->favourite, _media->media_id);
1277 #endif
1278         ret = _content_query_sql(sql);
1279         SQLITE3_SAFE_FREE(sql);
1280
1281         if (ret == MEDIA_CONTENT_ERROR_NONE) {
1282                 /* Send notification for this update */
1283                 content_debug("Update is successful. Send notification for this");
1284                 if (_media->file_path && _media->mime_type)
1285                         media_svc_publish_update_noti(_media->file_path, _media->media_type, _media->media_id, _media->mime_type);
1286                 else
1287                         content_error("Can't Send Noti : path or mime type is NULL");
1288         }
1289
1290         return ret;
1291 }
1292 // LCOV_EXCL_STOP
1293 int media_info_move_to_db(media_info_h media, const char* dst_path)
1294 {
1295         int ret = MEDIA_CONTENT_ERROR_NONE;
1296         char repl_path[MAX_PATH_LEN] = {0, };
1297         media_info_s *_info = NULL;
1298 #ifdef _USE_TVPD_MODE
1299         char storage_id[MEDIA_CONTENT_UUID_SIZE + 1] = {0, };
1300 #endif
1301
1302         content_retip_if_fail(media);
1303         content_retip_if_fail(STRING_VALID(dst_path));
1304
1305         media_info_s *_media = (media_info_s*)media;
1306
1307         /* If dst_path is folder, append file_name */
1308         g_strlcpy(repl_path, dst_path, MAX_PATH_LEN);
1309
1310         if (g_file_test(repl_path, G_FILE_TEST_IS_DIR)) {
1311                 if (repl_path[strlen(repl_path) - 1] != '/')
1312                         g_strlcat(repl_path, "/", MAX_PATH_LEN);
1313
1314                 g_strlcat(repl_path, _media->display_name, MAX_PATH_LEN);
1315         }
1316
1317         /* If the two paths are the same, do nothing */
1318         content_retvm_if(g_strcmp0(repl_path, _media->file_path) == 0, MEDIA_CONTENT_ERROR_NONE, "Same path");
1319
1320         ret = __media_info_check_file_validity(repl_path);
1321         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1322
1323         ret = media_svc_move_item(_content_get_db_handle(), _media->file_path, repl_path, _media->media_id, _media->media_type, _media->mime_type, _content_get_uid());
1324         ret = _content_error_capi(ret);
1325         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1326
1327         /* Update media_info handle */
1328         _info = g_new0(media_info_s, 1);
1329
1330 #ifdef _USE_TVPD_MODE
1331         ret = media_svc_get_storage_id(_content_get_db_handle(), repl_path, storage_id, _content_get_uid());
1332         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
1333
1334         ret = _media_info_get_media_info_from_db(repl_path, storage_id, (media_info_h)_info);
1335 #else
1336         ret = _media_info_get_media_info_from_db(repl_path, (media_info_h)_info);
1337 #endif
1338
1339         g_free(_media->display_name);
1340         _media->display_name = g_strdup(_info->display_name);
1341         g_free(_media->file_path);
1342         _media->file_path = g_strdup(_info->file_path);
1343         g_free(_media->storage_uuid);
1344         _media->storage_uuid = g_strdup(_info->storage_uuid);
1345         g_free(_media->thumbnail_path);
1346         _media->thumbnail_path = NULL;
1347
1348         media_info_destroy((media_info_h)_info);
1349
1350         return ret;
1351 }
1352
1353 int media_info_generate_thumbnail(media_info_h media)
1354 {
1355         int ret = MEDIA_CONTENT_ERROR_NONE;
1356         char *thumb_path = NULL;
1357         media_info_s *_media = (media_info_s*)media;
1358
1359         content_retip_if_fail(media);
1360         content_retip_if_fail(STRING_VALID(_media->media_id));
1361         content_retip_if_fail(STRING_VALID(_media->file_path));
1362
1363         /* Already exists */
1364         if (STRING_VALID(_media->thumbnail_path))
1365                 return MEDIA_CONTENT_ERROR_NONE;
1366
1367         ret = media_svc_create_thumbnail(_media->file_path, _media->media_type, _content_get_uid(), &thumb_path);
1368         ret = _content_error_capi(ret);
1369         if (ret == MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT) {
1370                 g_free(thumb_path);
1371                 return ret;
1372         }
1373
1374         /* thumb_path is not NULL except #MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT */
1375         _media->thumbnail_path = g_strdup(thumb_path);
1376         g_free(thumb_path);
1377
1378         return ret;
1379 }
1380 // LCOV_EXCL_START
1381 int media_info_start_face_detection(media_info_h media, media_face_detection_completed_cb callback, void *user_data)
1382 {
1383         content_warn("DEPRECATION WARNING: media_info_start_face_detection() is deprecated and will be removed from next release.");
1384         media_info_s *_media = (media_info_s*)media;
1385
1386         if (!__media_info_isFaceRecognition_feature_supported()) {
1387                 content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
1388                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
1389         }
1390
1391         content_retip_if_fail(media);
1392         content_retip_if_fail(STRING_VALID(_media->media_id));
1393         content_retip_if_fail(STRING_VALID(_media->file_path));
1394         content_retip_if_fail(callback);
1395
1396         if (g_strcmp0(_media->mime_type, "image/jpeg") != 0 && g_strcmp0(_media->mime_type, "image/png") != 0 && g_strcmp0(_media->mime_type, "image/bmp") != 0) {
1397                 content_error("Unsupported mime type");
1398                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
1399         }
1400
1401         return MEDIA_CONTENT_ERROR_NONE;
1402 }
1403
1404 int media_info_cancel_face_detection(media_info_h media)
1405 {
1406         content_warn("DEPRECATION WARNING: media_info_cancel_face_detection() is deprecated and will be removed from next release.");
1407         media_info_s *_media = (media_info_s*)media;
1408
1409         if (!__media_info_isFaceRecognition_feature_supported()) {
1410                 content_error("NOT_SUPPORTED(0x%08x)", MEDIA_CONTENT_ERROR_NOT_SUPPORTED);
1411                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED;
1412         }
1413
1414         content_retip_if_fail(media);
1415         content_retip_if_fail(STRING_VALID(_media->media_id));
1416         content_retip_if_fail(_media->face_request_id > 0);
1417
1418         return MEDIA_CONTENT_ERROR_NONE;
1419 }
1420 // LCOV_EXCL_STOP