13aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/** 23aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * \file albumart.c 33aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Example program to send album art. 43aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 53aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Copyright (C) 2006 Andy Kelk <andy@mopoke.co.uk> 63aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 73aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is free software; you can redistribute it and/or 83aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * modify it under the terms of the GNU Lesser General Public 93aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License as published by the Free Software Foundation; either 103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * version 2 of the License, or (at your option) any later version. 113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is distributed in the hope that it will be useful, 133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * but WITHOUT ANY WARRANTY; without even the implied warranty of 143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Lesser General Public License for more details. 163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * You should have received a copy of the GNU Lesser General Public 183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License along with this library; if not, write to the 193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Boston, MA 02111-1307, USA. 213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */ 223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "config.h" 233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "common.h" 243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "string.h" 253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <stdlib.h> 263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <limits.h> 273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <unistd.h> 283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <fcntl.h> 293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <errno.h> 303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <sys/stat.h> 313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <sys/types.h> 323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#ifdef HAVE_SYS_UIO_H 333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <sys/uio.h> 343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#endif 353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic void usage(void) { 373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("Usage: albumart -i <fileid/trackid> -n <albumname> <imagefile>\n"); 383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit(0); 393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} 403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint main (int argc, char **argv) { 423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev int opt; 433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev extern int optind; 443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev extern char *optarg; 453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_mtpdevice_t *device = NULL; 463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev int idcount = 0; 473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev int fd; 483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev uint32_t *ids = NULL; 493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev uint32_t *tmp = NULL; 503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev uint64_t filesize; 513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev char *imagedata = NULL; 523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev char *albumname = NULL; 533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev char *path = NULL; 543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev char *rest; 553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev struct stat statbuff; 563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n"); 583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev while ( (opt = getopt(argc, argv, "hn:i:")) != -1 ) { 603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev switch (opt) { 613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case 'h': 623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev usage(); 633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case 'i': 643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev idcount++; 653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ((tmp = realloc(ids, sizeof(uint32_t) * (idcount))) == NULL) { 663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("realloc failed\n"); 673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev return 1; 683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ids = tmp; 703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ids[(idcount-1)] = strtoul(optarg, &rest, 0); 713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev break; 723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev case 'n': 733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev albumname = strdup(optarg); 743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev break; 753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev default: 763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev usage(); 773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev argc -= optind; 803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev argv += optind; 813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ( argc != 1 ) { 833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("You need to pass a filename.\n"); 843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev usage(); 853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ( albumname == NULL) { 883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("You need to supply an album name.\n"); 893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev usage(); 903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if (idcount == 0) { 933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("You need to supply one or more track IDs\n"); 943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev usage(); 953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev path = argv[0]; 983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ( stat(path, &statbuff) == -1 ) { 1003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(stderr, "%s: ", path); 1013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev perror("stat"); 1023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev exit(1); 1033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev filesize = (uint64_t) statbuff.st_size; 1053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev imagedata = malloc(filesize * sizeof(uint8_t)); 1063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#ifdef __WIN32__ 1083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ( (fd = open(path, O_RDONLY|O_BINARY) == -1) ) { 1093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#else 1103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ( (fd = open(path, O_RDONLY)) == -1) { 1113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#endif 1123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("Couldn't open image file %s (%s)\n",path,strerror(errno)); 1133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev return 1; 1143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else { 1163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev read(fd, imagedata, filesize); 1173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev close(fd); 1183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_Init(); 1213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev device = LIBMTP_Get_First_Device(); 1223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if (device == NULL) { 1233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("No devices.\n"); 1243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev return 0; 1253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_filesampledata_t *albumart = LIBMTP_new_filesampledata_t(); 1283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev albumart->data = imagedata; 1293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev albumart->size = filesize; 1303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev albumart->filetype = LIBMTP_FILETYPE_JPEG; 1313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_album_t *album = LIBMTP_new_album_t(); 1333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev album->name = albumname; 1343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev album->no_tracks = idcount; 1353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev album->tracks = ids; 1363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev album->parent_id = 0; 1373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev album->storage_id = 0; 1383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev int ret = LIBMTP_Create_New_Album(device,album); 1393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if (ret == 0) { 1403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ret = LIBMTP_Send_Representative_Sample(device,album->album_id, albumart); 1413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if (ret != 0) { 1423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("Couldn't send album art\n"); 1433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_Dump_Errorstack(device); 1443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_Clear_Errorstack(device); 1453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev else { 1483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("Couldn't create album object\n"); 1493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_Dump_Errorstack(device); 1503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_Clear_Errorstack(device); 1513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_destroy_filesampledata_t(albumart); 1543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_destroy_album_t(album); 1553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev LIBMTP_Release_Device(device); 1573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev printf("OK.\n"); 1583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev return 0; 1593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} 1603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 161