PIKApp/libpikathumb/pika-thumbnail-list.c

252 lines
6.1 KiB
C
Raw Normal View History

2023-09-26 00:35:21 +02:00
/*
* pika-thumbnail-list.c
*/
#include <string.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <libpikathumb/pikathumb.h>
#define STATE_NONE -1
#define STATE_ERROR -2
static gboolean parse_option_state (const gchar *option_name,
const gchar *value,
gpointer data,
GError **error);
static gboolean parse_option_path (const gchar *option_name,
const gchar *value,
gpointer data,
GError **error);
static void process_folder (const gchar *folder);
static void process_thumbnail (const gchar *filename);
static PikaThumbState option_state = STATE_NONE;
static gboolean option_verbose = FALSE;
static gchar *option_path = NULL;
static const GOptionEntry main_entries[] =
{
{
"state", 's', 0,
G_OPTION_ARG_CALLBACK, parse_option_state,
"Filter by thumbnail state "
"(unknown|remote|folder|special|not-found|exists|old|failed|ok|error)",
"<state>"
},
{
"path", 'p', 0,
G_OPTION_ARG_CALLBACK, parse_option_path,
"Filter by original file's path",
"<path>"
},
{
"verbose", 'v', 0,
G_OPTION_ARG_NONE, &option_verbose,
"Print additional info per matched file", NULL
},
{ NULL }
};
gint
main (gint argc,
gchar *argv[])
{
GOptionContext *context;
GDir *dir;
const gchar *thumb_folder;
const gchar *folder;
GError *error = NULL;
pika_thumb_init ("pika-thumbnail-list", NULL);
thumb_folder = pika_thumb_get_thumb_base_dir ();
context = g_option_context_new (NULL);
g_option_context_add_main_entries (context, main_entries, NULL);
if (! g_option_context_parse (context, &argc, &argv, &error))
{
g_printerr ("%s\n", error->message);
return -1;
}
dir = g_dir_open (thumb_folder, 0, &error);
if (! dir)
g_error ("Error opening %s: %s", thumb_folder, error->message);
while ((folder = g_dir_read_name (dir)))
{
gchar *filename;
filename = g_build_filename (thumb_folder, folder, NULL);
if (g_file_test (filename, G_FILE_TEST_IS_DIR))
process_folder (filename);
g_free (filename);
}
g_dir_close (dir);
return 0;
}
static gboolean
parse_option_state (const gchar *option_name,
const gchar *value,
gpointer data,
GError **error)
{
if (strcmp (value, "unknown") == 0)
option_state = PIKA_THUMB_STATE_UNKNOWN;
else if (strcmp (value, "remote") == 0)
option_state = PIKA_THUMB_STATE_REMOTE;
else if (strcmp (value, "folder") == 0)
option_state = PIKA_THUMB_STATE_FOLDER;
else if (strcmp (value, "special") == 0)
option_state = PIKA_THUMB_STATE_SPECIAL;
else if (strcmp (value, "not-found") == 0)
option_state = PIKA_THUMB_STATE_NOT_FOUND;
else if (strcmp (value, "exists") == 0)
option_state = PIKA_THUMB_STATE_EXISTS;
else if (strcmp (value, "old") == 0)
option_state = PIKA_THUMB_STATE_OLD;
else if (strcmp (value, "failed") == 0)
option_state = PIKA_THUMB_STATE_FAILED;
else if (strcmp (value, "ok") == 0)
option_state = PIKA_THUMB_STATE_OK;
else if (strcmp (value, "error") == 0)
option_state = STATE_ERROR;
else
return FALSE;
return TRUE;
}
static gboolean
parse_option_path (const gchar *option_name,
const gchar *value,
gpointer data,
GError **error)
{
option_path = g_strdup (value);
return TRUE;
}
static void
process_folder (const gchar *folder)
{
GDir *dir;
const gchar *name;
GError *error = NULL;
#if 0
g_print ("processing folder: %s\n", folder);
#endif
dir = g_dir_open (folder, 0, &error);
if (! dir)
{
g_printerr ("Error opening '%s': %s", folder, error->message);
return;
}
while ((name = g_dir_read_name (dir)))
{
gchar *filename;
filename = g_build_filename (folder, name, NULL);
if (g_file_test (filename, G_FILE_TEST_IS_DIR))
process_folder (filename);
else
process_thumbnail (filename);
g_free (filename);
}
g_dir_close (dir);
}
static void
process_thumbnail (const gchar *filename)
{
PikaThumbnail *thumbnail;
GError *error = NULL;
thumbnail = pika_thumbnail_new ();
if (! pika_thumbnail_set_from_thumb (thumbnail, filename, &error))
{
if (option_state == STATE_ERROR)
{
if (option_verbose)
g_print ("%s '%s'\n", filename, error->message);
else
g_print ("%s\n", filename);
}
g_clear_error (&error);
}
else
{
PikaThumbState state = pika_thumbnail_peek_image (thumbnail);
if ((option_state == STATE_NONE || state == option_state)
&&
(option_path == NULL ||
strstr (thumbnail->image_uri, option_path)))
{
if (option_verbose)
g_print ("%s '%s'\n", filename, thumbnail->image_uri);
else
g_print ("%s\n", filename);
}
#if 0
switch (foo)
{
case PIKA_THUMB_STATE_REMOTE:
g_print ("%s Remote image '%s'\n", filename, thumbnail->image_uri);
break;
case PIKA_THUMB_STATE_FOLDER:
g_print ("%s Folder '%s'\n", filename, thumbnail->image_uri);
break;
case PIKA_THUMB_STATE_SPECIAL:
g_print ("%s Special file '%s'\n", filename, thumbnail->image_uri);
break;
case PIKA_THUMB_STATE_NOT_FOUND:
g_print ("%s Image not found '%s'\n", filename, thumbnail->image_uri);
break;
case PIKA_THUMB_STATE_OLD:
g_print ("%s Thumbnail old '%s'\n", filename, thumbnail->image_uri);
break;
case PIKA_THUMB_STATE_FAILED:
g_print ("%s EEEEEEEEK '%s'\n", filename, thumbnail->image_uri);
break;
default:
g_print ("%s '%s'\n", filename, thumbnail->image_uri);
break;
}
#endif
}
g_object_unref (thumbnail);
}