[grilo-plugins] filesystem: Only return thumbnails if the y’re valid/up to date



commit 41594ba590ab1115b48e3d1182c4a6673c0c79c2
Author: Philip Withnall <philip withnall collabora co uk>
Date:   Fri Oct 11 11:31:42 2013 +0100

    filesystem: Only return thumbnails if they’re valid/up to date
    
    Use G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID to ensure that only up to date
    thumbnails are returned by the filesystem and local-metadata plugins.
    
    This uses an optional GIO dependency bump to 2.39.0. If that version of GIO
    isn’t available, the new functionality won’t be used.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=709900

 src/filesystem/grl-filesystem.c         |   23 ++++++++++++++++++++---
 src/local-metadata/grl-local-metadata.c |   29 ++++++++++++++++++++++++-----
 2 files changed, 44 insertions(+), 8 deletions(-)
---
diff --git a/src/filesystem/grl-filesystem.c b/src/filesystem/grl-filesystem.c
index 5408c37..7e1f85c 100644
--- a/src/filesystem/grl-filesystem.c
+++ b/src/filesystem/grl-filesystem.c
@@ -40,7 +40,7 @@ GRL_LOG_DOMAIN_STATIC(filesystem_log_domain);
 
 /* -------- File info ------- */
 
-#define FILE_ATTRIBUTES                         \
+#define _FILE_ATTRIBUTES                        \
   G_FILE_ATTRIBUTE_STANDARD_NAME ","            \
   G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","    \
   G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","    \
@@ -50,6 +50,14 @@ GRL_LOG_DOMAIN_STATIC(filesystem_log_domain);
   G_FILE_ATTRIBUTE_THUMBNAIL_PATH ","           \
   G_FILE_ATTRIBUTE_THUMBNAILING_FAILED
 
+#if GLIB_CHECK_VERSION(2, 39, 0)
+#define FILE_ATTRIBUTES \
+  _FILE_ATTRIBUTES "," \
+  G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID
+#else
+#define FILE_ATTRIBUTES _FILE_ATTRIBUTES
+#endif
+
 #define FILE_ATTRIBUTES_FAST                    \
   G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN
 
@@ -475,6 +483,7 @@ create_content (GrlMedia *content,
   gchar *str;
   gchar *extension;
   const gchar *mime;
+  gboolean thumb_failed, thumb_is_valid;
   GError *error = NULL;
 
   if (!info)
@@ -563,10 +572,18 @@ create_content (GrlMedia *content,
     g_date_time_unref (date_time);
 
     /* Thumbnail */
-    gboolean thumb_failed =
+    thumb_failed =
       g_file_info_get_attribute_boolean (info,
                                          G_FILE_ATTRIBUTE_THUMBNAILING_FAILED);
-    if (!thumb_failed) {
+#if GLIB_CHECK_VERSION (2, 39, 0)
+    thumb_is_valid =
+      g_file_info_get_attribute_boolean (info,
+                                         G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID);
+#else
+    thumb_is_valid = TRUE;
+#endif
+
+    if (!thumb_failed && thumb_is_valid) {
       const gchar *thumb =
         g_file_info_get_attribute_byte_string (info,
                                                G_FILE_ATTRIBUTE_THUMBNAIL_PATH);
diff --git a/src/local-metadata/grl-local-metadata.c b/src/local-metadata/grl-local-metadata.c
index 421f0e3..e300433 100644
--- a/src/local-metadata/grl-local-metadata.c
+++ b/src/local-metadata/grl-local-metadata.c
@@ -428,6 +428,7 @@ got_file_info (GFile *file,
   GFileInfo *info;
   GError *error = NULL;
   const gchar *thumbnail_path;
+  gboolean thumbnail_is_valid;
 
   GRL_DEBUG ("got_file_info");
 
@@ -444,9 +445,15 @@ got_file_info (GFile *file,
 
   thumbnail_path =
       g_file_info_get_attribute_byte_string (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH);
+#if GLIB_CHECK_VERSION (2, 39, 0)
+  thumbnail_is_valid =
+      g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID);
+#else
+  thumbnail_is_valid = TRUE;
+#endif
 
 
-  if (thumbnail_path) {
+  if (thumbnail_path && thumbnail_is_valid) {
     gchar *thumbnail_uri = g_filename_to_uri (thumbnail_path, NULL, &error);
     if (error)
       goto error;
@@ -455,14 +462,16 @@ got_file_info (GFile *file,
               grl_media_get_url (rs->media));
     grl_media_set_thumbnail (rs->media, thumbnail_uri);
     g_free (thumbnail_uri);
-
-    rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL);
+  } else if (thumbnail_path && !thumbnail_is_valid) {
+    GRL_INFO ("Found outdated thumbnail %s for media: %s", thumbnail_path,
+              grl_media_get_url (rs->media));
   } else {
     GRL_INFO ("Could not find thumbnail for media: %s",
               grl_media_get_url (rs->media));
-    rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL);
   }
 
+  rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL);
+
   goto exit;
 
 error:
@@ -570,11 +579,21 @@ resolve_image (GrlSource *source,
   GRL_DEBUG ("resolve_image");
 
   if (flags & FLAG_THUMBNAIL) {
+    const gchar *attributes;
+
     file = g_file_new_for_uri (grl_media_get_url (rs->media));
 
     cancellable = g_cancellable_new ();
     grl_operation_set_data (rs->operation_id, cancellable);
-    g_file_query_info_async (file, G_FILE_ATTRIBUTE_THUMBNAIL_PATH,
+
+#if GLIB_CHECK_VERSION (2, 39, 0)
+    attributes = G_FILE_ATTRIBUTE_THUMBNAIL_PATH "," \
+                 G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID;
+#else
+    attributes = G_FILE_ATTRIBUTE_THUMBNAIL_PATH;
+#endif
+
+    g_file_query_info_async (file, attributes,
                              G_FILE_QUERY_INFO_NONE, G_PRIORITY_DEFAULT, cancellable,
                              (GAsyncReadyCallback)got_file_info, rs);
     g_object_unref (file);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]