1 /**
2 * \file albumart.c
3 * Example program to send album art.
4 *
5 * Copyright (C) 2006 Andy Kelk <andy@mopoke.co.uk>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
21 */
22 #include "config.h"
23 #include "common.h"
24 #include "string.h"
25 #include <stdlib.h>
26 #include <limits.h>
27 #include <unistd.h>
28 #include <fcntl.h>
29 #include <errno.h>
30 #include <sys/stat.h>
31 #include <sys/types.h>
32 #ifdef HAVE_SYS_UIO_H
33 #include <sys/uio.h>
34 #endif
35
usage(void)36 static void usage(void) {
37 printf("Usage: albumart -i <fileid/trackid> -n <albumname> <imagefile>\n");
38 exit(0);
39 }
40
main(int argc,char ** argv)41 int main (int argc, char **argv) {
42 int opt;
43 extern int optind;
44 extern char *optarg;
45 LIBMTP_mtpdevice_t *device = NULL;
46 int idcount = 0;
47 int fd;
48 uint32_t *ids = NULL;
49 uint32_t *tmp = NULL;
50 uint64_t filesize;
51 char *imagedata = NULL;
52 char *albumname = NULL;
53 char *path = NULL;
54 char *rest;
55 struct stat statbuff;
56
57 fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n");
58
59 while ( (opt = getopt(argc, argv, "hn:i:")) != -1 ) {
60 switch (opt) {
61 case 'h':
62 usage();
63 case 'i':
64 idcount++;
65 if ((tmp = realloc(ids, sizeof(uint32_t) * (idcount))) == NULL) {
66 printf("realloc failed\n");
67 return 1;
68 }
69 ids = tmp;
70 ids[(idcount-1)] = strtoul(optarg, &rest, 0);
71 break;
72 case 'n':
73 albumname = strdup(optarg);
74 break;
75 default:
76 usage();
77 }
78 }
79 argc -= optind;
80 argv += optind;
81
82 if ( argc != 1 ) {
83 printf("You need to pass a filename.\n");
84 usage();
85 }
86
87 if ( albumname == NULL) {
88 printf("You need to supply an album name.\n");
89 usage();
90 }
91
92 if (idcount == 0) {
93 printf("You need to supply one or more track IDs\n");
94 usage();
95 }
96
97 path = argv[0];
98
99 if ( stat(path, &statbuff) == -1 ) {
100 fprintf(stderr, "%s: ", path);
101 perror("stat");
102 exit(1);
103 }
104 filesize = (uint64_t) statbuff.st_size;
105 imagedata = malloc(filesize * sizeof(uint8_t));
106
107 #ifdef __WIN32__
108 if ( (fd = open(path, O_RDONLY|O_BINARY) == -1) ) {
109 #else
110 if ( (fd = open(path, O_RDONLY)) == -1) {
111 #endif
112 printf("Couldn't open image file %s (%s)\n",path,strerror(errno));
113 return 1;
114 }
115 else {
116 read(fd, imagedata, filesize);
117 close(fd);
118 }
119
120 LIBMTP_Init();
121 device = LIBMTP_Get_First_Device();
122 if (device == NULL) {
123 printf("No devices.\n");
124 return 0;
125 }
126
127 LIBMTP_filesampledata_t *albumart = LIBMTP_new_filesampledata_t();
128 albumart->data = imagedata;
129 albumart->size = filesize;
130 albumart->filetype = LIBMTP_FILETYPE_JPEG;
131
132 LIBMTP_album_t *album = LIBMTP_new_album_t();
133 album->name = albumname;
134 album->no_tracks = idcount;
135 album->tracks = ids;
136 album->parent_id = 0;
137 album->storage_id = 0;
138 int ret = LIBMTP_Create_New_Album(device,album);
139 if (ret == 0) {
140 ret = LIBMTP_Send_Representative_Sample(device,album->album_id, albumart);
141 if (ret != 0) {
142 printf("Couldn't send album art\n");
143 LIBMTP_Dump_Errorstack(device);
144 LIBMTP_Clear_Errorstack(device);
145 }
146 }
147 else {
148 printf("Couldn't create album object\n");
149 LIBMTP_Dump_Errorstack(device);
150 LIBMTP_Clear_Errorstack(device);
151 }
152
153 LIBMTP_destroy_filesampledata_t(albumart);
154 LIBMTP_destroy_album_t(album);
155
156 LIBMTP_Release_Device(device);
157 printf("OK.\n");
158 return 0;
159 }
160
161