00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "iT2M.h"
00015
00016
00017
00018
00019
00020
00021 int is_file (const char *filename) {
00022 struct stat buf;
00023 if (stat (filename, &buf) == -1)
00024 return (0);
00025 if (S_ISREG (buf.st_mode))
00026 return (1);
00027 return (0);
00028 }
00029
00030
00031 void usage(){
00032 printf("\n\t*************** it2m: Usage ***************\nit2m itunes.xml dbpassword user databasename port\nit2m ([itunes.xml]|default='iTunes Music Library.xml') dbpassword \n\t[ user [(database|default='mythconverg')] [(port|default=3306)] ]\n* VerySimple Use : YourPassWord\n* Simple : YourItunesMusicLin.xml YourPassWord\n* Custom : YourItunesMusicLin.xml YourPassWord YouUser\n* Default : \"iTunes Music Library.xml\" YourPass root mythconverg 3306\n\ni2tm : writed by Sonique :: Cedric FERRY :: http://sonique54.free.fr.\n");
00033 return;
00034 }
00035
00036
00037
00038 int UpdateMythConverg(char * artname, char * albname, char * songname, char * rating, char * count){
00039
00040 MYSQL_RES *res;
00041 MYSQL_ROW row;
00042 int t;
00043 int rate = atoi(rating)/10;
00044 int numplays = atoi(count);
00045 int num_rows = 0;
00046 char query [1024] ="";
00047 sprintf(query,"UPDATE music_songs SET rating = %d, numplays = %d WHERE music_songs.artist_id IN (SELECT artist_id FROM music_artists WHERE artist_name LIKE \"%s%%\") AND music_songs.album_id IN (SELECT album_id FROM music_albums WHERE album_name LIKE \"%s%%\") AND music_songs.name LIKE \"%s%%\" ",rate, numplays, artname, albname, songname);
00048
00049
00050 t=mysql_real_query(mysql, query, strlen(query));
00051 if (t) {
00052 printf("UpdateMythConverg request error : %s \n", mysql_error(mysql) );
00053 } else {
00054 if(mysql_affected_rows(mysql) < 1){
00055
00056 printf("\t\t%s - %s - %s cannot be found OR already up to date.\n", artname, albname, songname);
00057 } else {
00058
00059 printf("%s - %s - %s Have been UPDATED.\n",artname, albname, songname);
00060 }
00061 }
00062 }
00063
00064
00065
00066 int scan_itms (const char *filename ){
00067
00068
00069 xmlDocPtr xmlperms_doc = NULL;
00070 xmlXPathContextPtr xmlperms_context = NULL;
00071 xmlXPathObjectPtr xmlobject;
00072
00073 const char path_template[] = "/plist/dict/dict/dict/*";
00074
00075 char *path;
00076
00077 if (!filename){
00078 fprintf (stderr, "%s:%d File not found\n", __FILE__, __LINE__);
00079 return (0);
00080 }
00081
00082 xmlperms_doc = xmlParseFile (filename);
00083
00084 if (!xmlperms_doc) {
00085 fprintf (stderr, "%s:%d Could not parse the document\n", __FILE__,__LINE__);
00086 return (0);
00087 }
00088
00089 xmlXPathInit();
00090
00091 xmlperms_context = xmlXPathNewContext (xmlperms_doc);
00092
00093 xmlobject = xmlXPathEval (path_template, xmlperms_context);
00094
00095
00096 char * albname = NULL;
00097 char * artname = NULL;
00098 char * rating = NULL;
00099 char * songname = NULL;
00100 char * count = NULL;
00101
00102
00103 if ( (xmlobject->type == XPATH_NODESET) &&
00104 (xmlobject->nodesetval) ){
00105
00106 if (xmlobject->nodesetval->nodeNr){
00107 xmlNodePtr node, node2;
00108 int i=0;
00109
00110 for(i=0; i<xmlobject->nodesetval->nodeNr-1; i++){
00111
00112 node = xmlobject->nodesetval->nodeTab[i];
00113 node2 = xmlobject->nodesetval->nodeTab[i+1];
00114 xmlChar *pathact1 = xmlGetNodePath (node);
00115
00116
00117 if( node->type == XML_ELEMENT_NODE &&
00118 (xmlobject->nodesetval) &&
00119 strcmp( node->name, "key" ) == 0 ){
00120
00121
00122 if( strcmp( (char*)node->children->content,"Track ID")==0 ){
00123 free(albname);
00124 free(artname);
00125 free(rating);
00126 free(songname);
00127 free(count);
00128 artname = NULL;
00129 albname = NULL;
00130 songname = NULL;
00131 rating = NULL;
00132 count = NULL;
00133 }
00134
00135 if( strcmp( (char*)node->children->content,"Name")==0 ){
00136 if(strcmp( node2->name,"string") == 0) {
00137 songname = strdup(node2->children->content);
00138 }
00139 }
00140
00141 if(strcmp((char *) node->children->content,"Album")==0 ) {
00142 if(strcmp(node2->name,"string") == 0){
00143 albname = strdup(node2->children->content);
00144 }
00145 }
00146
00147 if(strcmp((char *) node->children->content,"Artist")==0 ){
00148 if(strcmp(node2->name,"string") == 0){
00149 artname = strdup(node2->children->content);
00150 }
00151 }
00152
00153 if(strcmp((char *) node->children->content,"Play Count")==0 ){
00154 if(strcmp(node2->name,"integer") == 0){
00155 count = strdup(node2->children->content);
00156 }
00157 }
00158
00159 if(strcmp((char *) node->children->content,"Rating")==0 ){
00160 if(strcmp(node2->name,"integer") == 0){
00161 rating = strdup(node2->children->content);
00162 }
00163 }
00164
00165
00166 if(rating != NULL && artname != NULL && albname != NULL && songname != NULL ){
00167
00168 if(count == NULL){ count = strdup("0"); }
00169
00170 UpdateMythConverg(artname, albname, songname, rating, count);
00171
00172 free(albname);
00173 free(artname);
00174 free(rating);
00175 free(songname);
00176 free(count);
00177 artname = NULL;
00178 albname = NULL;
00179 songname = NULL;
00180 rating = NULL;
00181 count = NULL;
00182 }
00183 }
00184 }
00185
00186 free(albname);
00187 free(artname);
00188 free(rating);
00189 free(songname);
00190 free(count);
00191 }
00192 }
00193
00194 xmlXPathFreeObject (xmlobject);
00195 xmlXPathFreeContext (xmlperms_context);
00196 return;
00197 }
00198
00199
00200
00201
00202
00203
00204
00205 main(int argc, char **argv)
00206 {
00207 char * file;
00208 char * pass;
00209 char * user;
00210 char * dbname;
00211 int port=0;
00212 int i = 1;
00213
00214 mysql=mysql_init(NULL);
00215
00216
00217 if(!is_file (argv[i]) && !is_file ("iTunes Music Library.xml") ){
00218 printf("Error : No such file to analyse, %s or iTunes Music Library.xml not found.\n\n", argv[0]);
00219 usage();
00220 exit(-1);
00221 } else if(is_file (argv[i])){
00222 file=strdup(argv[i]);
00223 i++;
00224 } else {
00225 file=strdup("iTunes Music Library.xml");
00226 }
00227
00228
00229
00230
00231 if(argv[i] == NULL){
00232 printf("Error : You must specify the MySQL password.\n");
00233 usage();
00234 exit(-1);
00235 } else {
00236 pass=strdup(argv[i]);
00237 i++;
00238 }
00239
00240
00241 if(argv[i]==NULL){
00242 printf("* No user given in argument, root will be used.\n");
00243 user=strdup("root");
00244 } else {
00245 user=strdup(argv[i]);
00246 i++;
00247 }
00248
00249
00250 if(argv[i]==NULL){
00251 printf("* No dbname given in argument, mythconverg will be used.\n");
00252 dbname=strdup("mythconverg");
00253 } else {
00254 dbname=strdup(argv[i]);
00255 i++;
00256 }
00257
00258
00259
00260 if(argv[i]==NULL){
00261 printf("* No port given in argument, 3306 will be used.\n");
00262 port=3306;
00263 } else {
00264 port=atoi(argv[i]);
00265 }
00266
00267 printf(" Itunes Music File: %s \n Password: %s \n User: %s \n dbname: %s \n port: %d \n", file, pass, user, dbname, port);
00268
00269
00270
00271 if (!mysql_real_connect(mysql,"localhost",user,pass,dbname,port,NULL,0)) {
00272 printf("Connection error : %s \n", mysql_error(mysql) );
00273 exit(1) ;
00274 } else {
00275 printf("MySQL aviable ...\n");
00276 }
00277
00278
00279 xmlDocPtr xmldoc = NULL;
00280 xmldoc = xmlParseFile (file);
00281 if (!xmldoc){
00282 printf("%s isn't an XML file.\n",file);
00283
00284 exit (EXIT_FAILURE);
00285 }
00286
00287 scan_itms(file);
00288
00289 xmlFreeDoc (xmldoc);
00290 mysql_close(mysql);
00291 exit (EXIT_SUCCESS);
00292 }