3d76b6fca99e663c444a27b9e2028cf6faedaca2
[platform/core/api/media-content.git] / src / media_playlist.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
18 #include <media_filter.h>
19 #include <media_info.h>
20 #include <media_info_private.h>
21 #include <media_util_private.h>
22
23 static void __media_playlist_item_free(gpointer item)
24 {
25         media_playlist_item_s *_item = (media_playlist_item_s *)item;
26
27         g_free(_item->media_id);
28         g_free(_item->playlist_name);
29         g_free(_item->thumbnail_path);
30         g_free(_item);
31 }
32
33 static void __media_playlist_item_release(media_playlist_s *playlist)
34 {
35         if (!playlist || !playlist->item_list)
36                 return;
37
38         g_list_free_full(playlist->item_list, __media_playlist_item_free);
39         playlist->item_list = NULL;
40 }
41
42 static int __media_playlist_insert_playlist_record(const char *playlist_name, int *playlist_id)
43 {
44         int ret = MEDIA_CONTENT_ERROR_NONE;
45         char *query = NULL;
46         sqlite3_stmt *stmt = NULL;
47
48         query = sqlite3_mprintf(INSERT_PLAYLIST_TO_PLAYLIST, playlist_name);
49
50         ret = _content_query_sql(query);
51         SQLITE3_SAFE_FREE(query);
52         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
53
54         query = sqlite3_mprintf(SELECT_PLAYLIST_ID_FROM_PLAYLIST, playlist_name);
55
56         ret = _content_get_result(query, &stmt);
57         SQLITE3_SAFE_FREE(query);
58         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
59
60         if (sqlite3_step(stmt) == SQLITE_ROW)
61                 *playlist_id = sqlite3_column_int(stmt, 0);
62
63         SQLITE3_FINALIZE(stmt);
64
65         return MEDIA_CONTENT_ERROR_NONE;
66 }
67
68 static int __media_playlist_insert_item_to_playlist(int playlist_id, const char *media_id)
69 {
70         int ret = MEDIA_CONTENT_ERROR_NONE;
71         sqlite3_stmt *stmt = NULL;
72         char *query = NULL;
73         int play_order = 0;
74
75         query = sqlite3_mprintf(SELECT_MAX_PLAY_ORDER_FROM_PLAYLIST_VIEW, playlist_id);
76
77         /* get the max play_order */
78         ret = _content_get_result(query, &stmt);
79         SQLITE3_SAFE_FREE(query);
80         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
81
82         if (sqlite3_step(stmt) == SQLITE_ROW)
83                 play_order = sqlite3_column_int(stmt, 0);
84
85         SQLITE3_FINALIZE(stmt);
86
87         query = sqlite3_mprintf(INSERT_PLAYLIST_ITEM_TO_PLAYLIST_MAP, playlist_id, media_id, ++play_order);
88         ret = media_svc_append_query(query, _content_get_uid());
89
90         return _content_error_capi(ret);
91 }
92
93 static int __media_playlist_remove_item_from_playlist(int playlist_id, int playlist_member_id)
94 {
95         int ret = MEDIA_CONTENT_ERROR_NONE;
96         char *query_str = NULL;
97
98         query_str = sqlite3_mprintf(REMOVE_PLAYLIST_ITEM_FROM_PLAYLIST_MAP, playlist_id, playlist_member_id);
99         ret = media_svc_append_query(query_str, _content_get_uid());
100
101         return _content_error_capi(ret);
102 }
103
104 static int __media_playlist_update_playlist_name(int playlist_id, const char *playlist_name)
105 {
106         int ret = MEDIA_CONTENT_ERROR_NONE;
107         char *query_str = NULL;
108
109         query_str = sqlite3_mprintf(UPDATE_PLAYLIST_NAME_FROM_PLAYLIST, playlist_name, playlist_id);
110         ret = media_svc_append_query(query_str, _content_get_uid());
111
112         return _content_error_capi(ret);
113 }
114
115 static int __media_playlist_update_thumbnail_path(int playlist_id, const char *path)
116 {
117         int ret = MEDIA_CONTENT_ERROR_NONE;
118         char *query_str = NULL;
119
120         query_str = sqlite3_mprintf(UPDATE_PLAYLIST_THUMBNAIL_FROM_PLAYLIST, path, playlist_id);
121         ret = media_svc_append_query(query_str, _content_get_uid());
122
123         return _content_error_capi(ret);
124 }
125
126 static int __media_playlist_update_play_order(int playlist_id, int playlist_member_id, int play_order)
127 {
128         int ret = MEDIA_CONTENT_ERROR_NONE;
129         char *query_str = NULL;
130
131         query_str = sqlite3_mprintf(UPDATE_PLAYLIST_ORDER_FROM_PLAYLIST_MAP, play_order, playlist_id, playlist_member_id);
132         ret = media_svc_append_query(query_str, _content_get_uid());
133
134         return _content_error_capi(ret);
135 }
136
137 static bool __media_playlist_member_cb(int playlist_member_id, media_info_h media, void *user_data)
138 {
139         int ret = MEDIA_CONTENT_ERROR_NONE;
140         GList **list = (GList**)user_data;
141         char *path = NULL;
142
143         ret = media_info_get_file_path(media, &path);
144         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, FALSE, "media_info_get_file_path fail");
145
146         *list = g_list_append(*list, path);
147
148         return TRUE;
149 }
150
151 static int __media_playlist_reset_file(const char *playlist_path)
152 {
153         FILE *fp = NULL;
154
155         fp = fopen(playlist_path, "wb");
156         if (fp == NULL) {
157                 content_stderror("fopen failed");
158                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
159         }
160
161         fputs("", fp);  /* remove previous playlist */
162
163         fclose(fp);
164
165         return MEDIA_CONTENT_ERROR_NONE;
166 }
167
168 static int __media_playlist_append_to_file(const char *playlist_path, const char *path)
169 {
170         FILE *fp = NULL;
171
172         fp = fopen(playlist_path, "a"); /* append only */
173         if (fp == NULL) {
174                 content_stderror("fopen failed");
175                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
176         }
177
178
179         fputs(path, fp);
180         fputs("\n", fp);
181
182         fclose(fp);
183
184         return MEDIA_CONTENT_ERROR_NONE;
185 }
186
187 static int __media_playlist_import_item_from_file(const char *playlist_path, GSList **item_list)
188 {
189         int tmp_str_len = 0;
190         char tmp_str[MAX_PATH_LEN] = {0, };
191         char repl_item[MAX_PATH_LEN] = {0, };
192         FILE *fp = NULL;
193
194         fp = fopen(playlist_path, "rb");
195         if (fp == NULL) {
196                 content_stderror("fopen failed");
197                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
198         }
199
200         while (fgets(tmp_str, MAX_PATH_LEN, fp) != NULL) {
201                 memset(repl_item, 0, sizeof(repl_item));
202                 _media_content_replace_path(tmp_str, repl_item);
203
204                 tmp_str_len = strlen(repl_item);
205                 /* Check for empty file */
206                 if (tmp_str_len <= 1)
207                         continue;
208
209                 if (repl_item[0] == '#')
210                         continue;
211
212
213                 if (repl_item[tmp_str_len - 1] == '\n')
214                         repl_item[tmp_str_len - 1] = '\0';
215
216                 *item_list = g_slist_append(*item_list, g_strdup(repl_item));
217         }
218
219         fclose(fp);
220
221         return MEDIA_CONTENT_ERROR_NONE;
222 }
223
224 int media_playlist_insert_to_db(const char *name, media_playlist_h *playlist)
225 {
226         int ret = MEDIA_CONTENT_ERROR_NONE;
227         int playlist_id = 0;
228
229         content_retip_if_fail(STRING_VALID(name));
230         content_retip_if_fail(playlist);
231
232         media_playlist_s *_playlist = g_new0(media_playlist_s, 1);
233
234         ret = __media_playlist_insert_playlist_record(name, &playlist_id);
235         if (ret != MEDIA_CONTENT_ERROR_NONE) {
236                 g_free(_playlist);
237                 return ret;
238         }
239
240         _playlist->playlist_id = playlist_id;
241         _playlist->name = g_strdup(name);
242
243         *playlist = (media_playlist_h)_playlist;
244
245         return ret;
246 }
247
248 int media_playlist_delete_from_db(int playlist_id)
249 {
250         int ret = MEDIA_CONTENT_ERROR_NONE;
251         char *query_str = NULL;
252
253         content_retipm_if_fail(playlist_id >= 0, "%d", playlist_id);
254
255         query_str = sqlite3_mprintf(DELETE_PLAYLIST_FROM_PLAYLIST, playlist_id);
256
257         ret = _content_query_sql(query_str);
258         SQLITE3_SAFE_FREE(query_str);
259
260         return ret;
261 }
262
263 int media_playlist_get_playlist_count_from_db(filter_h filter, int *playlist_count)
264 {
265         content_retip_if_fail(playlist_count);
266
267         return _media_db_get_group_count(filter, MEDIA_GROUP_PLAYLIST, playlist_count);
268 }
269
270 int media_playlist_foreach_playlist_from_db(filter_h filter, media_playlist_cb callback, void *user_data)
271 {
272         content_retip_if_fail(callback);
273
274         return _media_db_get_playlist(filter, callback, user_data);
275 }
276
277 int media_playlist_get_media_count_from_db(int playlist_id, filter_h filter, int *media_count)
278 {
279         content_retip_if_fail(media_count);
280         content_retipm_if_fail(playlist_id > 0, "%d", playlist_id);
281
282         return _media_db_get_group_item_count_by_id(playlist_id, filter, MEDIA_GROUP_PLAYLIST, media_count);
283 }
284
285 int media_playlist_foreach_media_from_db(int playlist_id, filter_h filter, playlist_member_cb callback, void *user_data)
286 {
287         content_retip_if_fail(callback);
288         content_retipm_if_fail(playlist_id > 0, "%d", playlist_id);
289
290         return _media_db_get_playlist_item(playlist_id, filter, callback, user_data);
291 }
292
293 int media_playlist_destroy(media_playlist_h playlist)
294 {
295         media_playlist_s *_playlist = (media_playlist_s *)playlist;
296
297         content_retip_if_fail(playlist);
298
299         g_free(_playlist->name);
300         g_free(_playlist->thumbnail_path);
301         g_free(_playlist);
302
303         return MEDIA_CONTENT_ERROR_NONE;
304 }
305
306 int media_playlist_clone(media_playlist_h *dst, media_playlist_h src)
307 {
308         media_playlist_s *_src = (media_playlist_s *)src;
309
310         content_retip_if_fail(dst);
311         content_retip_if_fail(src);
312
313         media_playlist_s *_dst = g_new0(media_playlist_s, 1);
314
315         _dst->playlist_id = _src->playlist_id;
316         _dst->name = g_strdup(_src->name);
317
318         *dst = (media_playlist_h)_dst;
319
320         return MEDIA_CONTENT_ERROR_NONE;
321 }
322
323 int media_playlist_get_playlist_from_db(int playlist_id, media_playlist_h *playlist)
324 {
325         int ret = MEDIA_CONTENT_ERROR_NONE;
326         sqlite3_stmt *stmt = NULL;
327         char *query = NULL;
328
329         content_retipm_if_fail(playlist_id > 0, "%d", playlist_id);
330         content_retip_if_fail(playlist);
331
332         query = sqlite3_mprintf(SELECT_PLAYLIST_FROM_PLAYLIST, playlist_id);
333
334         ret = _content_get_result(query, &stmt);
335         SQLITE3_SAFE_FREE(query);
336         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
337
338         media_playlist_s *_playlist = NULL;
339
340         if (sqlite3_step(stmt) == SQLITE_ROW) {
341                 _playlist = g_new0(media_playlist_s, 1);
342
343                 _playlist->playlist_id = playlist_id;
344                 _playlist->name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
345                 _playlist->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, 1));
346
347                 *playlist = (media_playlist_h)_playlist;
348         } else {
349                 content_error("Nonexistent playlist id[%d]", playlist_id);
350                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
351         }
352
353         SQLITE3_FINALIZE(stmt);
354
355         return ret;
356 }
357
358 int media_playlist_get_playlist_id(media_playlist_h playlist, int *playlist_id)
359 {
360         media_playlist_s *_playlist = (media_playlist_s *)playlist;
361
362         content_retip_if_fail(playlist);
363         content_retip_if_fail(playlist_id);
364
365         *playlist_id = _playlist->playlist_id;
366
367         return MEDIA_CONTENT_ERROR_NONE;
368 }
369
370 int media_playlist_get_name(media_playlist_h playlist, char **name)
371 {
372         media_playlist_s *_playlist = (media_playlist_s *)playlist;
373
374         content_retip_if_fail(playlist);
375         content_retip_if_fail(name);
376
377         *name = g_strdup(_playlist->name);
378
379         return MEDIA_CONTENT_ERROR_NONE;
380 }
381
382 int media_playlist_get_thumbnail_path(media_playlist_h playlist, char **path)
383 {
384         media_playlist_s *_playlist = (media_playlist_s *)playlist;
385
386         content_retip_if_fail(playlist);
387         content_retip_if_fail(path);
388
389         *path = g_strdup(_playlist->thumbnail_path);
390
391         return MEDIA_CONTENT_ERROR_NONE;
392 }
393
394 int media_playlist_get_play_order(media_playlist_h playlist, int playlist_member_id, int *play_order)
395 {
396         int ret = MEDIA_CONTENT_ERROR_NONE;
397         media_playlist_s *_playlist = (media_playlist_s *)playlist;
398         sqlite3_stmt *stmt = NULL;
399         char *query = NULL;
400
401         content_retip_if_fail(playlist);
402         content_retipm_if_fail(playlist_member_id >= 0, "%d", playlist_member_id);
403         content_retip_if_fail(play_order);
404
405         query = sqlite3_mprintf(SELECT_PLAY_ORDER_FROM_PLAYLIST_VIEW, _playlist->playlist_id, playlist_member_id);
406         ret = _content_get_result(query, &stmt);
407         SQLITE3_SAFE_FREE(query);
408         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
409
410         if (sqlite3_step(stmt) == SQLITE_ROW)
411                 *play_order = sqlite3_column_int(stmt, 0);
412
413         SQLITE3_FINALIZE(stmt);
414
415         return ret;
416 }
417
418 int media_playlist_set_name(media_playlist_h playlist, const char *playlist_name)
419 {
420         media_playlist_s *_playlist = (media_playlist_s *)playlist;
421         media_playlist_item_s *item = NULL;
422
423         content_retip_if_fail(playlist);
424         content_retip_if_fail(STRING_VALID(playlist_name));
425
426         g_free(_playlist->name);
427
428         item = g_new0(media_playlist_item_s, 1);
429
430         item->playlist_name = g_strdup(playlist_name);
431         item->function = MEDIA_PLAYLIST_UPDATE_PLAYLIST_NAME;
432
433         _playlist->name = g_strdup(playlist_name);
434         _playlist->item_list = g_list_append(_playlist->item_list, item);
435
436         return MEDIA_CONTENT_ERROR_NONE;
437 }
438
439 int media_playlist_set_thumbnail_path(media_playlist_h playlist, const char *path)
440 {
441         media_playlist_s *_playlist = (media_playlist_s *)playlist;
442         media_playlist_item_s *item = NULL;
443
444         content_retip_if_fail(playlist);
445         content_retip_if_fail(STRING_VALID(path));
446
447         g_free(_playlist->thumbnail_path);
448
449         item = g_new0(media_playlist_item_s, 1);
450
451         item->thumbnail_path = g_strdup(path);
452         item->function = MEDIA_PLAYLIST_UPDATE_THUMBNAIL_PATH;
453
454         _playlist->thumbnail_path = g_strdup(path);
455         _playlist->item_list = g_list_append(_playlist->item_list, item);
456
457         return MEDIA_CONTENT_ERROR_NONE;
458 }
459
460 int media_playlist_set_play_order(media_playlist_h playlist, int playlist_member_id, int play_order)
461 {
462         media_playlist_s *_playlist = (media_playlist_s *)playlist;
463         media_playlist_item_s *item = NULL;
464
465         content_retip_if_fail(playlist);
466         content_retipm_if_fail(playlist_member_id > 0, "%d", playlist_member_id);
467         content_retipm_if_fail(play_order >= 0, "%d", play_order);
468
469         item = g_new0(media_playlist_item_s, 1);
470
471         item->playlist_member_id = playlist_member_id;
472         item->function = MEDIA_PLAYLIST_UPDATE_PLAY_ORDER;
473         item->play_order = play_order;
474
475         _playlist->item_list = g_list_append(_playlist->item_list, item);
476
477         return MEDIA_CONTENT_ERROR_NONE;
478 }
479
480 int media_playlist_add_media(media_playlist_h playlist, const char *media_id)
481 {
482         media_playlist_s *_playlist = (media_playlist_s *)playlist;
483         media_playlist_item_s *item = NULL;
484
485         content_retip_if_fail(playlist);
486         content_retip_if_fail(STRING_VALID(media_id));
487
488         item = g_new0(media_playlist_item_s, 1);
489
490         item->media_id = g_strdup(media_id);
491         item->function = MEDIA_PLAYLIST_ADD;
492
493         _playlist->item_list = g_list_append(_playlist->item_list, item);
494
495         return MEDIA_CONTENT_ERROR_NONE;
496 }
497
498 int media_playlist_remove_media(media_playlist_h playlist, int playlist_member_id)
499 {
500         media_playlist_s *_playlist = (media_playlist_s *)playlist;
501         media_playlist_item_s *item = NULL;
502
503         content_retip_if_fail(playlist);
504         content_retipm_if_fail(playlist_member_id > 0, "%d", playlist_member_id);
505
506         item = g_new0(media_playlist_item_s, 1);
507
508         item->playlist_member_id = playlist_member_id;
509         item->function = MEDIA_PLAYLIST_REMOVE;
510
511         _playlist->item_list = g_list_append(_playlist->item_list, item);
512
513         return MEDIA_CONTENT_ERROR_NONE;
514 }
515
516 void __media_playlist_foreach_request(gpointer data, gpointer user_data)
517 {
518         int ret = MEDIA_CONTENT_ERROR_NONE;
519         media_playlist_item_s *_playlist_item = (media_playlist_item_s *)data;
520         int playlist_id = *((int *)user_data);
521
522         if (!_playlist_item)
523                 return;
524
525         switch (_playlist_item->function) {
526         case MEDIA_PLAYLIST_ADD:
527                 ret = __media_playlist_insert_item_to_playlist(playlist_id, _playlist_item->media_id);
528                 break;
529
530         case MEDIA_PLAYLIST_REMOVE:
531                 ret = __media_playlist_remove_item_from_playlist(playlist_id, _playlist_item->playlist_member_id);
532                 break;
533
534         case MEDIA_PLAYLIST_UPDATE_PLAYLIST_NAME:
535                 ret = __media_playlist_update_playlist_name(playlist_id, _playlist_item->playlist_name);
536                 break;
537
538         case MEDIA_PLAYLIST_UPDATE_THUMBNAIL_PATH:
539                 ret = __media_playlist_update_thumbnail_path(playlist_id, _playlist_item->thumbnail_path);
540                 break;
541
542         case MEDIA_PLAYLIST_UPDATE_PLAY_ORDER:
543                 ret = __media_playlist_update_play_order(playlist_id, _playlist_item->playlist_member_id, _playlist_item->play_order);
544                 break;
545
546         default:
547                 break;
548         }
549
550         if (ret != MEDIA_CONTENT_ERROR_NONE)
551                 content_error("Failed some operation[%d]", _playlist_item->function);
552 }
553
554 int media_playlist_update_to_db(media_playlist_h playlist)
555 {
556         int ret = MEDIA_CONTENT_ERROR_NONE;
557         media_playlist_s *_playlist = (media_playlist_s *)playlist;
558
559         content_retip_if_fail(playlist);
560         content_retvm_if(!_playlist->item_list, MEDIA_CONTENT_ERROR_NONE, "operation list length is 0");
561
562         g_list_foreach(_playlist->item_list, __media_playlist_foreach_request, &(_playlist->playlist_id));
563
564         ret = media_svc_send_query(_content_get_uid());
565
566         __media_playlist_item_release(_playlist);
567
568         return _content_error_capi(ret);
569 }
570
571 static int __media_playlist_get_media_id_by_path(const char *path, char **media_id)
572 {
573         int ret = MEDIA_CONTENT_ERROR_NONE;
574         char *query = NULL;
575         sqlite3_stmt *stmt = NULL;
576
577         content_retip_if_fail(path);
578         content_retip_if_fail(media_id);
579
580 #ifdef _USE_TVPD_MODE
581         query = sqlite3_mprintf("SELECT media_id FROM '%q' WHERE media_path='%q'", DB_VIEW_MEDIA, path);
582 #else
583         query = sqlite3_mprintf("SELECT media_id FROM '%q' WHERE media_path='%q'", DB_TABLE_MEDIA, path);
584 #endif
585         ret = _content_get_result(query, &stmt);
586         SQLITE3_SAFE_FREE(query);
587         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "Failed to get media_id");
588
589         if (sqlite3_step(stmt) == SQLITE_ROW)
590                 *media_id = g_strdup((const char *)sqlite3_column_text(stmt, 0));
591
592         SQLITE3_FINALIZE(stmt);
593
594         return ret;
595 }
596
597 static void __media_playlist_foreach_item(gpointer item, gpointer user_data)
598 {
599         int ret = MEDIA_CONTENT_ERROR_NONE;
600         char *path = (char *)item;
601         media_playlist_h *playlist = (media_playlist_h *)user_data;
602         char *media_id = NULL;
603
604         ret = __media_playlist_get_media_id_by_path(path, &media_id);
605         if (ret != MEDIA_CONTENT_ERROR_NONE) {
606                 content_sec_error("Fail to get media_id [%s]", path);
607                 return;
608         }
609
610         ret = media_playlist_add_media(*playlist, media_id);
611         g_free(media_id);
612         if (ret != MEDIA_CONTENT_ERROR_NONE) {
613                 content_sec_error("Fail to add media [%s]", path);
614                 return;
615         }
616 }
617
618 int media_playlist_import_from_file(const char *path, const char *playlist_name, media_playlist_h *playlist)
619 {
620         int ret = MEDIA_CONTENT_ERROR_NONE;
621         GSList *item_list = NULL;
622         char repl_path[MAX_PATH_LEN] = {0, };
623
624         content_retip_if_fail(STRING_VALID(path));
625         content_retip_if_fail(STRING_VALID(playlist_name));
626
627         ret = _media_content_replace_path(path, repl_path);
628         content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
629
630         ret = media_playlist_insert_to_db(playlist_name, playlist);
631         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_playlist_insert_to_db fail");
632
633         ret = __media_playlist_import_item_from_file(repl_path, &item_list);
634         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "Fail to get playlist from file");
635
636         g_slist_foreach(item_list, __media_playlist_foreach_item, playlist);
637
638         ret = media_playlist_update_to_db(*playlist);
639         g_slist_free_full(item_list, g_free);
640
641         return ret;
642 }
643
644 int media_playlist_export_to_file(media_playlist_h playlist, const char *path)
645 {
646         int ret = MEDIA_CONTENT_ERROR_NONE;
647         media_playlist_s *_playlist = (media_playlist_s *)playlist;
648         GList *item_list = NULL;
649         unsigned int idx = 0;
650         char repl_path[MAX_PATH_LEN] = {0, };
651
652         content_retip_if_fail(STRING_VALID(path));
653         content_retip_if_fail(playlist);
654         content_retipm_if_fail(_playlist->playlist_id > 0, "%d", _playlist->playlist_id);
655
656         ret = _media_content_replace_path(path, repl_path);
657         content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
658
659         ret = _media_db_get_playlist_item(_playlist->playlist_id, NULL, __media_playlist_member_cb, &item_list);
660         content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "_media_db_get_playlist_item fail");
661
662         ret = __media_playlist_reset_file(repl_path);
663         if (ret != MEDIA_CONTENT_ERROR_NONE) {
664                 g_list_free_full(item_list, g_free);
665                 content_error("Fail to init playlist file");
666                 return ret;
667         }
668
669         for (idx = 0; idx < g_list_length(item_list); idx++) {
670                 char *item = g_list_nth_data(item_list, idx);
671                 if (STRING_VALID(item)) {
672                         ret = __media_playlist_append_to_file(repl_path, item);
673                         if (ret != MEDIA_CONTENT_ERROR_NONE) {
674                                 g_list_free_full(item_list, g_free);
675                                 content_error("Fail to export paths into file");
676                                 return ret;
677                         }
678                 }
679         }
680
681         g_list_free_full(item_list, g_free);
682
683         return ret;
684 }
685
686 int media_playlist_create(media_playlist_h *playlist)
687 {
688         content_retip_if_fail(playlist);
689
690         media_playlist_s *_playlist = g_new0(media_playlist_s, 1);
691
692         _playlist->playlist_id = -1;
693         _playlist->name = NULL;
694         _playlist->thumbnail_path = NULL;
695         _playlist->item_list = NULL;
696
697         *playlist = (media_playlist_h)_playlist;
698
699         return MEDIA_CONTENT_ERROR_NONE;
700 }
701
702 int media_playlist_get_play_order_v2(int playlist_id, int playlist_member_id, int *play_order)
703 {
704         int ret = MEDIA_CONTENT_ERROR_NONE;
705         sqlite3_stmt *stmt = NULL;
706         char *query = NULL;
707
708         content_retipm_if_fail(playlist_id >= 0, "%d", playlist_id);
709         content_retipm_if_fail(playlist_member_id >= 0, "%d", playlist_member_id);
710         content_retip_if_fail(play_order);
711
712         query = sqlite3_mprintf(SELECT_PLAY_ORDER_FROM_PLAYLIST_VIEW, playlist_id, playlist_member_id);
713
714         ret = _content_get_result(query, &stmt);
715         SQLITE3_SAFE_FREE(query);
716         content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
717
718         if (sqlite3_step(stmt) == SQLITE_ROW)
719                 *play_order = sqlite3_column_int(stmt, 0);
720
721         SQLITE3_FINALIZE(stmt);
722
723         return ret;
724 }
725
726 int media_playlist_insert_to_db_v2(media_playlist_h playlist)
727 {
728         int ret = MEDIA_CONTENT_ERROR_NONE;
729         media_playlist_s *_playlist = (media_playlist_s *)playlist;
730         int playlist_id = 0;
731
732         content_retip_if_fail(playlist);
733         content_retipm_if_fail(_playlist->playlist_id == -1, "%d", _playlist->playlist_id);
734
735         ret = __media_playlist_insert_playlist_record(_playlist->name, &playlist_id);
736         if (ret != MEDIA_CONTENT_ERROR_NONE) {
737                 __media_playlist_item_release(_playlist);
738                 content_error("Insert playlist Fail");
739                 return ret;
740         }
741
742         _playlist->playlist_id = playlist_id;
743
744         return media_playlist_update_to_db(playlist);
745 }
746
747 int media_playlist_update_to_db_v2(int playlist_id, media_playlist_h playlist)
748 {
749         media_playlist_s *_playlist = (media_playlist_s *)playlist;
750         content_retip_if_fail(playlist);
751
752         _playlist->playlist_id = playlist_id;
753
754         return media_playlist_update_to_db(playlist);
755 }