summaryrefslogtreecommitdiff
path: root/src/data_imports/DataImportSource.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/data_imports/DataImportSource.vala')
-rw-r--r--src/data_imports/DataImportSource.vala135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/data_imports/DataImportSource.vala b/src/data_imports/DataImportSource.vala
new file mode 100644
index 0000000..d7e8ec8
--- /dev/null
+++ b/src/data_imports/DataImportSource.vala
@@ -0,0 +1,135 @@
+/* Copyright 2011-2014 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+namespace Spit.DataImports {
+
+/**
+ * Photo source implementation for alien databases. This class is responsible
+ * for extracting meta-data out of a source photo to support the import
+ * process.
+ *
+ * This class does not extend PhotoSource in order to minimise the API to the
+ * absolute minimum required to run the import job.
+ */
+public class DataImportSource {
+ private bool backing_file_found;
+ private ImportableMediaItem db_photo;
+ private string? title = null;
+ private string? preview_md5 = null;
+ private uint64 file_size;
+ private time_t modification_time;
+ private MetadataDateTime? exposure_time;
+
+ public DataImportSource(ImportableMediaItem db_photo) {
+ this.db_photo = db_photo;
+
+ // A well-behaved plugin will ensure that the path and file name are
+ // not null but we check just in case
+ string folder_path = db_photo.get_folder_path();
+ string filename = db_photo.get_filename();
+ File? photo = null;
+ if (folder_path != null && filename != null) {
+ photo = File.new_for_path(db_photo.get_folder_path()).
+ get_child(db_photo.get_filename());
+
+ backing_file_found = photo.query_exists();
+ } else {
+ backing_file_found = false;
+ }
+
+ if (photo != null && backing_file_found) {
+ PhotoMetadata? metadata = new PhotoMetadata();
+ try {
+ metadata.read_from_file(photo);
+ } catch(Error e) {
+ warning("Could not get file metadata for %s: %s", get_filename(), e.message);
+ metadata = null;
+ }
+
+ title = (metadata != null) ? metadata.get_title() : null;
+ exposure_time = (metadata != null) ? metadata.get_exposure_date_time() : null;
+ PhotoPreview? preview = metadata != null ? metadata.get_preview(0) : null;
+ if (preview != null) {
+ try {
+ uint8[] preview_raw = preview.flatten();
+ preview_md5 = md5_binary(preview_raw, preview_raw.length);
+ } catch(Error e) {
+ warning("Could not get raw preview for %s: %s", get_filename(), e.message);
+ }
+ }
+#if TRACE_MD5
+ debug("Photo MD5 %s: preview=%s", get_filename(), preview_md5);
+#endif
+
+ try {
+ file_size = query_total_file_size(photo);
+ } catch(Error e) {
+ warning("Could not get file size for %s: %s", get_filename(), e.message);
+ }
+ try {
+ modification_time = query_file_modified(photo);
+ } catch(Error e) {
+ warning("Could not get modification time for %s: %s", get_filename(), e.message);
+ }
+ } else {
+ debug ("Photo file %s not found".printf(photo.get_path()));
+ }
+ }
+
+ public string get_filename() {
+ return db_photo.get_filename();
+ }
+
+ public string get_fulldir() {
+ return db_photo.get_folder_path();
+ }
+
+ public File get_file() {
+ return File.new_for_path(get_fulldir()).get_child(get_filename());
+ }
+
+ public string get_name() {
+ return !is_string_empty(title) ? title : get_filename();
+ }
+
+ public string? get_title() {
+ return title;
+ }
+
+ public PhotoFileFormat get_file_format() {
+ return PhotoFileFormat.get_by_basename_extension(get_filename());
+ }
+
+ public string to_string() {
+ return get_name();
+ }
+
+ public time_t get_exposure_time() {
+ return (exposure_time != null) ? exposure_time.get_timestamp() : modification_time;
+ }
+
+ public uint64 get_filesize() {
+ return file_size;
+ }
+
+ public ImportableMediaItem get_photo() {
+ return db_photo;
+ }
+
+ public bool is_already_imported() {
+ // ignore trashed duplicates
+ return (preview_md5 != null)
+ ? LibraryPhoto.has_nontrash_duplicate(null, preview_md5, null, get_file_format())
+ : false;
+ }
+
+ public bool was_backing_file_found() {
+ return backing_file_found;
+ }
+}
+
+}
+