diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2023-06-28 21:35:52 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2023-06-28 21:35:52 +0200 |
commit | b86540b743f1a87a163ffb811c8fe22a01fefa38 (patch) | |
tree | b47cb3bb83c2377234226fb3987ab3320a987dd9 /plugins/shotwell-publishing/YoutubeUploader.vala | |
parent | ac6e0b731b9f0b2efd392e3309a5c07e2a66adad (diff) | |
parent | e905d8e16eec152d19797937f13ba3cf4b8f8aca (diff) |
Merge branch 'release/debian/0.32.1-1'debian/0.32.1-1
Diffstat (limited to 'plugins/shotwell-publishing/YoutubeUploader.vala')
-rw-r--r-- | plugins/shotwell-publishing/YoutubeUploader.vala | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/plugins/shotwell-publishing/YoutubeUploader.vala b/plugins/shotwell-publishing/YoutubeUploader.vala new file mode 100644 index 0000000..47c6051 --- /dev/null +++ b/plugins/shotwell-publishing/YoutubeUploader.vala @@ -0,0 +1,76 @@ +using Spit; + +internal class Publishing.YouTube.UploadTransaction : Publishing.RESTSupport.GooglePublisher.AuthenticatedTransaction { + private PublishingParameters parameters; + private Publishing.RESTSupport.GoogleSession session; + private Spit.Publishing.Publishable publishable; + + public UploadTransaction(Publishing.RESTSupport.GoogleSession session, + PublishingParameters parameters, Spit.Publishing.Publishable publishable) { + base(session, "https://www.googleapis.com/upload/youtube/v3/videos", + Publishing.RESTSupport.HttpMethod.POST); + assert(session.is_authenticated()); + + this.session = session; + this.parameters = parameters; + this.publishable = publishable; + } + public override async void execute_async() throws Spit.Publishing.PublishingError { + // Collect parameters + + var slug = publishable.get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME); + // Set title to publishing name, but if that's empty default to filename. + string title = publishable.get_publishing_name(); + if (title == "") { + title = publishable.get_param_string(Spit.Publishing.Publishable.PARAM_STRING_BASENAME); + } + + var builder = new Json.Builder(); + builder.begin_object(); + builder.set_member_name("snippet"); + builder.begin_object(); + builder.set_member_name("description"); + builder.add_string_value(slug); + builder.set_member_name("title"); + builder.add_string_value(title); + builder.end_object(); + builder.set_member_name("status"); + builder.begin_object(); + builder.set_member_name("privacyStatus"); + builder.add_string_value(parameters.get_privacy().to_string()); + builder.end_object(); + builder.end_object(); + + var meta_data = Json.to_string (builder.get_root(), false); + debug ("Parameters: %s", meta_data); + var message_parts = new Soup.Multipart("multipart/related"); + var headers = new Soup.MessageHeaders(Soup.MessageHeadersType.MULTIPART); + var encoding = new GLib.HashTable<string, string>(str_hash, str_equal); + encoding.insert("encoding", "UTF-8"); + headers.set_content_type ("application/json", encoding); + + message_parts.append_part (headers, new Bytes (meta_data.data)); + headers = new Soup.MessageHeaders(Soup.MessageHeadersType.MULTIPART); + headers.set_content_type ("application/octet-stream", null); + headers.append("Content-Transfer-Encoding", "binary"); + + MappedFile? mapped_file = null; + try { + mapped_file = new MappedFile(publishable.get_serialized_file().get_path(), false); + } catch (Error e) { + throw new Spit.Publishing.PublishingError.LOCAL_FILE_ERROR( + _("A temporary file needed for publishing is unavailable")); + } + + + message_parts.append_part (headers, mapped_file.get_bytes()); + + var outbound_message = new Soup.Message.from_multipart (get_endpoint_url() + "?part=" + GLib.Uri.escape_string ("snippet,status"), message_parts); + outbound_message.get_request_headers().append("Authorization", "Bearer " + + session.get_access_token()); + + set_message(outbound_message, mapped_file.get_length() + meta_data.length); + set_is_executed(true); + yield send_async(); + } +} |