diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test-photos.c | 351 |
1 files changed, 287 insertions, 64 deletions
diff --git a/tests/test-photos.c b/tests/test-photos.c index a63d51b..36c3bf5 100644 --- a/tests/test-photos.c +++ b/tests/test-photos.c @@ -31,6 +31,34 @@ #include <gdk-pixbuf/gdk-pixbuf.h> #include <glib/gi18n-lib.h> +static void usage (int argc, char **argv) +{ +/* gchar *name = argv[0];*/ + gchar *name = "test-photos"; + + g_print (_("Usage to add photos:\n %s add <mountpoint> <albumname> [<filename(s)>]\n <albumname> should be set to 'NULL' to add photos to the master photo album\n (Photo Library) only. If you don't specify any filenames an empty album will\n be created.\n"), name); + g_print (_("Usage to dump all photos to <output_dir>:\n %s dump <mountpoint> <output_dir>\n"), name); + g_print (_("Usage to list all photos IDs to stdout:\n %s list <mountpoint>\n"), name); + g_print (_("Usage to remove photo IDs from Photo Library:\n %s remove <mountpoint> <albumname> [<ID(s)>]\n <albumname> should be set to 'NULL' to to remove photos from the iPod\n altogether. If you don't specify any IDs, the photoalbum will be removed\n instead.\n WARNING: IDs may change when writing the PhotoDB file.\n"), name); +} + +/* Retrieve the photo whose ID is @id */ +static Itdb_Artwork *get_photo_by_id (Itdb_PhotoDB *db, guint32 id) +{ + GList *gl; + + g_return_val_if_fail (db, NULL); + + for (gl=db->photos; gl; gl=gl->next) + { + Itdb_Artwork *photo = gl->data; + g_return_val_if_fail (photo, NULL); + + if (photo->id == id) return photo; + } + return NULL; +} + static void save_itdb_thumb (Itdb_PhotoDB *itdb, Itdb_Thumb *thumb, const gchar *filename) @@ -69,24 +97,6 @@ dump_thumbs (Itdb_PhotoDB *db, Itdb_Artwork *artwork, } static void -dump_artwork (Itdb_PhotoDB *db, gint photo_id, - const gchar *album_name, const gchar *dir) -{ - GList *it; - - for (it = db->photos; it != NULL; it = it->next) { - Itdb_Artwork *artwork; - - artwork = (Itdb_Artwork *)it->data; - g_return_if_fail (artwork); - if( artwork->id == photo_id ) { - dump_thumbs (db, artwork, album_name, dir); - break; - } - } -} - -static void dump_albums (Itdb_PhotoDB *db, const gchar *dir) { GList *it; @@ -99,91 +109,304 @@ dump_albums (Itdb_PhotoDB *db, const gchar *dir) g_return_if_fail (album); for (it2 = album->members; it2 != NULL; it2 = it2->next) { - gint photo_id = GPOINTER_TO_INT(it2->data); - dump_artwork (db, photo_id, album->name, dir); + Itdb_Artwork *photo = it2->data; + dump_thumbs (db, photo, album->name, dir); } } } -int -main (int argc, char **argv) + +static int do_dump (int argc, char **argv) +{ + GError *error = NULL; + Itdb_PhotoDB *db; + + if (argc != 4) + { + g_print (_("Wrong number of command line arguments.\n")); + usage (argc, argv); + return 1; + } + + if (!g_file_test (argv[3], G_FILE_TEST_EXISTS)) + { + if (mkdir (argv[3], 0777) == -1) + { + g_print (_("Error creating '%s' (mkdir)\n"), argv[3]); + return 1; + } + } + if (!g_file_test (argv[3], G_FILE_TEST_IS_DIR)) + { + g_print (_("Error: '%s' is not a directory\n"), argv[3]); + return 1; + } + + db = itdb_photodb_parse (argv[2], &error); + if (db == NULL) + { + if (error) + { + g_print (_("Error reading iPod photo database (%s).\n"), error->message); + g_error_free (error); + error = NULL; + } + else + { + g_print (_("Error reading iPod photo database.\n")); + } + return 1; + } + dump_albums (db, argv[3]); + itdb_photodb_free (db); + return 0; +} + +static int do_list (int argc, char **argv) +{ + GError *error = NULL; + Itdb_PhotoDB *db; + GList *gl_album; + + + if (argc != 3) + { + g_print (_("Insufficient number of command line arguments.\n")); + usage (argc, argv); + return 1; + } + + db = itdb_photodb_parse (argv[2], &error); + if (db == NULL) + { + if (error) + { + g_print (_("Error reading iPod photo database (%s).\n"), error->message); + g_error_free (error); + error = NULL; + } + else + { + g_print (_("Error reading iPod photo database.\n")); + } + return 1; + } + + for (gl_album=db->photoalbums; gl_album; gl_album=gl_album->next) + { + GList *gl_photo; + Itdb_PhotoAlbum *album = gl_album->data; + g_return_val_if_fail (album, 1); + + g_print ("%s: ", album->name?album->name:_("<Unnamed>")); + + for (gl_photo=album->members; gl_photo; gl_photo=gl_photo->next) + { + Itdb_Artwork *photo = gl_photo->data; + g_return_val_if_fail (photo, 1); + + g_print ("%d ", photo->id); + } + if (g_list_length (album->members) > 0) + { + g_print ("\n"); + } + else + { + g_print (_("<No members>\n")); + } + } + itdb_photodb_free (db); + return 0; +} + + +static int do_add (int argc, char **argv) { GError *error = NULL; + Itdb_PhotoAlbum *album = NULL; Itdb_PhotoDB *db; gint i; - if (argc < 4) { - g_print (_("Usage to add photos:\n")); - g_print (_("%s <mountpoint> <albumname> <filename(s)>\n"), argv[0]); - g_print (_("albumname should be set to 'master' to add photos to the master photo album\n")); - g_print (_("\n")); - g_print (_("Usage to dump all photos to <output_dir>:\n")); - g_print (_("%s dump <mountpoint> <output_dir>\n"), argv[0]); - return 1; + if (argc < 4) + { + g_print (_("Insufficient number of command line arguments.\n")); + usage (argc, argv); + return 1; } - setlocale (LC_ALL, ""); - g_type_init (); - if (strcmp (argv[1], "dump") == 0) + db = itdb_photodb_parse (argv[2], &error); + if (db == NULL) { - if (!g_file_test (argv[3], G_FILE_TEST_EXISTS)) + if (error) { - if (mkdir (argv[3], 0777) == -1) - { - g_print (_("Error creating '%s' (mkdir)\n"), argv[3]); - return 1; - } + g_print (_("Error reading iPod photo database (%s).\nWill attempt to create a new database.\n"), error->message); + g_error_free (error); + error = NULL; } - if (!g_file_test (argv[3], G_FILE_TEST_IS_DIR)) + else { - g_print (_("Error: '%s' is not a directory\n"), argv[3]); - return 1; + g_print (_("Error reading iPod photo database, will attempt to create a new database\n")); + } + db = itdb_photodb_create (argv[2]); + } + + /* Find or create specified photoalbum */ + if (strcmp (argv[3], "NULL") != 0) + { + album = itdb_photodb_photoalbum_by_name (db, argv[3]); + if (!album) + { + album = itdb_photodb_photoalbum_create (db, argv[3], -1); } + } - db = itdb_photodb_parse (argv[2], &error); - if (db == NULL) + for (i=4; i<argc; ++i) + { + Itdb_Artwork *photo; + + photo = itdb_photodb_add_photo (db, argv[i], &error); + if (photo == NULL) { if (error) { - g_print (_("Error reading iPod photo database (%s).\n"), error->message); + g_print (_("Error adding photo (%s) to photo database: %s\n"), + argv[i], error->message); g_error_free (error); error = NULL; } - else + } + else + { + if (album) { - g_print (_("Error reading iPod photo database.\n")); + itdb_photodb_photoalbum_add_photo (db, album, photo); } + } + } + + itdb_photodb_write (db, NULL); + itdb_photodb_free (db); + return 0; +} + + +static int do_remove (int argc, char **argv) +{ + GError *error = NULL; + Itdb_PhotoDB *db; + Itdb_PhotoAlbum *album = NULL; + + if (argc < 4) + { + g_print (_("Insufficient number of command line arguments.\n")); + usage (argc, argv); + return 1; + } + + db = itdb_photodb_parse (argv[2], &error); + if (db == NULL) + { + if (error) + { + g_print (_("Error reading iPod photo database (%s).\n"), + error->message); + g_error_free (error); + error = NULL; + } + else + { + g_print (_("Error reading iPod photo database")); + } + return 1; + } + + /* Find specified photoalbum */ + if (strcmp (argv[3], "NULL") != 0) + { + album = itdb_photodb_photoalbum_by_name (db, argv[3]); + if (!album) + { + g_print (_("Specified album '%s' not found. Aborting.\n"), + argv[3]); + itdb_photodb_free (db); + return 1; + } + } + + if (argc == 4) + { + /* Remove photoalbum altogether, but preserve pics */ + if (album == NULL) + { + g_print (_("Cannot remove Photo Libarary playlist. Aborting.\n")); + itdb_photodb_free (db); return 1; } - dump_albums (db, argv[3]); - itdb_photodb_free (db); + itdb_photodb_photoalbum_remove (db, album, FALSE); } else { - db = itdb_photodb_parse (argv[1], &error); - if (db == NULL) + /* Remove specified pictures */ + int i; + for (i=4; i<argc; ++i) { - if (error) + Itdb_Artwork *photo; + guint32 id; + + id = g_strtod (argv[i], NULL); + + photo = get_photo_by_id (db, id); + + if (photo == NULL) { - g_print (_("Error reading iPod photo database (%s).\nWill attempt to create a new database.\n"), error->message); - g_error_free (error); - error = NULL; + g_print (_("Error: could not find photo with ID <%d>. Skipping...\n"), + id); } else { - g_print (_("Error reading iPod photo database, will attempt to create a new database\n")); + itdb_photodb_remove_photo (db, album, photo); } - db = itdb_photodb_new (); - itdb_device_set_mountpoint (db->device, argv[1]); - } - for (i=3; i<argc; ++i) - { - itdb_photodb_add_photo (db, argv[2], argv[i]); } + } + + itdb_photodb_write (db, NULL); + itdb_photodb_free (db); + return 0; +} + + - itdb_photodb_write (db, NULL); - itdb_photodb_free (db); +int +main (int argc, char **argv) +{ + if (argc < 2) + { + g_print (_("Insufficient number of command line arguments.\n")); + usage (argc, argv); + return 1; + } + setlocale (LC_ALL, ""); + g_type_init (); + + if (strcmp (argv[1], "dump") == 0) + { + return do_dump (argc, argv); + } + if (strcmp (argv[1], "add") == 0) + { + return do_add (argc, argv); + } + if (strcmp (argv[1], "list") == 0) + { + return do_list (argc, argv); + } + if (strcmp (argv[1], "remove") == 0) + { + return do_remove (argc, argv); } + g_print (_("Unknown command '%s'\n"), argv[1]); + usage (argc, argv); return 0; } |
