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