diff options
Diffstat (limited to 'src/publishing/APIGlue.vala')
-rw-r--r-- | src/publishing/APIGlue.vala | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/publishing/APIGlue.vala b/src/publishing/APIGlue.vala new file mode 100644 index 0000000..f282c1f --- /dev/null +++ b/src/publishing/APIGlue.vala @@ -0,0 +1,133 @@ +/* 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 Publishing.Glue { + +public class MediaSourcePublishableWrapper : Spit.Publishing.Publishable, GLib.Object { + private static int name_ticker = 0; + + private MediaSource wrapped; + private GLib.File? serialized_file = null; + private Gee.Map<string, string> param_string = new Gee.HashMap<string, string>(); + + public MediaSourcePublishableWrapper(MediaSource to_wrap) { + wrapped = to_wrap; + setup_parameters(); + } + + public void clean_up() { + if (serialized_file == null) + return; + + debug("cleaning up temporary publishing file '%s'.", serialized_file.get_path()); + + try { + serialized_file.delete(null); + } catch (Error err) { + warning("couldn't delete temporary publishing file '%s'.", serialized_file.get_path()); + } + + serialized_file = null; + } + + private void setup_parameters() { + param_string.set(PARAM_STRING_BASENAME, wrapped.get_basename()); + param_string.set(PARAM_STRING_TITLE, wrapped.get_title()); + param_string.set(PARAM_STRING_COMMENT, wrapped.get_comment()); + + if (wrapped.get_event() != null) + param_string.set(PARAM_STRING_EVENTCOMMENT, wrapped.get_event().get_comment()); + else + param_string.set(PARAM_STRING_EVENTCOMMENT, ""); + } + + public GLib.File serialize_for_publishing(int content_major_axis, + bool strip_metadata = false) throws Spit.Publishing.PublishingError { + + if (wrapped is LibraryPhoto) { + LibraryPhoto photo = (LibraryPhoto) wrapped; + + GLib.File to_file = + AppDirs.get_temp_dir().get_child("publishing-%d.jpg".printf(name_ticker++)); + + debug("writing photo '%s' to temporary file '%s' for publishing.", + photo.get_source_id(), to_file.get_path()); + try { + Scaling scaling = (content_major_axis > 0) ? + Scaling.for_best_fit(content_major_axis, false) : Scaling.for_original(); + photo.export(to_file, scaling, Jpeg.Quality.HIGH, PhotoFileFormat.JFIF, false, !strip_metadata); + } catch (Error err) { + throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR( + "unable to serialize photo '%s' for publishing.", photo.get_name()); + } + + serialized_file = to_file; + } else if (wrapped is Video) { + Video video = (Video) wrapped; + + string basename; + string extension; + disassemble_filename(video.get_file().get_basename(), out basename, out extension); + + GLib.File to_file = + GLib.File.new_for_path("publishing-%d.%s".printf(name_ticker++, extension)); + + debug("writing video '%s' to temporary file '%s' for publishing.", + video.get_source_id(), to_file.get_path()); + try { + video.export(to_file); + } catch (Error err) { + throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR( + "unable to serialize video '%s' for publishing.", video.get_name()); + } + + serialized_file = to_file; + } else { + error("MediaSourcePublishableWrapper.serialize_for_publishing( ): unknown media type."); + } + + return serialized_file; + } + + public string get_publishing_name() { + return wrapped.get_title() != null ? wrapped.get_title() : ""; + } + + public string? get_param_string(string name) { + return param_string.get(name); + } + + public string[] get_publishing_keywords() { + string[] result = new string[0]; + + Gee.Collection<Tag>? tagset = Tag.global.fetch_sorted_for_source(wrapped); + if (tagset != null) { + foreach (Tag tag in tagset) { + result += tag.get_name(); + } + } + + return (result.length > 0) ? result : null; + } + + public Spit.Publishing.Publisher.MediaType get_media_type() { + if (wrapped is LibraryPhoto) + return Spit.Publishing.Publisher.MediaType.PHOTO; + else if (wrapped is Video) + return Spit.Publishing.Publisher.MediaType.VIDEO; + else + return Spit.Publishing.Publisher.MediaType.NONE; + } + + public GLib.File? get_serialized_file() { + return serialized_file; + } + + public GLib.DateTime get_exposure_date_time() { + return new GLib.DateTime.from_unix_local(wrapped.get_exposure_time()); + } +} + +} |