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

Popular posts from this blog

user interface - How to replace the Python logo in a Tkinter-based Python GUI app? -

objective c - Greedy NSProgressIndicator Allocation -

how to set an OCR language in Google Drive -