changeset 2502:728c2b544eec

Fix #314: Remote commands for thumbnail maintenance https://github.com/BestImageViewer/geeqie/issues/314 Additional remote commands so that thumbnail maintenance may be executed from cron.
author Colin Clark <colin.clark@cclark.uk>
date Wed, 14 Jun 2017 19:26:03 +0100
parents b5cec98159e7
children 91954495cca3
files doc/docbook/GuideReferenceCommandLine.xml src/cache_maint.c src/cache_maint.h src/remote.c
diffstat 4 files changed, 262 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/doc/docbook/GuideReferenceCommandLine.xml	Mon Jun 12 19:15:29 2017 +0100
+++ b/doc/docbook/GuideReferenceCommandLine.xml	Wed Jun 14 19:26:03 2017 +0100
@@ -223,6 +223,46 @@
             <entry>raise</entry>
             <entry>Bring the geeqie window to the top</entry>
           </row>
+          <row>
+            <entry>-ct:clear|clean</entry>
+            <entry>--cache-thumbs:clear|clean</entry>
+            <entry>clear or clean thumbnail cache</entry>
+          </row>
+          <row>
+            <entry>-cs:clear|clean</entry>
+            <entry>--cache-shared:clear|clean</entry>
+            <entry>clear or clean shared thumbnail cache</entry>
+          </row>
+          <row>
+            <entry>-cm</entry>
+            <entry>--cache-metadata</entry>
+            <entry>clean the metadata cache</entry>
+          </row>
+          <row>
+            <entry>-cr:&lt;folder&gt;</entry>
+            <entry>--cache-render:&lt;folder&gt;</entry>
+            <entry>render thumbnails</entry>
+          </row>
+          <row>
+            <entry>-crr:&lt;folder&gt;</entry>
+            <entry>--cache-render-recurse:&lt;folder&gt;</entry>
+            <entry>render thumbnails recursively</entry>
+          </row>
+          <row>
+            <entry>-crs:&lt;folder&gt;</entry>
+            <entry>--cache-render-shared:&lt;folder&gt;</entry>
+            <entry>
+              render thumbnails
+              <footnote id='ref2'>
+                <para>If standard thumbnail cache is not enabled, this command will be ignored.</para>
+              </footnote>
+            </entry>
+          </row>
+          <row>
+            <entry>-crsr:&lt;folder&gt;</entry>
+            <entry>--cache-render-shared-recurse:&lt;folder&gt;</entry>
+            <entry>render thumbnails recursively</entry>
+          </row>
         </tbody>
       </tgroup>
     </table>
--- a/src/cache_maint.c	Mon Jun 12 19:15:29 2017 +0100
+++ b/src/cache_maint.c	Wed Jun 14 19:26:03 2017 +0100
@@ -48,6 +48,7 @@
 	GtkWidget *button_close;
 	gboolean clear;
 	gboolean metadata;
+	gboolean remote;
 };
 
 #define PURGE_DIALOG_WIDTH 400
@@ -117,11 +118,14 @@
 		cm->idle_id = 0;
 		}
 
-	gtk_entry_set_text(GTK_ENTRY(cm->entry), _("done"));
-	spinner_set_interval(cm->spinner, -1);
+	if (!cm->remote)
+		{
+		gtk_entry_set_text(GTK_ENTRY(cm->entry), _("done"));
+		spinner_set_interval(cm->spinner, -1);
 
-	gtk_widget_set_sensitive(cm->button_stop, FALSE);
-	gtk_widget_set_sensitive(cm->button_close, TRUE);
+		gtk_widget_set_sensitive(cm->button_stop, FALSE);
+		gtk_widget_set_sensitive(cm->button_close, TRUE);
+		}
 }
 
 static gboolean cache_maintain_home_cb(gpointer data)
@@ -224,7 +228,7 @@
 		file_data_unref(fd);
 		}
 
-	if (cm->list)
+	if (cm->list && !cm->remote)
 		{
 		const gchar *buf;
 
@@ -292,6 +296,7 @@
 	cm->done_list = NULL;
 	cm->clear = clear;
 	cm->metadata = metadata;
+	cm->remote = FALSE;
 
 	if (metadata)
 		{
@@ -339,6 +344,41 @@
 	cm->idle_id = g_idle_add(cache_maintain_home_cb, cm);
 }
 
+void cache_maintain_home_remote(gboolean metadata, gboolean clear)
+{
+	CMData *cm;
+	GList *dlist;
+	FileData *dir_fd;
+	const gchar *cache_folder;
+
+	if (metadata)
+		{
+		cache_folder = get_metadata_cache_dir();
+		}
+	else
+		{
+		cache_folder = get_thumbnails_cache_dir();
+		}
+
+	dir_fd = file_data_new_dir(cache_folder);
+	if (!filelist_read(dir_fd, NULL, &dlist))
+		{
+		file_data_unref(dir_fd);
+		return;
+		}
+
+	dlist = g_list_append(dlist, dir_fd);
+
+	cm = g_new0(CMData, 1);
+	cm->list = dlist;
+	cm->done_list = NULL;
+	cm->clear = clear;
+	cm->metadata = metadata;
+	cm->remote = TRUE;
+
+	cm->idle_id = g_idle_add(cache_maintain_home_cb, cm);
+}
+
 static void cache_file_move(const gchar *src, const gchar *dest)
 {
 	if (!dest || !src || !isfile(src)) return;
@@ -526,6 +566,8 @@
 	gboolean local;
 	gboolean recurse;
 
+	gboolean remote;
+
 	guint idle_id; /* event source id */
 };
 
@@ -555,14 +597,16 @@
 static void cache_manager_render_finish(CleanData *cd)
 {
 	cache_manager_render_reset(cd);
-
-	gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done"));
-	spinner_set_interval(cd->spinner, -1);
+	if (!cd->remote)
+		{
+		gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done"));
+		spinner_set_interval(cd->spinner, -1);
 
-	gtk_widget_set_sensitive(cd->group, TRUE);
-	gtk_widget_set_sensitive(cd->button_start, TRUE);
-	gtk_widget_set_sensitive(cd->button_stop, FALSE);
-	gtk_widget_set_sensitive(cd->button_close, TRUE);
+		gtk_widget_set_sensitive(cd->group, TRUE);
+		gtk_widget_set_sensitive(cd->button_start, TRUE);
+		gtk_widget_set_sensitive(cd->button_stop, FALSE);
+		gtk_widget_set_sensitive(cd->button_close, TRUE);
+		}
 }
 
 static void cache_manager_render_stop_cb(GenericDialog *fd, gpointer data)
@@ -624,7 +668,10 @@
 		success = thumb_loader_start((ThumbLoader *)cd->tl, fd);
 		if (success)
 			{
-			gtk_entry_set_text(GTK_ENTRY(cd->progress), fd->path);
+			if (!cd->remote)
+				{
+				gtk_entry_set_text(GTK_ENTRY(cd->progress), fd->path);
+				}
 			}
 		else
 			{
@@ -660,26 +707,62 @@
 	CleanData *cd = data;
 	gchar *path;
 
-	if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
+	if(!cd->remote)
+		{
+		if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
+		}
 
 	path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(cd->entry))));
 	parse_out_relatives(path);
 
 	if (!isdir(path))
 		{
-		warning_dialog(_("Invalid folder"),
-				_("The specified folder can not be found."),
-			       GTK_STOCK_DIALOG_WARNING, cd->gd->dialog);
+		if (!cd->remote)
+			{
+			warning_dialog(_("Invalid folder"),
+			_("The specified folder can not be found."),
+			GTK_STOCK_DIALOG_WARNING, cd->gd->dialog);
+			}
+		else
+			{
+			log_printf("The specified folder can not be found: %s\n", path);
+			}
 		}
 	else
 		{
 		FileData *dir_fd;
-		gtk_widget_set_sensitive(cd->group, FALSE);
-		gtk_widget_set_sensitive(cd->button_start, FALSE);
-		gtk_widget_set_sensitive(cd->button_stop, TRUE);
-		gtk_widget_set_sensitive(cd->button_close, FALSE);
+		if(!cd->remote)
+			{
+			gtk_widget_set_sensitive(cd->group, FALSE);
+			gtk_widget_set_sensitive(cd->button_start, FALSE);
+			gtk_widget_set_sensitive(cd->button_stop, TRUE);
+			gtk_widget_set_sensitive(cd->button_close, FALSE);
+
+			spinner_set_interval(cd->spinner, SPINNER_SPEED);
+			}
+		dir_fd = file_data_new_dir(path);
+		cache_manager_render_folder(cd, dir_fd);
+		file_data_unref(dir_fd);
+		while (cache_manager_render_file(cd));
+		}
 
-		spinner_set_interval(cd->spinner, SPINNER_SPEED);
+	g_free(path);
+}
+
+static void cache_manager_render_start_render_remote(CleanData *cd, const gchar *user_path)
+{
+	gchar *path;
+
+	path = remove_trailing_slash(user_path);
+	parse_out_relatives(path);
+
+	if (!isdir(path))
+		{
+		log_printf("The specified folder can not be found: %s\n", path);
+		}
+	else
+		{
+		FileData *dir_fd;
 
 		dir_fd = file_data_new_dir(path);
 		cache_manager_render_folder(cd, dir_fd);
@@ -698,6 +781,7 @@
 	GtkWidget *button;
 
 	cd = g_new0(CleanData, 1);
+	cd->remote = FALSE;
 
 	cd->gd = generic_dialog_new(_("Create thumbnails"),
 				    "create_thumbnails",
@@ -750,8 +834,17 @@
 	gtk_widget_show(cd->gd->dialog);
 }
 
+void cache_manager_render_remote(const gchar *path, gboolean recurse, gboolean local)
+{
+	CleanData *cd;
 
+	cd = g_new0(CleanData, 1);
+	cd->recurse = recurse;
+	cd->local = local;
+	cd->remote = TRUE;
 
+	cache_manager_render_start_render_remote(cd, path);
+}
 
 static void cache_manager_standard_clean_close_cb(GenericDialog *gd, gpointer data)
 {
@@ -768,12 +861,14 @@
 
 static void cache_manager_standard_clean_done(CleanData *cd)
 {
-	gtk_widget_set_sensitive(cd->button_stop, FALSE);
-	gtk_widget_set_sensitive(cd->button_close, TRUE);
+	if (!cd->remote)
+		{
+		gtk_widget_set_sensitive(cd->button_stop, FALSE);
+		gtk_widget_set_sensitive(cd->button_close, TRUE);
 
-	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0);
-	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done"));
-
+		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0);
+		gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done"));
+		}
 	if (cd->idle_id)
 		{
 		g_source_remove(cd->idle_id);
@@ -811,10 +906,13 @@
 		file_data_unref(next_fd);
 
 		cd->count_done++;
-		if (cd->count_total != 0)
+		if (!cd->remote)
 			{
-			gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
-						      (gdouble)cd->count_done / cd->count_total);
+			if (cd->count_total != 0)
+				{
+				gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
+							      (gdouble)cd->count_done / cd->count_total);
+				}
 			}
 
 		return TRUE;
@@ -838,10 +936,13 @@
 			}
 
 		cd->count_done++;
-		if (cd->count_total != 0)
+		if (!cd->remote)
 			{
-			gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
-						      (gdouble)cd->count_done / cd->count_total);
+			if (cd->count_total != 0)
+				{
+				gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
+							      (gdouble)cd->count_done / cd->count_total);
+				}
 			}
 		}
 
@@ -863,20 +964,23 @@
 		}
 }
 
-static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data)
+static void cache_manager_standard_clean_start(GenericDialog *gd, gpointer data)
 {
 	CleanData *cd = data;
 	GList *list;
 	gchar *path;
 	FileData *dir_fd;
 
-	if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
+	if (!cd->remote)
+	{
+		if (cd->list || !gtk_widget_get_sensitive(cd->button_start)) return;
 
-	gtk_widget_set_sensitive(cd->button_start, FALSE);
-	gtk_widget_set_sensitive(cd->button_stop, TRUE);
-	gtk_widget_set_sensitive(cd->button_close, FALSE);
+		gtk_widget_set_sensitive(cd->button_start, FALSE);
+		gtk_widget_set_sensitive(cd->button_stop, TRUE);
+		gtk_widget_set_sensitive(cd->button_close, FALSE);
 
-	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running..."));
+		gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running..."));
+	}
 
 	path = g_build_filename(homedir(), THUMB_FOLDER_GLOBAL, THUMB_FOLDER_NORMAL, NULL);
 	dir_fd = file_data_new_dir(path);
@@ -913,6 +1017,11 @@
 		}
 }
 
+static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data)
+{
+	cache_manager_standard_clean_start(gd, data);
+}
+
 static void cache_manager_standard_process(GtkWidget *widget, gboolean clear)
 {
 	CleanData *cd;
@@ -921,6 +1030,7 @@
 
 	cd = g_new0(CleanData, 1);
 	cd->clear = clear;
+	cd->remote = FALSE;
 
 	if (clear)
 		{
@@ -963,6 +1073,20 @@
 	gtk_widget_show(cd->gd->dialog);
 }
 
+void cache_manager_standard_process_remote(gboolean clear)
+{
+	CleanData *cd;
+
+	cd = g_new0(CleanData, 1);
+	cd->clear = clear;
+	cd->days = 30;
+	cd->tl = NULL;
+	cd->idle_id = 0;
+	cd->remote = TRUE;
+
+	cache_manager_standard_clean_start(NULL, cd);
+}
+
 static void cache_manager_standard_clean_cb(GtkWidget *widget, gpointer data)
 {
 	cache_manager_standard_process(widget, FALSE);
--- a/src/cache_maint.h	Mon Jun 12 19:15:29 2017 +0100
+++ b/src/cache_maint.h	Wed Jun 14 19:26:03 2017 +0100
@@ -27,6 +27,8 @@
 void cache_notify_cb(FileData *fd, NotifyType type, gpointer data);
 void cache_manager_show(void);
 
-
+void cache_maintain_home_remote(gboolean metadata, gboolean clear);
+void cache_manager_standard_process_remote(gboolean clear);
+void cache_manager_render_remote(const gchar *path, gboolean recurse, gboolean local);
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
--- a/src/remote.c	Mon Jun 12 19:15:29 2017 +0100
+++ b/src/remote.c	Wed Jun 14 19:26:03 2017 +0100
@@ -22,6 +22,7 @@
 #include "main.h"
 #include "remote.h"
 
+#include "cache_maint.h"
 #include "collect.h"
 #include "filedata.h"
 #include "image.h"
@@ -430,6 +431,54 @@
 	layout_image_slideshow_start_from_list(NULL, list);
 }
 
+static void gr_cache_thumb(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if (!g_strcmp0(text, "clear"))
+		cache_maintain_home_remote(FALSE, TRUE);
+	else if (!g_strcmp0(text, "clean"))
+		cache_maintain_home_remote(FALSE, FALSE);
+}
+
+static void gr_cache_shared(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if (!g_strcmp0(text, "clear"))
+		cache_manager_standard_process_remote(TRUE);
+	else if (!g_strcmp0(text, "clean"))
+		cache_manager_standard_process_remote(FALSE);
+}
+
+static void gr_cache_metadata(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_maintain_home_remote(TRUE, FALSE);
+}
+
+static void gr_cache_clear(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_maintain_home_remote(FALSE, TRUE);
+}
+
+static void gr_cache_render(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_manager_render_remote(text, FALSE, FALSE);
+}
+
+static void gr_cache_render_recurse(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	cache_manager_render_remote(text, TRUE, FALSE);
+}
+
+static void gr_cache_render_standard(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if(options->thumbnails.spec_standard)
+		cache_manager_render_remote(text, FALSE, TRUE);
+}
+
+static void gr_cache_render_standard_recurse(const gchar *text, GIOChannel *channel, gpointer data)
+{
+	if(options->thumbnails.spec_standard)
+		cache_manager_render_remote(text, TRUE, TRUE);
+}
+
 static void gr_slideshow_toggle(const gchar *text, GIOChannel *channel, gpointer data)
 {
 	layout_image_slideshow_toggle(NULL);
@@ -692,6 +741,13 @@
 	{ NULL, "--list-clear",         gr_list_clear,          FALSE, FALSE, NULL, N_("clear command line collection list") },
 	{ NULL, "--list-add:",          gr_list_add,            TRUE,  FALSE, N_("<FILE>"), N_("add FILE to command line collection list") },
 	{ NULL, "raise",                gr_raise,               FALSE, FALSE, NULL, N_("bring the Geeqie window to the top") },
+	{ "-ct:", "--cache-thumbs:",    gr_cache_thumb,         TRUE, FALSE, N_("clear|clean"), N_("clear or clean thumbnail cache") },
+	{ "-cs:", "--cache-shared:",    gr_cache_shared,        TRUE, FALSE, N_("clear|clean"), N_("clear or clean shared thumbnail cache") },
+	{ "-cm","--cache-metadata",      gr_cache_metadata,               FALSE, FALSE, NULL, N_("    clean the metadata cache") },
+	{ "-cr:", "--cache-render:",    gr_cache_render,        TRUE, FALSE, N_("<folder>  "), N_(" render thumbnails") },
+	{ "-crr:", "--cache-render-recurse:", gr_cache_render_recurse, TRUE, FALSE, N_("<folder> "), N_("render thumbnails recursively") },
+	{ "-crs:", "--cache-render-shared:", gr_cache_render_standard, TRUE, FALSE, N_("<folder> "), N_(" render thumbnails (see Help)") },
+	{ "-crsr:", "--cache-render-shared-recurse:", gr_cache_render_standard_recurse, TRUE, FALSE, N_("<folder>"), N_(" render thumbnails recursively (see Help)") },
 	{ NULL, NULL, NULL, FALSE, FALSE, NULL }
 };