Andy's CarPlayer

This is the main.c source code. It handles all the inital setup and runs the main menu. The selection of tracks, albums etc is handled in PlayTracks.c


/***************************************************************************
                          main.c  -  description
                             -------------------
    begin                : Thu Jan 27 16:10:51 GMT 2005
    copyright            : (C) 2005 by Andy
    email                : 
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#ifdef HAVE_CONFIG_H
#include 
#endif

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "Structures.h"
#include "log.h"

int failed_files = 0;
#define FALSE 0
#define TRUE 1

     int i, counter = 0, zero = 0, exists = 0, new = 0;

     MYSQL mysql;
     MYSQL_RES *res;
     MYSQL_RES *res1;
     MYSQL_ROW row;
     int t,r;

//     char *server = "localhost";
//     char *user = "andy";
//     char *password = "";
//     char *database = "mp3";
     char query[400];
     char temp[4];

 MYSQL mysql;

 int Connect_DB()
 {
   char *host = "localhost";
   char *user = "mp3";
   char *passwd = "mp3";
   char *database = "mp3";
   mysql_init(&mysql);
   if (!mysql_real_connect(&mysql, host, user, passwd, database, 0, NULL, 0))
   {
     printf("Error connecting to database.\n");
     exit(-1);
   }
   else
     printf("Connected...\n");
 }

     
 MYSQL_RES *db_query(char *query)
 {
   MYSQL_RES *res;

   res = (MYSQL_RES *)mysql_real_query(&mysql, query, (unsigned int)strlen(query));
   if (res)
   {
     log_printf(LOG_NORMAL, "db_query : Error making query (%s) : %s\n", query, mysql_error(&mysql));
     return ((MYSQL_RES *) -1);
   }
   res = mysql_store_result(&mysql);
   return (res);
 }


int main(int argc, char *argv[])
{
  FILE *masterfile = NULL;

char buffer[255], buffer1[255], filename[255];
char command[80];
int counter=0;

debug_level = LOG_NOISY_DEBUG;
  log_open("./logfile", debug_level);
  char *music_root="/mp3";
  if ((masterfile=fopen("./master","r"))==NULL)
  {
     perror("Master file not present - Creating");
     sprintf(command,"find %s -iname '*.mp3'|grep -v andy|sort>./master", music_root);
     printf("%s\n", command);
     system(command);
     if ((masterfile=fopen("./master","r"))==NULL)
     {
        perror("Master file still not present - quitting");
        exit(1);
     }
  }
  else
  {
  printf("Masterfile found.\n");
  }

  Connect_DB();
/*
  mysql_init(&mysql);

  if (!mysql_real_connect(&mysql,server ,user ,password ,database , 0, NULL, 0))
  {
     printf("Error connecting to mp3 database : %s\n", mysql_error(&mysql));
  }
  else printf("Connected...\n");
*/
  sprintf(query,"update all_songs set available=%i",FALSE);  // default all songs to unavailable.
  t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
  if (t)
  {
     printf("Error making query (UPDATE available=FALSE) : %s\n", mysql_error(&mysql));
  }
  else printf("Defaulting all tracks to unavailable\n");

  db_query("UPDATE albums SET available=0");
  db_query("UPDATE artists SET available=0");
  printf("Files processed : %-5i", counter);
  while (fgets(buffer1,256,masterfile))
  {
      strcpy(buffer,"");
      strcpy(filename,"");
      sprintf(buffer,"%s",buffer1);
      strncat(filename,buffer,strlen(buffer)-1);
      get_id3(filename);
      counter++;
      printf("\b\b\b\b\b%-5i", counter -1);
  }
  counter--;
  printf("\nTotal files processed : %i, of which %i failed to process\n",counter, failed_files);
  printf("In SQl database, %i existed, %i added\n", exists, new);



  return EXIT_SUCCESS;
}

int get_id3(char *filename)
{
  int retcode = 0;
  int raw_genre;
  char fbuf[4];
  FILE *filedes;

  char Track[30], Artist[30], Album[30], Comments[30];
  songinfo tag;

  if ( !( filedes = fopen(filename, "r") ) )
  {
    printf("Error opening file %s\n", filename);
    failed_files++;
    retcode |= 1;
  }
  else
  {
    if (fseek(filedes, -128, SEEK_END ))
    {
      printf("ERROR : Couldn't read last 128 bytes of %s\n", filename);
      retcode |= 4;   // ie. retcode = retcode | 4
    }
    else
    {
      fread(fbuf, 1, 3, filedes); fbuf[3] = '\0';
      strcpy(tag.filename, filename);

      if (!strcmp((const char *)"TAG", (const char*)fbuf))
      {
        fseek(filedes, -125, SEEK_END);
        
	fread(tag.song, 1, 30, filedes);
	mysql_real_escape_string(&mysql, Track, tag.song, strlen(tag.song));
	if (strncmp(Track, "\\", 29)) {Track[29] = "\0";}
	strcpy(tag.song, Track); tag.song[30] = '\0';

        fread(tag.artist, 1, 30, filedes);
	mysql_real_escape_string(&mysql, Artist, tag.artist, strlen(tag.artist));
	if (strncmp(Artist, "\\" , 29)) {tag.artist[29] = "\0";}
	strcpy(tag.artist, Artist); tag.artist[30] = '\0';
        
	fread(tag.album, 1, 30, filedes);
	mysql_real_escape_string(&mysql, Album, tag.album, strlen(tag.album));
	if (strncmp(Album, "\\", 29)) {Album[29] = "\0";}
	strcpy(tag.album, Album); tag.album[30] = '\0';
        
	fread(tag.raw_year, 1, 4, filedes); tag.raw_year[4] = '\0'; tag.year = atoi(tag.raw_year);
        
	fread(tag.comments, 1, 30, filedes);
	mysql_real_escape_string(&mysql, Comments, tag.comments, strlen(tag.comments));
	if (strncmp(Comments, "\\", 29)) {Comments[29] = "\0";}
	strcpy(tag.comments, Comments); tag.comments[30] = '\0';
        if (tag.comments[28] == '\0' )
        {
          tag.track[0] = tag.comments[29];
        }
        fread(tag.track, 1, 1, filedes); tag.track_num = atoi(tag.track);
        fseek(filedes,-1L,SEEK_END);

        raw_genre = fgetc(filedes);

        switch (raw_genre)
               {
               case 0:
                  strcpy(tag.genre,"Blues");
                  break;
               case 1:
                  strcpy(tag.genre,"Classic Rock");
                  break;
               case 2:
                  strcpy(tag.genre,"Country");
                  break;
               case 3:
                  strcpy(tag.genre,"Dance");
                  break;
               case 4:
                  strcpy(tag.genre,"Disco");
                  break;
               case 5:
                  strcpy(tag.genre,"Funk");
                  break;
               case 6:
                  strcpy(tag.genre,"Grunge");
                  break;
               case 7:
                  strcpy(tag.genre,"Hip-Hop");
                  break;
               case 8:
                  strcpy(tag.genre,"Jazz");
                  break;
               case 9:
                  strcpy(tag.genre,"Metal");
                  break;
               case 10:
                  strcpy(tag.genre,"New Age");
                  break;
               case 11:
                  strcpy(tag.genre,"Oldies");
                  break;
               case 12:
                  strcpy(tag.genre,"Other");
                  break;
               case 13:
                  strcpy(tag.genre,"POP");
                  break;
               case 14:
                  strcpy(tag.genre,"R&B");
                  break;
               case 15:
                  strcpy(tag.genre,"Rap");
                  break;
               case 16:
                  strcpy(tag.genre,"Reggae");
                  break;
               case 17:
                  strcpy(tag.genre,"Rock");
                  break;
               case 18:
                  strcpy(tag.genre,"Techno");
                  break;
               case 19:
                  strcpy(tag.genre,"Industrial");
                  break;
               case 20:
                  strcpy(tag.genre,"Alternative");
                  break;
               case 21:
                  strcpy(tag.genre,"Ska");
                  break;
               case 22:
                  strcpy(tag.genre,"Death Metal");
                  break;
               case 23:
                  strcpy(tag.genre,"Pranks");
                  break;
               case 24:
                  strcpy(tag.genre,"Soundtrack");
                  break;
               case 25:
                  strcpy(tag.genre,"Euro-Techno");
                  break;
               case 26:
                  strcpy(tag.genre,"Ambient");
                  break;
               case 27:
                  strcpy(tag.genre,"Trip-Hop");
                  break;
               case 28:
                  strcpy(tag.genre,"Vocal");
                  break;
               case 29:
                  strcpy(tag.genre,"Jazz&Funk");
                  break;
               case 30:
                  strcpy(tag.genre,"Fusion");
                  break;
               case 31:
                  strcpy(tag.genre,"Trance");
                  break;
               case 32:
                  strcpy(tag.genre,"Classical");
                  break;
               case 33:
                  strcpy(tag.genre,"Instrumental");
                  break;
               case 34:
                  strcpy(tag.genre,"Acid");
                  break;
               case 35:
                  strcpy(tag.genre,"House");
                  break;
               case 36:
                  strcpy(tag.genre,"Game");
                  break;
               case 37:
                  strcpy(tag.genre,"Sound Clip");
                  break;
               case 38:
                  strcpy(tag.genre,"Gospel");
                  break;
               case 39:
                  strcpy(tag.genre,"Noise");
                  break;
               case 40:
                  strcpy(tag.genre,"AlternRock");
                  break;
               case 41:
                  strcpy(tag.genre,"Bass");
                  break;
               case 42:
                  strcpy(tag.genre,"Soul");
                  break;
               case 43:
                  strcpy(tag.genre,"Punk");
                  break;
               case 44:
                  strcpy(tag.genre,"Space");
                  break;
               case 45:
                  strcpy(tag.genre,"Meditive");
                  break;
               case 46:
                  strcpy(tag.genre,"Instrumental Pop");
                  break;
               case 47:
                  strcpy(tag.genre,"Instrumental Rock");
                  break;
               case 48:
                  strcpy(tag.genre,"Ethnic");
                  break;
               case 49:
                  strcpy(tag.genre,"Gothic");
                  break;
               case 50:
                  strcpy(tag.genre,"Darkwave");
                  break;
               case 51:
                  strcpy(tag.genre,"Techno-Industrial");
                  break;
               case 52:
                  strcpy(tag.genre,"Electronic");
                  break;
               case 53:
                  strcpy(tag.genre,"Pop-folk");
                  break;
               case 54:
                  strcpy(tag.genre,"Eurodance");
                  break;
               case 55:
                  strcpy(tag.genre,"Dream");
                  break;
               case 56:
                  strcpy(tag.genre,"Southern Rock");
                  break;
               case 57:
                  strcpy(tag.genre,"Comedy");
                  break;
               case 58:
                  strcpy(tag.genre, "Cult");
                  break;
               case 59:
                  strcpy(tag.genre,"Gangsta");
                  break;
               case 60:
                  strcpy(tag.genre,"Top 40");
                  break;
               case 61:
                  strcpy(tag.genre,"Christian Rap");
                  break;
               case 62:
                  strcpy(tag.genre,"Pop/Funk");
                  break;
               case 63:
                  strcpy(tag.genre,"Jungle");
                  break;
               case 64:
                  strcpy(tag.genre,"Native American");
                  break;
               case 65:
                  strcpy(tag.genre,"Cabaret");
                  break;
               case 66:
                  strcpy(tag.genre,"New Wave");
                  break;
               case 67:
                  strcpy(tag.genre,"Psychedelic");
                  break;
               case 68:
                  strcpy(tag.genre,"Rave");
                  break;
               case 69:
                  strcpy(tag.genre,"Show Tunes");
                  break;
               case 70:
                  strcpy(tag.genre,"Trailer");
                  break;
               case 71:
                  strcpy(tag.genre,"Lo-Fi");
                  break;
               case 72:
                  strcpy(tag.genre,"Tribal");
                  break;
               case 73:
                  strcpy(tag.genre,"Acid Punk");
                  break;
               case 74:
                  strcpy(tag.genre,"Acid Jazz");
                  break;
               case 75:
                  strcpy(tag.genre,"Polka");
                  break;
               case 76:
                  strcpy(tag.genre,"Retro");
                  break;
               case 77:
                  strcpy(tag.genre,"Musical");
                  break;
               case 78:
                  strcpy(tag.genre,"Rock & Roll");
                  break;
               case 79:
                  strcpy(tag.genre,"Hard Rock");
                  break;
               case 80:
                  strcpy(tag.genre,"Folk");
                  break;
               case 81:
                  strcpy(tag.genre,"Folk/Rock");
                  break;
               case 82:
                  strcpy(tag.genre,"National Folk");
                  break;
               case 83:
                  strcpy(tag.genre,"Swing");
                  break;
               case 84:
                  strcpy(tag.genre, "Fast Fusion");
                  break;
               case 85:
                  strcpy(tag.genre,"Bebop");
                  break;
               case 86:
                  strcpy(tag.genre,"Latin");
                  break;
               case 87:
                  strcpy(tag.genre,"Revival");
                  break;
               case 88:
                  strcpy(tag.genre,"Celtic");
                  break;
               case 89:
                  strcpy(tag.genre,"Blue Grass");
                  break;
               case 90:
                  strcpy(tag.genre,"Avant Garde");
                  break;
               case 91:
                  strcpy(tag.genre,"Gothic Rock");
                  break;
               case 92:
                  strcpy(tag.genre,"Progressive Rock");
                  break;
               case 93:
                  strcpy(tag.genre,"Psychedelic Rock");
                  break;
               case 94:
                  strcpy(tag.genre,"Symphonic Rock");
                  break;
               case 95:
                  strcpy(tag.genre,"Slow Rock");
                  break;
               case 96:
                  strcpy(tag.genre,"Latin");
                  break;
               case 97:
                  strcpy(tag.genre,"Chorus");
                  break;
               case 98:
                  strcpy(tag.genre,"Easy Listening");
                  break;
               case 99:
                  strcpy(tag.genre,"Acoustic");
                  break;
               case 100:
                  strcpy(tag.genre,"Humour");
                  break;
               case 101:
                  strcpy(tag.genre, "Speech");
                  break;
               case 102:
                  strcpy(tag.genre, "Chanson");
                  break;
               case 103:
                  strcpy(tag.genre, "Opera");
                  break;
               case 104:
                  strcpy(tag.genre, "Chamber Music");
                  break;
               case 105:
                  strcpy(tag.genre, "Sonata");
                  break;
               case 106:
                  strcpy(tag.genre, "Symphony");
                  break;
               case 107:
                  strcpy(tag.genre, "Booty Bass");
                  break;
               case 108:
                  strcpy(tag.genre, "Primus");
                  break;
               case 109:
                  strcpy(tag.genre, "Porn Groove");
                  break;
               case 110:
                  strcpy(tag.genre, "Satire");
                  break;
               case 111:
                  strcpy(tag.genre, "Slow Jam");
                  break;
               case 112:
                  strcpy(tag.genre, "Club");
                  break;
               case 113:
                  strcpy(tag.genre, "Tango");
                  break;
               case 114:
                  strcpy(tag.genre, "Samba");
                  break;
               case 115:
                  strcpy(tag.genre, "Folklore");
                  break;
               case 116:
                  strcpy(tag.genre, "Ballad");
                  break;
               case 117:
                  strcpy(tag.genre, "Power Ballad");
                  break;
               case 118:
                  strcpy(tag.genre, "Rhythmic Soul");
                  break;
               case 119:
                  strcpy(tag.genre, "Freestyle");
                  break;
               case 120:
                  strcpy(tag.genre, "Duet");
                  break;
               case 121:
                  strcpy(tag.genre, "Punk Rock");
                  break;
               case 122:
                  strcpy(tag.genre, "Drum Solo");
                  break;
               case 123:
                  strcpy(tag.genre, "A Capella");
                  break;
               case 124:
                  strcpy(tag.genre, "Euro-House");
                  break;
               case 125:
                  strcpy(tag.genre, "Dance Hall");
                  break;
               case 131:
                  strcpy(tag.genre, "Indie");
                  break;
               default:
                  sprintf(tag.genre,"Unknown (%i)", raw_genre);
                  break;
               }

        trimright(tag.song);
        trimright(tag.artist);
        trimright(tag.album);
        trimright(tag.raw_year);
        trimright(tag.comments);
      }
      else
      {
        tag.song[0] = '\0';
        tag.artist[0] = '\0';
        tag.album[0] = '\0';
        strcpy(tag.genre, "Unknown (no ID3)");
        strcpy(tag.comments,"No ID3\0");
        printf("No ID3 Tag : %s\n", filename);
      }
    }
    log_printf(LOG_NOISY_DEBUG, "get_id3 : %s: %s: %s: %i: %s: %s\n", tag.song, tag.artist, tag.album, tag.year, tag.genre, tag.comments);
 update_database(tag);
 update_albums(tag);
 update_artists(tag);
  }
  fclose(filedes);
  return retcode;
}

int getline(FILE *filename, char buffer[255])
{
  char buffer1[255];

  strncpy(buffer, "\0", 255);

  if ((fgets(buffer1, 255, filename)) == NULL)
    return(1);
  strncpy(buffer, buffer1, strlen(buffer1) -1);
  return(0);
}

void update_database(songinfo songs)
   {
     char buffer[400];
     MYSQL_RES *res1;
     MYSQL_ROW row1;

//     printf("%s: %s: %s: %i: %s: %s\n", songs.song, songs.artist, songs.album, songs.year, songs.genre, songs.comments);

       sprintf(query, "select track, album, artist, genre, year, track_num from all_songs where filename = \"%s\"", songs.filename);
       log_printf(LOG_NOISY_DEBUG, "update_database :%s\n", query);
       t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
       if (t)
       {
          printf("Error making query (SELECT) : %s\n", mysql_error(&mysql));
       }

       res=mysql_store_result(&mysql);

       if ( (unsigned long)mysql_num_rows(res) == 0)
       {
          sprintf(query, "insert into all_songs (filename, track, album, artist, genre, year, available, track_num)\
                                                  values (\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",%i,%i, %i)",\
                                                     songs.filename, songs.song,\
                                                     songs.album, songs.artist,\
                                                     songs.genre, songs.year,TRUE,\
                                                     atoi(songs.track) );
          log_printf(LOG_NOISY_DEBUG, "update_database :%s\n", query);
          t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
          if (t)
          {
             printf("Error making query (INSERT) : %s\n", mysql_error(&mysql));
             printf("%s\n", query);
          }
          else new++;
       }
       else
       {
         exists++;
         sprintf(query, "update all_songs set available=%i where filename=\"%s\"", TRUE, songs.filename);
//         printf("%s\n", query);
         t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
          if (t)
          {
             printf("Error making query (UPDATE available=TRUE) : %s\n", mysql_error(&mysql));
             printf("%s\n", query);
          }
       row=mysql_fetch_row(res);
       if (strcmp(songs.song, row[0]) != 0)
       {
           log_printf(LOG_DEBUG, "%s : Song title changed to :\n",row[0], songs.filename);
           sprintf(query, "update all_songs set track=\"%s\" where filename = \"%s\"", songs.song, songs.filename);
           t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
           if (t)
           {
               printf("Error making query (UPDATE) : %s\n%s\n", query,  mysql_error(&mysql));
           }
       }

       if (strcmp(songs.album, row[1]) != 0)
       {
           log_printf(LOG_DEBUG, "%s : Song Album changed\n", songs.filename);
           sprintf(query, "update all_songs set album=\"%s\" where filename = \"%s\"", songs.album, songs.filename);
           t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
           if (t)
           {
               printf("Error making query (UPDATE) : %s\n%s\n", query, mysql_error(&mysql));
           }
       }
       
        if (strcmp(songs.artist, row[2]) != 0)
       {
           log_printf(LOG_DEBUG,"%s : Song Artist changed\n", songs.filename);
           sprintf(query, "update all_songs set artist=\"%s\" where filename = \"%s\"", songs.artist, songs.filename);
           t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
           if (t)
           {
               printf("Error making query (UPDATE) : %s\n%s\n", query, mysql_error(&mysql));
           }
       }
/*
       if (strcmp(songs.genre, row[3]) != 0)
       {
           log_printf(LOG_DEBUG, "%s : Song Genre changed\n", songs.filename);
           sprintf(query, "update all_songs set genre=\"%s\" where filename = \"%s\"", songs.genre, songs.filename);
           t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
           if (t)
           {
               printf("Error making query (UPDATE) : %s\n%s\n", query, mysql_error(&mysql));
           }
       }
     
       if (songs.track_num != (int)row[5])
       {
           log_printf(LOG_DEBUG,"%s : Song track num changed\n", songs.filename);
           sprintf(query, "update all_songs set track_num=%i where filename = %i", songs.track_num, songs.filename);
           t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
           if (t)
           {
               printf("Error making query (UPDATE) : %s\n", mysql_error(&mysql));
           }

       }
*/
             sprintf(temp, "%i",  songs.year);
       if (strcmp(temp, row[4]) != 0)
       {
           printf("%s : Song year changed\n", songs.filename);
           sprintf(query, "update all_songs set year=%i where filename = \"%s\"", songs.year, songs.filename);
           t=mysql_real_query(&mysql, query, (unsigned int) strlen(query));
           if (t)
           {
               printf("Error making query (UPDATE) : %s\n", mysql_error(&mysql));
           }
       }

       }
//     printf("Total of %-5i tracks saved.\n", number_of_tracks);

     }

 int readline(int fd, char *buf, int count)
 {
   int rc, c;

   buf[0] = 0;
   c = 0;

   struct timeval timeout;
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(fd, &fds);

   timeout.tv_sec = 0;
   timeout.tv_usec = 0;

   if (select(fd+1, &fds, NULL, NULL, &timeout))
   {
     do
     {
       rc = read(fd, buf+c, 1);
       if (rc <= 0)
        return rc - 1;

       // skip CR and/or LF at begining of line
       if (!c && (*buf == '\r' || *buf == '\n'))
         continue;
       // skip CR / LF at end of line
       if (buf[c] == 0 || buf[c] == '\r' || buf[c] == '\n')
         break;
       c++;
     } while (c < count);
   }
   buf[c] = 0;
   return c;
 }

int trimright(char *str)
 {
   char *s = str + strlen(str) - 1;
   while (s >= str && (*s == ' ' || *s == '\t'))
     *s-- = 0;
   return str;
 }

 update_albums(songinfo song)
 {
   MYSQL_RES *res;
   MYSQL_ROW row;

   char query[200];
   int number_of_rows;

   sprintf(query, "SELECT album, artist, available FROM albums WHERE album=\"%s\"", song.album);
   log_printf(LOG_NOISY_DEBUG, "update_albums : %s\n", query);
   res = db_query(query);
   number_of_rows = mysql_num_rows(res);
   if (number_of_rows ==0) // ie album has not been processed before
//   if (res == NULL)
   {
     mysql_free_result(res);
     if (strcmp(song.genre, "Speech") == 0)
       sprintf(query, "INSERT INTO albums (album, artist, available, audio_book) VALUES (\"%s\", \"%s\", %i, %i)", \
           song.album,\
           song.artist,\
           TRUE, \
           TRUE);
     else
       sprintf(query, "INSERT INTO albums (album, artist, available, audio_book) VALUES (\"%s\", \"%s\", %i, %i)", \
           song.album,\
           song.artist,\
           TRUE,\
           FALSE);
     log_printf(LOG_NOISY_DEBUG, "update_albums : %s\n", query);
     res = db_query(query);
     mysql_free_result(res);

   }
   else
   {
     row = mysql_fetch_row(res);
     if (row[1] == NULL) //ie no artist has previously been set
     {
       mysql_free_result(res);
       if (strcmp(song.genre, "Speech") == 0)
         sprintf(query, "UPDATE albums SET artist=\"%s\", available=%i, audio_book=%i WHERE album=\"%s\"", song.artist, TRUE, TRUE, song.album);
       else
         sprintf(query, "UPDATE albums SET artist=\"%s\", available=%i, audio_book=%i WHERE album=\"%s\"", song.artist, TRUE, FALSE, song.album);
       log_printf(LOG_NOISY_DEBUG, "update_albums : %s\n", query);
       res = db_query(query);
       mysql_free_result(res);
     }
     else if (strcmp(row[1], "Various") == 0)  // Already found multiple artists in album => a compilation
     {
       mysql_free_result(res);
       if (strcmp(song.genre, "Speech") == 0)
         sprintf(query, "UPDATE albums SET available=%i, audio_book=%i WHERE album=\"%s\"", TRUE, TRUE, song.album);
       else
         sprintf(query, "UPDATE albums SET available=%i, audio_book=%i WHERE album=\"%s\"", TRUE, FALSE, song.album);
       log_printf(LOG_NOISY_DEBUG, "update_albums : %s\n", query);
       res = db_query(query);
       mysql_free_result(res);
     }
     else if (strcmp(row[1], song.artist) != 0)  // Previous and current artists don't match, so set to Various album
     {
       mysql_free_result(res);
       sprintf(query, "UPDATE albums SET artist=\"Various\", available=%i WHERE album=\"%s\"", TRUE, song.album);
       log_printf(LOG_NOISY_DEBUG, "update_albums : %s\n", query);
       res = db_query(query);
       mysql_free_result(res);
     }
     else  // Album is a single artist, so simply make available
     {
       mysql_free_result(res);
       if (strcmp(song.genre, "Speech") == 0)
         sprintf(query, "UPDATE albums SET available=%i, audio_book=%i WHERE album=\"%s\"", TRUE, TRUE, song.album);
       else
        sprintf(query, "UPDATE albums SET available=%i, audio_book=%i WHERE album=\"%s\"", TRUE, FALSE, song.album);
       log_printf(LOG_NOISY_DEBUG, "update_albums : %s\n", query);
       res = db_query(query);
       mysql_free_result(res);
     }
   }
 }

  update_artists(songinfo song)
 {
   MYSQL_RES *res;
   MYSQL_ROW row;

   char query[200];
   int number_of_rows;

   sprintf(query, "SELECT artist, album, available FROM artists WHERE artist=\"%s\"", song.artist);
   log_printf(LOG_NOISY_DEBUG, "update_artists : %s\n", query);
   res = db_query(query);
   number_of_rows = mysql_num_rows(res);
   if (number_of_rows ==0) // ie artist has not been processed before
//   if (res == NULL)
   {
     mysql_free_result(res);
     sprintf(query, "INSERT INTO artists (artist, available) VALUES (\"%s\", %i)", song.artist, TRUE);
     log_printf(LOG_NOISY_DEBUG, "update_artists : %s\n", query);
     res = db_query(query);
     mysql_free_result(res);
   }
   else
   {
     row = mysql_fetch_row(res);
     if (row[1] == NULL) //ie no artist has previously been set
     {
       mysql_free_result(res);
       sprintf(query, "UPDATE artists SET available=%i WHERE artist=\"%s\"", TRUE, song.artist);
       log_printf(LOG_NOISY_DEBUG, "update_artists : %s\n", query);
       res = db_query(query);
       mysql_free_result(res);
     }
/*     else  // Album is a single artist, so simply make available
     {
       mysql_free_result(res);
       sprintf(query, "UPDATE albums SET available=%i WHERE album=\"%s\"", TRUE, song.album);
       log_printf(LOG_NOISY_DEBUG, "update_artists : %s\n", query);
       res = db_query(query);
       mysql_free_result(res);
     }
*/
   }
 }