java - How can I upload a videofile under my youtube/google account while using a service account -
i wish create server application checks folder on said server , automatically uploads video files have been dropped said folder. server remote , no human interaction take place.
after reading youtube's api v3 guides have come conclusion need "service account" upload these videos since application monitor folder. question is: possible @ all, upload video using service account , placing video under personal youtube account?
if in fact possible; have created following code confronted 401 unauthorized (invalid token) error.
i have following compilable source; i've tried make small possible:
package package; import com.google.api.client.googleapis.auth.oauth2.googlecredential; import com.google.api.client.googleapis.json.googlejsonresponseexception; import com.google.api.client.googleapis.media.mediahttpuploader; import com.google.api.client.googleapis.media.mediahttpuploaderprogresslistener; import com.google.api.client.http.httptransport; import com.google.api.client.http.inputstreamcontent; import com.google.api.client.http.javanet.nethttptransport; import com.google.api.client.json.jsonfactory; import com.google.api.client.json.jackson2.jacksonfactory; import com.google.api.services.youtube.youtube; import com.google.api.services.youtube.youtubescopes; import com.google.api.services.youtube.model.playlistitem; import com.google.api.services.youtube.model.video; import com.google.api.services.youtube.model.videosnippet; import com.google.api.services.youtube.model.videostatus; import java.io.file; import java.io.ioexception; import java.security.generalsecurityexception; import java.util.arraylist; import java.util.calendar; import java.util.iterator; import java.util.list; public class bigquerytestapp { private static final string video_file_format = "video/*"; private static final string sample_video_filename = "sample_video.mp4"; public static void main(string[] args) throws ioexception, interruptedexception, generalsecurityexception { final httptransport transport = new nethttptransport(); final jsonfactory json_factory = new jacksonfactory(); file privatekeyfile = new file("privatekey.p12"); googlecredential credential = new googlecredential.builder() .settransport(transport) .setjsonfactory(json_factory) .setserviceaccountid("xxxx@developer.gserviceaccount.com") .setserviceaccountscopes(youtubescopes.all()) .setserviceaccountprivatekeyfromp12file(privatekeyfile) .build(); try { youtube youtube = new youtube.builder(transport, json_factory, credential).setapplicationname("change_it").build(); video videoobjectdefiningmetadata = new video(); videostatus status = new videostatus(); status.setprivacystatus("unlisted"); videoobjectdefiningmetadata.setstatus(status); videosnippet snippet = new videosnippet(); calendar cal = calendar.getinstance(); snippet.settitle("test upload via java on " + cal.gettime()); snippet.setdescription( "video uploaded via youtube data api v3 using java library " + "on " + cal.gettime()); list<string> tags = new arraylist<string>(); tags.add("test"); tags.add("example"); tags.add("java"); tags.add("youtube data api v3"); tags.add("erase me"); snippet.settags(tags); videoobjectdefiningmetadata.setsnippet(snippet); inputstreamcontent mediacontent = new inputstreamcontent(video_file_format, bigquerytestapp.class.getresourceasstream(sample_video_filename)); youtube.videos.insert videoinsert = youtube.videos().insert("snippet,statistics,status", videoobjectdefiningmetadata, mediacontent); mediahttpuploader uploader = videoinsert.getmediahttpuploader();//thumbnailset.getmediahttpuploader(); uploader.setdirectuploadenabled(false); mediahttpuploaderprogresslistener progresslistener = new mediahttpuploaderprogresslistener() { public void progresschanged(mediahttpuploader uploader) throws ioexception { switch (uploader.getuploadstate()) { case initiation_started: system.out.println("initiation started"); break; case initiation_complete: system.out.println("initiation completed"); break; case media_in_progress: system.out.println("upload in progress"); system.out.println("upload percentage: " + uploader.getprogress()); break; case media_complete: system.out.println("upload completed!"); break; case not_started: system.out.println("upload not started!"); break; } } }; uploader.setprogresslistener(progresslistener); // call api , upload video. video returnedvideo = videoinsert.execute(); // print data newly inserted video api response. system.out.println("\n================== returned video ==================\n"); system.out.println(" - id: " + returnedvideo.getid()); system.out.println(" - title: " + returnedvideo.getsnippet().gettitle()); system.out.println(" - tags: " + returnedvideo.getsnippet().gettags()); system.out.println(" - privacy status: " + returnedvideo.getstatus().getprivacystatus()); system.out.println(" - video count: " + returnedvideo.getstatistics().getviewcount()); } catch (googlejsonresponseexception e) { system.out.println(e.getmessage()); system.out.println("headers: "+e.getheaders().tostring()); } finally, i've read various stories service accounts. compatible youtube others not. confuses me , i've found more questions on stackoverflow not definitively speak wether possible or not.
youtube not support service accounts, , have no plans to:
https://code.google.com/p/gdata-issues/issues/detail?id=5370
one option you, then, set app initial oauth flow (which initiate user interaction 1 time), , part of flow you'll issued both temporary access token , refresh token. refresh token can used more access tokens without having run oauth flow once again, , refresh token won't expire on own (it can revoked manually, though). app store refresh token, monitor folder, , access token on own whenever needing upload new video. see link:
https://developers.google.com/youtube/v3/guides/moving_to_oauth#standalone
(note mentions idea of daemon monitors directory new videos upload).
Comments
Post a Comment