13d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij/**
23d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * \file newplaylist.c
33d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Example program to create a playlist on a device.
43d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
53d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Copyright (C) 2006 Robert Reardon <rreardon@monkshatch.vispa.com>
63d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
73d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * This library is free software; you can redistribute it and/or
83d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * modify it under the terms of the GNU Lesser General Public
93d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * License as published by the Free Software Foundation; either
103d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * version 2 of the License, or (at your option) any later version.
113d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
123d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * This library is distributed in the hope that it will be useful,
133d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * but WITHOUT ANY WARRANTY; without even the implied warranty of
143d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
153d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Lesser General Public License for more details.
163d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij *
173d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * You should have received a copy of the GNU Lesser General Public
183d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * License along with this library; if not, write to the
193d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
203d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij * Boston, MA 02111-1307, USA.
213d78c4ce5b4b4f38929792b6e392df1416b578b7Linus Walleij */
22508705f40e77e580e42da11b74368df89a2dbbafrreardon#include "common.h"
23508705f40e77e580e42da11b74368df89a2dbbafrreardon#include "string.h"
242eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <stdlib.h>
252eaaff0477a5c5ba2aa7631e998f8bd4f77cf75cLinus Walleij#include <limits.h>
26508705f40e77e580e42da11b74368df89a2dbbafrreardon#include <sys/stat.h>
27508705f40e77e580e42da11b74368df89a2dbbafrreardon#include <fcntl.h>
28508705f40e77e580e42da11b74368df89a2dbbafrreardon#include <errno.h>
29508705f40e77e580e42da11b74368df89a2dbbafrreardon
30508705f40e77e580e42da11b74368df89a2dbbafrreardonstatic void usage(void) {
31aac4729a1797831465f3d45b840e22749fbf1095nicklas  printf("Usage: newplaylist -i <fileid/trackid> -n <playlistname> -s <storage_id> -p <parent_id>\n");
32508705f40e77e580e42da11b74368df89a2dbbafrreardon  exit(0);
33508705f40e77e580e42da11b74368df89a2dbbafrreardon}
34508705f40e77e580e42da11b74368df89a2dbbafrreardon
35508705f40e77e580e42da11b74368df89a2dbbafrreardonint main (int argc, char **argv) {
36508705f40e77e580e42da11b74368df89a2dbbafrreardon  int opt;
37508705f40e77e580e42da11b74368df89a2dbbafrreardon  extern int optind;
38508705f40e77e580e42da11b74368df89a2dbbafrreardon  extern char *optarg;
39508705f40e77e580e42da11b74368df89a2dbbafrreardon  LIBMTP_mtpdevice_t *device = NULL;
40508705f40e77e580e42da11b74368df89a2dbbafrreardon  int idcount = 0;
41508705f40e77e580e42da11b74368df89a2dbbafrreardon  uint32_t *ids = NULL;
42508705f40e77e580e42da11b74368df89a2dbbafrreardon  uint32_t *tmp = NULL;
43508705f40e77e580e42da11b74368df89a2dbbafrreardon  char *playlistname = NULL;
4420c3b6712c74c05c12b5e5f7123a2d7e1876c40eLinus Walleij  char *rest;
45aac4729a1797831465f3d45b840e22749fbf1095nicklas  uint32_t storageid = 0;
46aac4729a1797831465f3d45b840e22749fbf1095nicklas  uint32_t parentid = 0;
47508705f40e77e580e42da11b74368df89a2dbbafrreardon
48cd9f49913d12199fa7971309530a37f664df916etedbullock  fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n");
49cd9f49913d12199fa7971309530a37f664df916etedbullock
50aac4729a1797831465f3d45b840e22749fbf1095nicklas  while ( (opt = getopt(argc, argv, "hn:i:s:p:")) != -1 ) {
51508705f40e77e580e42da11b74368df89a2dbbafrreardon    switch (opt) {
52508705f40e77e580e42da11b74368df89a2dbbafrreardon    case 'h':
53508705f40e77e580e42da11b74368df89a2dbbafrreardon      usage();
54508705f40e77e580e42da11b74368df89a2dbbafrreardon    case 'i':
55508705f40e77e580e42da11b74368df89a2dbbafrreardon      idcount++;
56508705f40e77e580e42da11b74368df89a2dbbafrreardon      if ((tmp = realloc(ids, sizeof(uint32_t) * (idcount))) == NULL) {
57508705f40e77e580e42da11b74368df89a2dbbafrreardon        printf("realloc failed\n");
58508705f40e77e580e42da11b74368df89a2dbbafrreardon        return 1;
59508705f40e77e580e42da11b74368df89a2dbbafrreardon      }
60508705f40e77e580e42da11b74368df89a2dbbafrreardon      ids = tmp;
6120c3b6712c74c05c12b5e5f7123a2d7e1876c40eLinus Walleij      ids[(idcount-1)] = strtoul(optarg, &rest, 0);
62508705f40e77e580e42da11b74368df89a2dbbafrreardon      break;
63508705f40e77e580e42da11b74368df89a2dbbafrreardon    case 'n':
64508705f40e77e580e42da11b74368df89a2dbbafrreardon      playlistname = strdup(optarg);
65508705f40e77e580e42da11b74368df89a2dbbafrreardon      break;
66aac4729a1797831465f3d45b840e22749fbf1095nicklas    case 's':
67aac4729a1797831465f3d45b840e22749fbf1095nicklas      storageid = (uint32_t) strtoul(optarg, NULL, 0);
68aac4729a1797831465f3d45b840e22749fbf1095nicklas	  break;
69aac4729a1797831465f3d45b840e22749fbf1095nicklas    case 'p':
70aac4729a1797831465f3d45b840e22749fbf1095nicklas      parentid = (uint32_t) strtoul(optarg, NULL, 0);
71aac4729a1797831465f3d45b840e22749fbf1095nicklas	  break;
72508705f40e77e580e42da11b74368df89a2dbbafrreardon    default:
73508705f40e77e580e42da11b74368df89a2dbbafrreardon      usage();
74508705f40e77e580e42da11b74368df89a2dbbafrreardon    }
75508705f40e77e580e42da11b74368df89a2dbbafrreardon  }
76508705f40e77e580e42da11b74368df89a2dbbafrreardon  argc -= optind;
77508705f40e77e580e42da11b74368df89a2dbbafrreardon  argv += optind;
78508705f40e77e580e42da11b74368df89a2dbbafrreardon
79508705f40e77e580e42da11b74368df89a2dbbafrreardon  if ( playlistname == NULL) {
80508705f40e77e580e42da11b74368df89a2dbbafrreardon    printf("You need to supply a playlist name.\n");
81508705f40e77e580e42da11b74368df89a2dbbafrreardon    usage();
82508705f40e77e580e42da11b74368df89a2dbbafrreardon  }
83508705f40e77e580e42da11b74368df89a2dbbafrreardon
84508705f40e77e580e42da11b74368df89a2dbbafrreardon  if (idcount == 0) {
85508705f40e77e580e42da11b74368df89a2dbbafrreardon    printf("You need to supply one or more track IDs\n");
86508705f40e77e580e42da11b74368df89a2dbbafrreardon    usage();
87508705f40e77e580e42da11b74368df89a2dbbafrreardon  }
88508705f40e77e580e42da11b74368df89a2dbbafrreardon
89508705f40e77e580e42da11b74368df89a2dbbafrreardon
90508705f40e77e580e42da11b74368df89a2dbbafrreardon  LIBMTP_Init();
91508705f40e77e580e42da11b74368df89a2dbbafrreardon  device = LIBMTP_Get_First_Device();
92508705f40e77e580e42da11b74368df89a2dbbafrreardon  if (device == NULL) {
93508705f40e77e580e42da11b74368df89a2dbbafrreardon    printf("No devices.\n");
94508705f40e77e580e42da11b74368df89a2dbbafrreardon    return 0;
95508705f40e77e580e42da11b74368df89a2dbbafrreardon  }
96508705f40e77e580e42da11b74368df89a2dbbafrreardon
97508705f40e77e580e42da11b74368df89a2dbbafrreardon  LIBMTP_playlist_t *playlist = LIBMTP_new_playlist_t();
98508705f40e77e580e42da11b74368df89a2dbbafrreardon  playlist->name = playlistname;
99508705f40e77e580e42da11b74368df89a2dbbafrreardon  playlist->no_tracks = idcount;
100508705f40e77e580e42da11b74368df89a2dbbafrreardon  playlist->tracks = ids;
101aac4729a1797831465f3d45b840e22749fbf1095nicklas  playlist->parent_id = parentid;
102aac4729a1797831465f3d45b840e22749fbf1095nicklas  playlist->storage_id = storageid;
103ea68f1f3e59ed3fbc02cf64e8f2779d67806ad12Linus Walleij  int ret = LIBMTP_Create_New_Playlist(device,playlist);
104508705f40e77e580e42da11b74368df89a2dbbafrreardon  if (ret != 0) {
105070e9b4a25c2384f070f20b92c8101c9e3f58f33Linus Walleij    printf("Couldn't create playlist object\n");
106070e9b4a25c2384f070f20b92c8101c9e3f58f33Linus Walleij    LIBMTP_Dump_Errorstack(device);
107070e9b4a25c2384f070f20b92c8101c9e3f58f33Linus Walleij    LIBMTP_Clear_Errorstack(device);
108508705f40e77e580e42da11b74368df89a2dbbafrreardon  }
109508705f40e77e580e42da11b74368df89a2dbbafrreardon  else {
110070e9b4a25c2384f070f20b92c8101c9e3f58f33Linus Walleij    printf("Created new playlist: %u\n", playlist->playlist_id);
111508705f40e77e580e42da11b74368df89a2dbbafrreardon  }
112508705f40e77e580e42da11b74368df89a2dbbafrreardon
113508705f40e77e580e42da11b74368df89a2dbbafrreardon  LIBMTP_Release_Device(device);
114508705f40e77e580e42da11b74368df89a2dbbafrreardon  printf("OK.\n");
115508705f40e77e580e42da11b74368df89a2dbbafrreardon  return 0;
116508705f40e77e580e42da11b74368df89a2dbbafrreardon}
117508705f40e77e580e42da11b74368df89a2dbbafrreardon
118