From 3825cee0f803cea8ea7408e917800f2f6b4e535b Mon Sep 17 00:00:00 2001
From: Nikias Bassen <nikias@gmx.li>
Date: Mon, 3 Aug 2009 11:37:58 +0200
Subject: [PATCH 03/14] Speeding up artwork writing _a lot_, more to come.

---
 src/itdb_itunesdb.c |    2 +
 src/ithumb-writer.c |  179 ++++++++++++++++++++++++++++++++------------------
 2 files changed, 116 insertions(+), 65 deletions(-)

diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c
index 9611c6b..836ca25 100644
--- a/src/itdb_itunesdb.c
+++ b/src/itdb_itunesdb.c
@@ -6180,7 +6180,9 @@ gboolean itdb_write_file (Itdb_iTunesDB *itdb, const gchar *filename,
      * to its final value to write properly on nano video/ipod classics
      */
     if (itdb_device_supports_artwork (itdb->device)) {
+	printf("writing artwork\n");
 		ipod_write_artwork_db (itdb);
+	printf("done\n");
     }
 #endif
 
diff --git a/src/ithumb-writer.c b/src/ithumb-writer.c
index 2360adf..ea267a9 100644
--- a/src/ithumb-writer.c
+++ b/src/ithumb-writer.c
@@ -58,6 +58,8 @@ struct _iThumbWriter {
 	off_t cur_offset;
 	FILE *f;
         gchar *mountpoint;
+	gchar *artwork_dir;
+	gchar *photos_thumb_dir;
         gchar *filename;
         gint current_file_index;
 	const Itdb_ArtworkFormat *img_info;
@@ -654,74 +656,23 @@ static char *get_ithmb_filename (iThumbWriter *writer)
 }
 
 static char *
-ipod_image_get_ithmb_filename (const char *mount_point, gint format_id, gint index, DbType db_type ) 
+ipod_image_get_ithmb_filename (const char *ithmb_dir, gint format_id, gint index ) 
 {
-	gchar *artwork_dir = NULL, *filename, *buf;
+	gchar *filename, *buf;
 
-	g_return_val_if_fail (mount_point, NULL);
-	switch( db_type ) {
-	case DB_TYPE_PHOTO:
-		artwork_dir = itdb_get_photos_thumb_dir (mount_point);
-		if (!artwork_dir)
-		{
-			/* attempt to create Thumbs dir */
-			gchar *photos_dir = itdb_get_photos_dir (mount_point);
-			gchar *dir;
-			if (!photos_dir)
-			{   /* give up */
-				return NULL;
-			}
-			dir = g_build_filename (photos_dir, "Thumbs", NULL);
-			mkdir (dir, 0777);
-			g_free (dir);
-			g_free (photos_dir);
-
-			/* try again */
-			artwork_dir = itdb_get_photos_thumb_dir (mount_point);
-			if (!artwork_dir)
-			{   /* give up */
-				return NULL;
-			}
-		}
-		break;
-	case DB_TYPE_ITUNES:
-	artwork_dir = itdb_get_artwork_dir (mount_point);
-	if (!artwork_dir)
-	{
-		/* attempt to create Artwork dir */
-		gchar *control_dir = itdb_get_control_dir (mount_point);
-		gchar *dir;
-		if (!control_dir)
-		{   /* give up */
-			return NULL;
-		}
-		dir = g_build_filename (control_dir, "Artwork", NULL);
-		mkdir (dir, 0777);
-		g_free (dir);
-		g_free (control_dir);
-
-		/* try again */
-		artwork_dir = itdb_get_artwork_dir (mount_point);
-		if (!artwork_dir)
-		{   /* give up */
-			return NULL;
-		}
-	}
-	}
+	g_return_val_if_fail (ithmb_dir, NULL);
 
 	buf = g_strdup_printf ("F%d_%d.ithmb", format_id, index);
-
-	filename = itdb_get_path (artwork_dir, buf);
+	filename = itdb_get_path (ithmb_dir, buf);
 
 	/* itdb_get_path() only returns existing paths */
 	if (!filename)
 	{
-	    filename = g_build_filename (artwork_dir, buf, NULL);
+	    filename = g_build_filename (ithmb_dir, buf, NULL);
 	}
 /*	printf ("%s %s\n", buf, filename);*/
 
 	g_free (buf);
-        g_free (artwork_dir);
 	return filename;
 }
 
@@ -1095,11 +1046,21 @@ ithumb_writer_update (iThumbWriter *writer)
 	/* increment index for filename */
 	++writer->current_file_index;
 
-	writer->filename =
-	    ipod_image_get_ithmb_filename (writer->mountpoint, 
-					   writer->img_info->format_id,
-					   writer->current_file_index, 
-					   writer->db_type);
+	switch (writer->db_type) {
+	    case DB_TYPE_PHOTO:
+		writer->filename =
+			ipod_image_get_ithmb_filename (writer->photos_thumb_dir,
+						writer->img_info->format_id,
+						writer->current_file_index);
+		break;
+	    case DB_TYPE_ITUNES:
+		writer->filename =
+			ipod_image_get_ithmb_filename (writer->artwork_dir,
+						writer->img_info->format_id,
+						writer->current_file_index);
+		break;
+	}
+
 	if (writer->filename == NULL)
 	{
 	    return FALSE;
@@ -1154,10 +1115,65 @@ ithumb_writer_free (iThumbWriter *writer)
 	    }
 	}
 	g_free (writer->filename);
+	g_free (writer->photos_thumb_dir);
+	g_free (writer->artwork_dir);
 	g_free (writer->mountpoint);
 	g_free (writer);
 }
 
+static gchar *ithumb_get_artwork_dir (const char *mount_point)
+{
+	gchar *artwork_dir;
+
+	g_return_val_if_fail (mount_point, NULL);
+
+	artwork_dir = itdb_get_artwork_dir (mount_point);
+	if (!artwork_dir) {
+		/* attempt to create Artwork dir */
+		gchar *control_dir = itdb_get_control_dir (mount_point);
+		gchar *dir;
+		if (!control_dir)
+		{   /* give up */
+			return NULL;
+		}
+		dir = g_build_filename (control_dir, "Artwork", NULL);
+		mkdir (dir, 0777);
+		g_free (dir);
+		g_free (control_dir);
+
+		/* try again */
+		artwork_dir = itdb_get_artwork_dir (mount_point);
+	}
+	return artwork_dir;
+}
+
+static gchar *ithumb_get_photos_thumb_dir(const char *mount_point)
+{
+	gchar *photos_thumb_dir;
+
+	g_return_val_if_fail (mount_point, NULL);
+
+	photos_thumb_dir = itdb_get_photos_thumb_dir (mount_point);
+	if (!photos_thumb_dir) {
+	    /* attempt to create Thumbs dir */
+	    gchar *photos_dir = itdb_get_photos_dir (mount_point);
+	    gchar *dir;
+	    if (!photos_dir) {   /* give up */
+		return NULL;
+	    }
+	    dir = g_build_filename (photos_dir, "Thumbs", NULL);
+	    mkdir (dir, 0777);
+	    g_free (dir);
+	    g_free (photos_dir);
+
+	    /* try again */
+	    photos_thumb_dir = itdb_get_photos_thumb_dir (mount_point);
+	    if (!photos_thumb_dir) {   /* give up */
+		return NULL;
+	    }
+	}
+	return photos_thumb_dir;
+}
 
 static iThumbWriter *
 ithumb_writer_new (const char *mount_point,
@@ -1173,7 +1189,22 @@ ithumb_writer_new (const char *mount_point,
 
 	writer->byte_order = byte_order;
 	writer->db_type = db_type;
+	/* TODO this hopefully can be removed soon */
 	writer->mountpoint = g_strdup (mount_point);
+	/* get artwork directory */
+	writer->artwork_dir = ithumb_get_artwork_dir (mount_point);
+	if (!writer->artwork_dir)
+	{   /* give up */
+		ithumb_writer_free(writer);
+		return NULL;
+	}
+	/* get photos thumb directory */
+	writer->photos_thumb_dir = ithumb_get_photos_thumb_dir (mount_point);
+	if (!writer->photos_thumb_dir) {   /* give up */
+		ithumb_writer_free(writer);
+		return NULL;
+	}
+
 	writer->current_file_index = 0;
 
 	if (!ithumb_writer_update (writer))
@@ -1402,15 +1433,21 @@ ithmb_rearrange_existing_thumbnails (Itdb_DB *db,
     gint i;
     gchar *filename;
     const gchar *mountpoint;
+    gchar *photos_thumb_dir, *artwork_dir;
 
     g_return_val_if_fail (db, FALSE);
     g_return_val_if_fail (info, FALSE);
     g_return_val_if_fail (db_get_device(db), FALSE);
 
     mountpoint = db_get_mountpoint (db);
-
     g_return_val_if_fail (mountpoint, FALSE);
 
+    artwork_dir = ithumb_get_artwork_dir(mountpoint);
+    g_return_val_if_fail (artwork_dir, FALSE);
+
+    photos_thumb_dir = ithumb_get_photos_thumb_dir(mountpoint);
+    g_return_val_if_fail (photos_thumb_dir, FALSE);
+
     filenamehash = g_hash_table_new_full (g_str_hash, g_str_equal, 
 					  g_free, NULL);
 
@@ -1489,10 +1526,19 @@ ithmb_rearrange_existing_thumbnails (Itdb_DB *db,
 
     for (i=0; i<50; ++i)
     {
-	filename = ipod_image_get_ithmb_filename (mountpoint,
+	filename = NULL;
+	switch (db->db_type) {
+	    case DB_TYPE_PHOTO:
+		filename = ipod_image_get_ithmb_filename (photos_thumb_dir,
 						  info->format_id,
-						  i,
-						  db->db_type);
+						  i);
+		break;
+	    case DB_TYPE_ITUNES:
+		filename = ipod_image_get_ithmb_filename (artwork_dir,
+						  info->format_id,
+						  i);
+		break;
+	}
 	if (g_file_test (filename, G_FILE_TEST_EXISTS))
 	{
 	    if (g_hash_table_lookup (filenamehash, filename) == NULL)
@@ -1517,6 +1563,9 @@ ithmb_rearrange_existing_thumbnails (Itdb_DB *db,
 				 ithumb_rearrange_thumbnail_file, &result);
     g_hash_table_destroy (filenamehash);
 
+    g_free(artwork_dir);
+    g_free(photos_thumb_dir);
+
     return result;
 }
 
-- 
1.6.4.4

