GList *metadata_read_list(FileData *fd, const gchar *key, MetadataFormat format) { ExifData *exif; GList *list = NULL; if (!fd) return NULL; /* unwritten data overide everything */ if (fd->modified_xmp && format == METADATA_PLAIN) { list = g_hash_table_lookup(fd->modified_xmp, key); if (list) return string_list_copy(list); } /* Legacy metadata file is the primary source if it exists. Merging the lists does not make much sense, because the existence of legacy metadata file indicates that the other metadata sources are not writable and thus it would not be possible to delete the keywords that comes from the image file. */ if (strcmp(key, KEYWORD_KEY) == 0) { if (metadata_legacy_read(fd, &list, NULL)) return list; } else if (strcmp(key, COMMENT_KEY) == 0) { gchar *comment = NULL; if (metadata_legacy_read(fd, NULL, &comment)) return g_list_append(NULL, comment); } else if (strncmp(key, "file.", 5) == 0) { return g_list_append(NULL, metadata_file_info(fd, key, format)); } exif = exif_read_fd(fd); /* this is cached, thus inexpensive */ if (!exif) return NULL; list = exif_get_metadata(exif, key, format); exif_free_fd(fd, exif); return list; }
gboolean metadata_write_perform(FileData *fd) { gboolean success; ExifData *exif; guint lf; g_assert(fd->change); lf = strlen(GQ_CACHE_EXT_METADATA); if (fd->change->dest && g_ascii_strncasecmp(fd->change->dest + strlen(fd->change->dest) - lf, GQ_CACHE_EXT_METADATA, lf) == 0) { success = metadata_legacy_write(fd); if (success) metadata_legacy_delete(fd, fd->change->dest); return success; } /* write via exiv2 */ /* we can either use cached metadata which have fd->modified_xmp already applied or read metadata from file and apply fd->modified_xmp metadata are read also if the file was modified meanwhile */ exif = exif_read_fd(fd); if (!exif) return FALSE; success = (fd->change->dest) ? exif_write_sidecar(exif, fd->change->dest) : exif_write(exif); /* write modified metadata */ exif_free_fd(fd, exif); if (fd->change->dest) /* this will create a FileData for the sidecar and link it to the main file (we can't wait until the sidecar is discovered by directory scanning because exif_read_fd is called before that and it would read the main file only and store the metadata in the cache) FIXME: this does not catch new sidecars created by independent external programs */ file_data_unref(file_data_new_group(fd->change->dest)); if (success) metadata_legacy_delete(fd, fd->change->dest); return success; }