2014-12-22 12 views
6

To jest po prostu szalone, spędziłem tydzień teraz próbując to zrozumieć. Wszystko, co znajduję, jest albo przestarzałe, albo po prostu nie działa.Załaduj film na youtube z aplikacją mvc (cały kod za)

Więc to właśnie próbuję zrobić. Mamy użytkowników do przesłania wideo, przechowujemy wideo, dopóki nie zostanie zatwierdzony. po zatwierdzeniu musimy przesłać go na nasz kanał YouTube.

Próbka z Google: https://developers.google.com/youtube/v3/code_samples/dotnet#retrieve_my_uploads nie przejdzie przez GoogleWebAuthorizationBroker.AuthorizeAsync, ponieważ po prostu zawiesza się na zawsze.

Kolejnym problemem związanym z tym podejściem jest to, że potrzebujemy identyfikatora po przesłaniu filmu i musimy wiedzieć, czy film został przesłany pomyślnie, czy nie, wszystko zsynchronizowane. zobaczysz, patrząc na kod, który używa metod asynchronicznych i aby uzyskać identyfikator wideo, jest wywołanie zwrotne.

Czy ktoś ma pojęcie, jak przesłać wideo z tyłu aplikacji mvc synchronicznie?

Odpowiedz

7

Ok, więc pierwszym problemem, który miałem, było uwierzytelnienie (pobieranie danych z GoogleWebAuthorizationBroker.AuthorizeAsync). Sposób obejścia tego polegał na użyciu algorytmu GoogleAuthorizationCodeFlow, który nie jest asynchroniczny i nie próbuje zapisać niczego w folderze appdata.

Musiałem dostać token odświeżania, a aby to zrobić i następnie: Youtube API single-user scenario with OAuth (uploading videos)

Aby otrzymać token odświeżania, które mogą być używane wielokrotnie, trzeba przejść, aby uzyskać identyfikator klienta i tajemnicy za ZAINSTALOWANA APLIKACJA.

Poświadczenia były trudną częścią, po tym czasie wszystko było w porządku. Należy jednak pamiętać, ponieważ spędziłem kilka godzin próbując dowiedzieć się, jakie było kryterium CategoryId podczas przesyłania filmu. Nie mogłem znaleźć żadnego prawdziwego wyjaśnienia, skąd przykładowy kod otrzymał "22". Znalazłem 22, było domyślne i oznaczało "Ludzie & Blogi".

Herezje mój kod dla każdego, który potrzebuje go (ja też potrzebne, aby móc usunąć youtube, więc dodaliśmy że tu do):

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; 
     } 
    } 
} 

nie próbowałem, ale z tego, co rozumiem, ApplicatioName może być cokolwiek chcesz. Właśnie testowałem i jest to nazwa projektu, którą mam w serwisie youtube dla identyfikatora klienta i sekretu, ale myślę, że możesz po prostu coś umieścić?

+0

Świetny kawałek kodu. W jaki sposób otrzymałeś token odświeżania bez ręcznego pisania, a następnie analizowania odpowiedzi? Czy istnieje kilka wbudowanych metod radzenia sobie z tym? – IanS

+0

Zrobiłem ręczną prośbę, tak jak powiedziałeś i przeanalizowałeś odpowiedź, a potem użyłeś tego jako tokena odświeżania, tak jak powiedziałeś, jeśli i tak dobrze pamiętam, to było chwilę temu – iedoc

+0

Zrobiłem to, co powiedziałeś na Dysku Google, i Otrzymuję ten błąd: * Token dostępu wygasł, ale nie możemy go odświeżyć *. –

Powiązane problemy