Загрузите видео на YouTube с помощью приложения mvc (весь код позади)

Это просто безумие, я потратил неделю, пытаясь понять это. Все, что я нахожу, либо устарело, либо просто не работает.

Так вот что я пытаюсь сделать. У нас есть пользователи, загружающие видео, мы сохраняем видео до тех пор, пока оно не будет одобрено. после его утверждения нам нужно загрузить его на наш канал YouTube.

Образец из google: https://developers.google.com/youtube/v3/code_samples/dotnet#retrieve_my_uploads не пройдет мимо GoogleWebAuthorizationBroker.AuthorizeAsync, потому что он просто висит навсегда.

Другая проблема с этим подходом заключается в том, что нам нужен идентификатор после загрузки видео, и нам нужно знать, было ли видео загружено успешно или нет, все в синхронизации. вы увидите, просмотрев код, использующий методы async, и чтобы получить идентификатор видео, есть обратный вызов.

Кто-нибудь знает, как синхронно загружать видео в заднюю часть приложения mvc?

    Итак, первая проблема, с которой я столкнулся, – это проверка подлинности (получение учетных данных из GoogleWebAuthorizationBroker.AuthorizeAsync). Путь вокруг этого заключался в использовании GoogleAuthorizationCodeFlow, который не является асинхронным, и не пытается сохранить что-либо в папке appdata.

    Мне нужно было получить токен обновления, и для этого я следовал: однопользовательский сценарий Youtube API с OAuth (загрузка видео)

    Чтобы получить токен обновления, который можно использовать много раз, вам нужно перейти на идентификатор клиента и секрет для УСТАНОВЛЕННОГО ПРИМЕНЕНИЯ.

    Учетные данные были сложной, после этого все было в порядке. Одно дело отметить, потому что я потратил пару часов, пытаясь выяснить, что такое CategoryId при загрузке видео. Кажется, я не мог найти никакого реального объяснения того, где образец кода получил «22». Я обнаружил, что 22 был дефолтом, и имел в виду «Люди и блоги».

    Heres мой код для любого, кто ему нужен (мне также нужно было удалять видео с YouTube, поэтому я добавил это здесь):

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

    Я не пробовал, но из того, что я понимаю, ApplicatioName может быть тем, что вы хотите. Я просто тестировал, и это имя проекта, которое у меня есть в youtube для идентификатора клиента и секретности, но я думаю, что вы можете просто что-то положить?