2014-12-22 6 views
6

Questo è semplicemente pazzesco, ho trascorso una settimana ora cercando di capirlo. Tutto quello che trovo è deprecato o semplicemente non funzionerà.Carica video su youtube con l'applicazione mvc (tutto il codice dietro)

Quindi questo è quello che sto cercando di fare. Gli utenti caricano un video, archiviamo il video fino a quando non è stato approvato. una volta approvato, dobbiamo caricarlo sul nostro canale youtube.

L'esempio di google: https://developers.google.com/youtube/v3/code_samples/dotnet#retrieve_my_uploads non supererà GoogleWebAuthorizationBroker.AuthorizeAsync perché si blocca per sempre.

Un altro problema con questo approccio è che abbiamo bisogno dell'ID dopo che il video è stato caricato, e abbiamo bisogno di sapere se il video è stato caricato con successo o meno, tutto in sincrono. vedrai guardando il codice che usa i metodi asincroni e per ottenere l'id del video c'è un callback.

Qualcuno ha idea di come caricare un video nel back-end di un'applicazione mvc in modo sincrono?

risposta

7

Ok, quindi il primo problema che ho avuto è stata l'autenticazione sospesa (ottenendo le credenziali da GoogleWebAuthorizationBroker.AuthorizeAsync). La soluzione era utilizzare GoogleAuthorizationCodeFlow, che non è asincrono e non tenta di salvare nulla nella cartella appdata.

avevo bisogno di ottenere un token di aggiornamento, e per farlo ho seguito: Youtube API single-user scenario with OAuth (uploading videos)

Per ottenere un token di aggiornamento che può essere utilizzato più volte, si deve andare per ottenere un ID client e segreto, per un APPLICAZIONE INSTALLATA.

Le credenziali erano la parte difficile, dopo che le cose andavano bene. Una cosa da notare però, perché ho trascorso un paio d'ore cercando di scoprire cosa fosse CategoryId durante il caricamento di un video. Non riesco a trovare alcuna spiegazione reale su dove il codice di esempio ha ottenuto "22". Ho trovato 22 era l'impostazione predefinita e significava "Persone & Blog".

Heres il mio codice per qualcuno che ne ha bisogno (ho anche bisogno di essere in grado di eliminare i video di YouTube, così ho aggiunto che qui a):

public class YouTubeUtilities 
{ 
    /* 
    Instructions to get refresh token: 
    * https://stackoverflow.com/questions/5850287/youtube-api-single-user-scenario-with-oauth-uploading-videos/8876027#8876027 
    * 
    * When getting client_id and client_secret, use installed application, other (this will make the token a long term token) 
    */ 
    private String CLIENT_ID {get;set;} 
    private String CLIENT_SECRET { get; set; } 
    private String REFRESH_TOKEN { get; set; } 

    private String UploadedVideoId { get; set; } 

    private YouTubeService youtube; 

    public YouTubeUtilities(String refresh_token, String client_secret, String client_id) 
    { 
     CLIENT_ID = client_id; 
     CLIENT_SECRET = client_secret; 
     REFRESH_TOKEN = refresh_token; 

     youtube = BuildService(); 
    } 

    private YouTubeService BuildService() 
    { 
     ClientSecrets secrets = new ClientSecrets() 
     { 
      ClientId = CLIENT_ID, 
      ClientSecret = CLIENT_SECRET 
     }; 

     var token = new TokenResponse { RefreshToken = REFRESH_TOKEN }; 
     var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
      new GoogleAuthorizationCodeFlow.Initializer 
      { 
       ClientSecrets = secrets 
      }), 
      "user", 
      token); 

     var service = new YouTubeService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credentials, 
      ApplicationName = "TestProject" 
     }); 

     //service.HttpClient.Timeout = TimeSpan.FromSeconds(360); // Choose a timeout to your liking 
     return service; 
    } 

    public String UploadVideo(Stream stream, String title, String desc, String[] tags, String categoryId, Boolean isPublic) 
    { 
     var video = new Video(); 
     video.Snippet = new VideoSnippet(); 
     video.Snippet.Title = title; 
     video.Snippet.Description = desc; 
     video.Snippet.Tags = tags; 
     video.Snippet.CategoryId = categoryId; // See https://developers.google.com/youtube/v3/docs/videoCategories/list 
     video.Status = new VideoStatus(); 
     video.Status.PrivacyStatus = isPublic ? "public" : "private"; // "private" or "public" or unlisted 

     //var videosInsertRequest = youtube.Videos.Insert(video, "snippet,status", stream, "video/*"); 
     var videosInsertRequest = youtube.Videos.Insert(video, "snippet,status", stream, "video/*"); 
     videosInsertRequest.ProgressChanged += insertRequest_ProgressChanged; 
     videosInsertRequest.ResponseReceived += insertRequest_ResponseReceived; 

     videosInsertRequest.Upload(); 

     return UploadedVideoId; 
    } 

    public void DeleteVideo(String videoId) 
    { 
     var videoDeleteRequest = youtube.Videos.Delete(videoId); 
     videoDeleteRequest.Execute(); 
    } 

    void insertRequest_ResponseReceived(Video video) 
    { 
     UploadedVideoId = video.Id; 
     // video.ID gives you the ID of the Youtube video. 
     // you can access the video from 
     // http://www.youtube.com/watch?v={video.ID} 
    } 

    void insertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress) 
    { 
     // You can handle several status messages here. 
     switch (progress.Status) 
     { 
      case UploadStatus.Failed: 
       UploadedVideoId = "FAILED"; 
       break; 
      case UploadStatus.Completed: 
       break; 
      default: 
       break; 
     } 
    } 
} 

non l'ho provato, ma da quello che ho capito ApplicatioName può essere quello che vuoi. Stavo solo testando, e questo è il nome del progetto che ho in youtube per il client id e il segreto, ma penso che tu possa semplicemente mettere qualcosa?

+0

Gran parte del codice. Come hai ottenuto il token di aggiornamento senza fare un post manuale e quindi analizzare la risposta? Esistono alcuni metodi integrati per gestirli? – IanS

+0

ho fatto una richiesta manuale come hai detto tu e ho analizzato la risposta, poi l'ho usata come token di aggiornamento, come hai detto tu, se riesco a ricordare correttamente, è stato un po 'di tempo fa – iedoc

+0

Ho fatto quello che hai detto per Google Drive, e Ottengo questo errore: * Il token di accesso è scaduto ma non è possibile aggiornarlo *. –

Problemi correlati