2016-04-07 18 views
0

Ich habe Probleme beim Hinzufügen von Bildunterschriften zu Videos, die auf die Youtube-Kanäle meiner Firma hochgeladen wurden. Ich möchte es mit Googles Youtube Api v3 in .Net machen. Ich bin in der Lage, Videos erfolgreich auf die Kanäle hochzuladen, aber beim Versuch, Untertitel zu senden, erhalte ich den folgenden Fehler: "System.Net.Http.HttpRequestException: Antwortstatuscode zeigt keinen Erfolg an: 403 (Forbidden)."Hinzufügen von Bildunterschriften zu Youtube-Video mit YoutubeApi v3 in .Net

Soweit ich das beurteilen kann, verbieten mir meine Referenzen nicht das Hochladen von Bildunterschriften. Ich kann Videos problemlos hochladen.

habe ich den Aktualisierungs-Token hier die Anweisungen mit: Youtube API single-user scenario with OAuth (uploading videos)

Dies ist der Code Ich bin mit dem YouTubeService Objekt zu erstellen:

private YouTubeService GetYouTubeService() 
    { 
     string clientId = "clientId"; 
     string clientSecret = "clientSecret"; 
     string refreshToken = "refreshToken"; 
     try 
     { 
      ClientSecrets secrets = new ClientSecrets() 
      { 
       ClientId = clientId, 
       ClientSecret = clientSecret 
      }; 

      var token = new TokenResponse { RefreshToken = refreshToken }; 
      var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
       new GoogleAuthorizationCodeFlow.Initializer 
       { 
        ClientSecrets = secrets, 
        Scopes = new[] { YouTubeService.Scope.Youtube, YouTubeService.Scope.YoutubeUpload, YouTubeService.Scope.YoutubeForceSsl } 
       }), 
       "user", 
       token); 

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

      service.HttpClient.Timeout = TimeSpan.FromSeconds(360); 
      return service; 
     } 
     catch (Exception ex) 
     { 
      Log.Error("YouTube.GetYouTubeService() => Could not get youtube service. Ex: " + ex); 
      return null; 
     } 

    } 

Und hier ist der Code, den ich für das Hochladen haben Die Untertiteldatei:

private void UploadCaptionFile(String videoId) 
    { 
     try 
     { 
      Caption caption = new Caption(); 
      caption.Snippet = new CaptionSnippet(); 
      caption.Snippet.Name = videoId + "_Caption"; 
      caption.Snippet.Language = "en"; 
      caption.Snippet.VideoId = videoId; 
      caption.Snippet.IsDraft = false; 

      WebRequest req = WebRequest.Create(_urlCaptionPath); 
      using (Stream stream = req.GetResponse().GetResponseStream()) 
      { 
       CaptionsResource.InsertMediaUpload captionInsertRequest = _youtubeService.Captions.Insert(caption, "snippet", stream, "*/*"); 
       captionInsertRequest.Sync = true; 
       captionInsertRequest.ProgressChanged += captionInsertRequest_ProgressChanged; 
       captionInsertRequest.ResponseReceived += captionInsertRequest_ResponseReceived; 

       IUploadProgress result = captionInsertRequest.Upload(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Log.Error("YouTube.UploadCaptionFile() => Unable to upload caption file. Ex: " + ex); 
     } 
    } 

    void captionInsertRequest_ResponseReceived(Caption obj) 
    { 
     Log.Info("YouTube.captionInsertRequest_ResponseReceived() => Caption ID " + obj.Id + " was successfully uploaded for this clip."); 
     Utility.UpdateClip(_videoClip); 
    } 

    void captionInsertRequest_ProgressChanged(IUploadProgress obj) 
    { 
     switch (obj.Status) 
     { 
      case UploadStatus.Uploading: 
       Console.WriteLine("{0} bytes sent.", obj.BytesSent); 
       break; 

      case UploadStatus.Failed: 
       Log.Error("YouTube.UploadCaptionFile() => An error prevented the upload from completing. " + obj.Exception); 
       break; 
     } 
    } 

Ich habe die letzten paar Tage damit verbracht, an diesem Problem zu arbeiten, und ich konnte nicht mak e jeder Fortschritt. YouTubeApi v3 hat nicht viele Informationen zum Hinzufügen von Bildunterschriften. Alles, was ich finden konnte, waren einige alte Informationen für v2, die einige POST-Aufrufe erforderten, die Schlüssel erfordern, die ich nicht habe. Ich würde gerne in der Lage sein, die Bildunterschriften mit den eingebauten Methoden der API dafür hinzuzufügen.

Wenn jemand Erfahrung mit diesem Thema hat, würde ich jede Hilfe, die Sie anbieten können, sehr schätzen.

EDIT:

Hier ist mein Code für die Videos auf YouTube zu senden.

public string UploadClipToYouTube() 
    { 
     try 
     { 
      var video = new Google.Apis.YouTube.v3.Data.Video(); 
      video.Snippet = new VideoSnippet(); 
      video.Snippet.Title = _videoClip.Name; 
      video.Snippet.Description = _videoClip.Description; 
      video.Snippet.Tags = GenerateTags(); 
      video.Snippet.DefaultAudioLanguage = "en"; 
      video.Snippet.DefaultLanguage = "en"; 
      video.Snippet.CategoryId = "22"; 
      video.Status = new VideoStatus(); 
      video.Status.PrivacyStatus = "unlisted"; 

      WebRequest req = WebRequest.Create(_videoPath); 
      using (Stream stream = req.GetResponse().GetResponseStream()) 
      { 
       VideosResource.InsertMediaUpload insertRequest = _youtubeService.Videos.Insert(video, "snippet, status", stream, "video/*"); 
       insertRequest.ProgressChanged += videosInsertRequest_ProgressChanged; 
       insertRequest.ResponseReceived += videosInsertRequest_ResponseReceived; 

       insertRequest.Upload(); 
      } 
      return UploadedVideoId; 
     } 
     catch (Exception ex) 
     { 
      Log.Error("YouTube.UploadClipToYoutube() => Error attempting to authenticate for YouTube. Ex: " + ex); 
      return ""; 
     } 
    } 

    void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress) 
    { 
     switch (progress.Status) 
     { 
      case UploadStatus.Uploading: 
       Log.Info("YouTube.videosInsertRequest_ProgressChanged() => Uploading to Youtube. " + progress.BytesSent + " bytes sent."); 
       break; 

      case UploadStatus.Failed: 
       Log.Error("YouTube.videosInsertRequest_ProgressChanged() => An error prevented the upload from completing. Exception: " + progress.Exception); 
       break; 
     } 
    } 

    void videosInsertRequest_ResponseReceived(Google.Apis.YouTube.v3.Data.Video video) 
    { 
     Log.Info("YouTube.videosInsertRequest_ResponseReceived() => Video was successfully uploaded to YouTube. The YouTube id is " + video.Id); 
     UploadedVideoId = video.Id; 
     UploadCaptionFile(video.Id); 
    } 
+0

Wenige Fragen. In Bezug auf die Authentifizierung verwenden Sie den gleichen Prozess wie beim Upload? Da der Fehler * 403 * nicht erlaubt ist (das ist offensichtlich, aber ich denke, es lohnt sich auch zu fragen), stimmen Ihre Caption-Daten mit [Einschränkungen] überein (https://developers.google.com/youtube/v3/docs/captions/insert) #anfordern). Außerdem habe ich das [ähnliche Beitrag] (http://stackoverflow.com/questions/31823160/uploading-captions-using-youtube-api-v3-dotnet-c-null-error-challenging) gesehen, nur Unterschied ist Der Fehler, den er empfängt, hast du versucht, seine Codes zu überprüfen? :) –

+0

Der Video-Upload-Prozess ist fast identisch mit dem Hochladen von Bildtiteln. Ich werde meinen ursprünglichen Beitrag mit dem Video-Upload-Prozess aktualisieren, den ich verwende. Ich habe "YouTubeService.Scope.YoutubeForceSsl" als einen der Bereiche beim Erstellen der Anmeldeinformationen, also sollte alles den Einschränkungen entsprechen. Ich habe mir diesen ähnlichen Beitrag angesehen; Tatsächlich ist einer der Replikatoren ein ehemaliger Mitarbeiter, der an diesem Projekt arbeitete, bevor er ging und ich übernahm. Leider funktioniert der von ihm gepostete Code nicht. – Chelsea

+1

@Chelsea Dies ist nicht 'v3'. Version 3 verwendet 'GoogleWebAuthorizationBroker' und' FileDataStore' für Oauth ... Es verwendet auch 'warten' und' async' Operationen, die das Sperren der Anwendung verhindern. Erhalten Sie die neue Version möglicherweise mit den alten Versionen gemischt? Ich vermute auch, dass Sie keinen Benutzernamen für Ihre Anfrage angeben, dies ist möglich für die Fehler oder Sie haben dies aus Sicherheitsgründen weggelassen ... – Codexer

Antwort

1

Okay, peitschte ich etwas wirklich schnell für Sie up (ehrlich ca. 15 Minuten), die ich von Java übersetzt. Zuerst gibt es mehr als ein paar Dinge, die ich mit Ihrem aktuellen Code bemerkt habe, aber das ist nicht CodeReview.

Die YouTubeApi v3 enthält nicht viele Informationen zum Hinzufügen von Bildunterschriften. Alles, was ich war konnte finden einige alte Informationen für v2

Sie diesen korrekt sind, ist es zu diesem Zeitpunkt nicht (v3) tut, aber in naher Zukunft hoffentlich irgendwann. Das hält uns nicht davon ab v2 Modifizierungs obwohl zu unserem Vorteil wie die api sehr ähnlich sind ...

-Code & Geprüft Versuchte

private async Task addVideoCaption(string videoID) //pass your video id here.. 
     { 
      UserCredential credential; 
      //you should go out and get a json file that keeps your information... You can get that from the developers console... 
      using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) 
      { 
       credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets, 
        new[] { YouTubeService.Scope.YoutubeForceSsl, YouTubeService.Scope.Youtube, YouTubeService.Scope.Youtubepartner }, 
        "ACCOUNT NAME HERE", 
        CancellationToken.None, 
        new FileDataStore(this.GetType().ToString()) 
       ); 
      } 
      //creates the service... 
      var youtubeService = new Google.Apis.YouTube.v3.YouTubeService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = this.GetType().ToString(), 
      }); 

      //create a CaptionSnippet object... 
      CaptionSnippet capSnippet = new CaptionSnippet(); 
      capSnippet.Language = "en"; 
      capSnippet.Name = videoID + "_Caption"; 
      capSnippet.VideoId = videoID; 
      capSnippet.IsDraft = false; 

      //create new caption object 
      Caption caption = new Caption();  

      //set the completed snippet to the object now... 
      caption.Snippet = capSnippet; 

      //here we read our .srt which contains our subtitles/captions... 
      using (var fileStream = new FileStream("filepathhere", FileMode.Open)) 
      { 
       //create the request now and insert our params... 
       var captionRequest = youtubeService.Captions.Insert(caption, "snippet",fileStream,"application/atom+xml"); 

       //finally upload the request... and wait. 
       await captionRequest.UploadAsync(); 
      } 

     } 

Hier ist ein Beispiel .srt Datei, wenn Sie nicht wissen, wie ein Aussehen aussieht oder wie es formatiert ist.

1 
00:00:00,599 --> 00:00:03,160 
>> Caption Test [email protected] StackOverflow 

2 
00:00:03,160 --> 00:00:05,770 
>> If you're reading this it worked! 

YouTube Video Proof. Es ist ein kurzer Clip von ungefähr 5 Sekunden, um Ihnen zu zeigen, dass es funktioniert und wie es aussieht. UND...Nein Das Video ist nicht von mir, packte sie zum Testen NUR :)

Viel Glück und glücklich Programmierung!

+0

Vielen Dank! Mein Programm funktioniert jetzt! – Chelsea

+0

Willkommen, froh, dass ich helfen konnte! – Codexer

+0

In diesem Abschnitt: Credential = erwarten GoogleWebAuthorizationBroker.AuthorizeAsync ( GoogleClientSecrets.Load (Strom) .Secrets, new [] {YouTubeService.Scope.YoutubeForceSsl, YouTubeService.Scope.Youtube, YouTubeService.Scope.Youtubepartner}, NAME „Account hier ", CancellationToken.None, neuer FileDataStore (this.GetType(). ToString()) ); –