static void gth_metadata_provider_file_read (GthMetadataProvider *self, GthFileData *file_data, const char *attributes) { GFileAttributeMatcher *matcher; char *value; GTimeVal *timeval_p; const char *value_s; matcher = g_file_attribute_matcher_new (attributes); value = g_format_size_for_display (g_file_info_get_size (file_data->info)); g_file_info_set_attribute_string (file_data->info, "gth::file::display-size", value); g_free (value); timeval_p = gth_file_data_get_modification_time (file_data); value = _g_time_val_strftime (timeval_p, "%x %X"); g_file_info_set_attribute_string (file_data->info, "gth::file::display-mtime", value); g_free (value); value = g_file_get_parse_name (file_data->file); g_file_info_set_attribute_string (file_data->info, "gth::file::full-name", value); g_free (value); value_s = get_static_string (g_file_info_get_content_type (file_data->info)); if (value_s != NULL) g_file_info_set_attribute_string (file_data->info, "gth::file::content-type", value_s); g_file_attribute_matcher_unref (matcher); }
static void gth_metadata_provider_comment_read (GthMetadataProvider *self, GthFileData *file_data, const char *attributes, GCancellable *cancellable) { GthComment *comment; const char *value; GPtrArray *categories; char *comment_time; comment = gth_comment_new_for_file (file_data->file, cancellable, NULL); g_file_info_set_attribute_boolean (file_data->info, "comment::no-comment-file", (comment == NULL)); if (comment == NULL) return; value = gth_comment_get_note (comment); if (value != NULL) g_file_info_set_attribute_string (file_data->info, "comment::note", value); value = gth_comment_get_caption (comment); if (value != NULL) g_file_info_set_attribute_string (file_data->info, "comment::caption", value); value = gth_comment_get_place (comment); if (value != NULL) g_file_info_set_attribute_string (file_data->info, "comment::place", value); if (gth_comment_get_rating (comment) > 0) g_file_info_set_attribute_int32 (file_data->info, "comment::rating", gth_comment_get_rating (comment)); else g_file_info_remove_attribute (file_data->info, "comment::rating"); categories = gth_comment_get_categories (comment); if (categories->len > 0) { GthStringList *list; GthMetadata *metadata; list = gth_string_list_new_from_ptr_array (categories); metadata = gth_metadata_new_for_string_list (list); g_file_info_set_attribute_object (file_data->info, "comment::categories", G_OBJECT (metadata)); g_object_unref (metadata); g_object_unref (list); } else g_file_info_remove_attribute (file_data->info, "comment::categories"); comment_time = gth_comment_get_time_as_exif_format (comment); if (comment_time != NULL) { GTimeVal time_; char *formatted; if (_g_time_val_from_exif_date (comment_time, &time_)) formatted = _g_time_val_strftime (&time_, "%x %X"); else formatted = g_strdup (comment_time); set_attribute_from_string (file_data->info, "comment::time", comment_time, formatted); g_free (formatted); g_free (comment_time); } else g_file_info_remove_attribute (file_data->info, "comment::time"); gth_comment_update_general_attributes (file_data); g_object_unref (comment); }
static void for_each_file_func (GFile *file, GFileInfo *info, gpointer user_data) { GthOrganizeTask *self = user_data; GthFileData *file_data; char *key; GTimeVal timeval; GthCatalog *catalog; if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR) return; key = NULL; file_data = gth_file_data_new (file, info); switch (self->priv->group_policy) { case GTH_GROUP_POLICY_DIGITALIZED_DATE: { GObject *metadata; metadata = g_file_info_get_attribute_object (info, "Embedded::Photo::DateTimeOriginal"); if (metadata != NULL) { if (_g_time_val_from_exif_date (gth_metadata_get_raw (GTH_METADATA (metadata)), &timeval)) key = _g_time_val_strftime (&timeval, KEY_FORMAT); } } break; case GTH_GROUP_POLICY_MODIFIED_DATE: timeval = *gth_file_data_get_modification_time (file_data); key = _g_time_val_strftime (&timeval, KEY_FORMAT); break; } if (key == NULL) return; catalog = g_hash_table_lookup (self->priv->catalogs, key); if (catalog == NULL) { GthDateTime *date_time; GFile *catalog_file; char *name; GtkTreeIter iter; date_time = gth_datetime_new (); gth_datetime_from_timeval (date_time, &timeval); catalog_file = gth_catalog_get_file_for_date (date_time); catalog = gth_catalog_load_from_file (catalog_file); if (catalog == NULL) catalog = gth_catalog_new (); gth_catalog_set_for_date (catalog, date_time); g_hash_table_insert (self->priv->catalogs, g_strdup (key), catalog); name = gth_datetime_strftime (date_time, "%x"); gtk_list_store_append (self->priv->results_liststore, &iter); gtk_list_store_set (self->priv->results_liststore, &iter, KEY_COLUMN, key, NAME_COLUMN, name, CARDINALITY_COLUMN, 0, CREATE_CATALOG_COLUMN, TRUE, ICON_COLUMN, self->priv->icon_pixbuf, -1); self->priv->n_catalogs++; g_free (name); g_object_unref (catalog_file); gth_datetime_free (date_time); } if (catalog != NULL) { GtkTreeIter iter; int n = 0; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (self->priv->results_liststore), &iter)) { do { char *k; gtk_tree_model_get (GTK_TREE_MODEL (self->priv->results_liststore), &iter, KEY_COLUMN, &k, CARDINALITY_COLUMN, &n, -1); if (g_strcmp0 (k, key) == 0) { gtk_list_store_set (self->priv->results_liststore, &iter, CARDINALITY_COLUMN, n + 1, -1); self->priv->n_files++; g_free (k); break; } g_free (k); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (self->priv->results_liststore), &iter)); } gth_catalog_insert_file (catalog, file_data->file, -1); } g_object_unref (file_data); g_free (key); }