首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >缩略图上传YouTube API v3失败

缩略图上传YouTube API v3失败
EN

Stack Overflow用户
提问于 2013-08-22 13:50:37
回答 4查看 4.9K关注 0票数 2

YouTube API v3是可怕的文档。我已经多次报告了很多错误,但是没有人对此做出反应。我仍然需要使用这个API来上传缩略图。该指南指出:

POST https://www.googleapis.com/youtube/v3/thumbnails/set 8月份范围:

参数:

  • videoId: string videoId参数指定提供自定义视频缩略图的YouTube视频ID。

首先,的url是错误的,。一定是https://www.googleapis.com/upload/youtube/v3/thumbnails/set。下面是代码,它使用Unirest

代码语言:javascript
运行
复制
final HttpResponse<String> response = Unirest.post("https://www.googleapis.com/upload/youtube/v3/thumbnails/set")
                    .header("Content-Type", "application/octet-stream")
                    .header("Authorization", accountService.getAuthentication(account).getHeader())
                    .field("videoId", videoid)
                    .field("thumbnail", thumbnail)
                    .asString();

收到的答复:

代码语言:javascript
运行
复制
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Required parameter: videoId",
    "locationType": "parameter",
    "location": "videoId"
   }
  ],
  "code": 400,
  "message": "Required parameter: videoId"
 }
}

这怎么可能呢?videoId设置好了!有人已经玩过API的这一部分了吗?

我可以将请求更改为

代码语言:javascript
运行
复制
Unirest.post("https://www.googleapis.com/upload/youtube/v3/thumbnails/set?videoId=" + videoid)
                    .header("Content-Type", "application/octet-stream")
                    .header("Authorization", accountService.getAuthentication(account).getHeader())
                    .field("mediaUpload", thumbnail)
                    .asString();

这会给我带来这个错误:

代码语言:javascript
运行
复制
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "Backend Error"
   }
  ],
  "code": 503,
  "message": "Backend Error"
 }
}

编辑:与Ibrahim Ulukaya发布的URL相同的请求(参考指南中的原始网址):

代码语言:javascript
运行
复制
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "wrongUrlForUpload",
    "message": "Uploads must be sent to the upload URL. Re-send this request to https://www.googleapis.com/upload/youtube/v3/thumbnails/set"
   }
  ],
  "code": 400,
  "message": "Uploads must be sent to the upload URL. Re-send this request to https://www.googleapis.com/upload/youtube/v3/thumbnails/set"
 }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-06 21:12:14

我们研究了这个问题,如果您不想使用这个库,下面是您必须遵循的步骤。

1)用空体发布ID&uploadType=resumable

2)返回响应的位置:头中的URL,并将内容类型: image/png和正文中的缩略图发布到该URL

票数 4
EN

Stack Overflow用户

发布于 2013-08-22 14:08:43

URL将被修复。

您还需要在您的通道中拥有设置自定义缩略图的特定权限。

在我们的示例代码中有一些PHPPython示例可以工作。

这是Java 1,我刚刚编写并测试过,它可以工作。

代码语言:javascript
运行
复制
/*
 * Copyright (c) 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.api.services.samples.youtube.cmdline.youtube_cmdline_uploadthumbnail_sample;

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.java6.auth.oauth2.FileCredentialStore;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
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.YouTube.Thumbnails.Set;
import com.google.api.services.youtube.model.ThumbnailSetResponse;
import com.google.common.collect.Lists;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

/**
 * This sample uploads and sets a custom thumbnail for a video by:
 *
 *  1. Uploading a image utilizing "MediaHttpUploader" 2. Setting the uploaded image as a custom
 * thumbnail to the video via "youtube.thumbnails.set" method
 *
 * @author Ibrahim Ulukaya
 */
public class UploadThumbnail {

  /**
   * Global instance of the HTTP transport.
   */
  private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /**
   * Global instance of the JSON factory.
   */
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();

  /**
   * Global instance of Youtube object to make all API requests.
   */
  private static YouTube youtube;

  /* Global instance of the format used for the image being uploaded (MIME type). */
  private static String IMAGE_FILE_FORMAT = "image/png";



  /**
   * Authorizes the installed application to access user's protected data.
   *
   * @param scopes list of scopes needed to run youtube upload.
   */
  private static Credential authorize(List<String> scopes) throws IOException {

    // Load client secrets.
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
        new InputStreamReader(UploadThumbnail.class.getResourceAsStream("/client_secrets.json")));

    // Checks that the defaults have been replaced (Default = "Enter X here").
    if (clientSecrets.getDetails().getClientId().startsWith("Enter")
        || clientSecrets.getDetails().getClientSecret().startsWith("Enter ")) {
      System.out.println(
          "Enter Client ID and Secret from https://code.google.com/apis/console/?api=youtube"
          + "into youtube-cmdline-uploadthumbnail-sample/src/main/resources/client_secrets.json");
      System.exit(1);
    }

    // Set up file credential store.
    FileCredentialStore credentialStore = new FileCredentialStore(
        new File(System.getProperty("user.home"), ".credentials/youtube-api-uploadthumbnail.json"),
        JSON_FACTORY);

    // Set up authorization code flow.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes).setCredentialStore(credentialStore)
        .build();

    // Build the local server and bind it to port 8080
    LocalServerReceiver localReceiver = new LocalServerReceiver.Builder().setPort(8080).build();

    // Authorize.
    return new AuthorizationCodeInstalledApp(flow, localReceiver).authorize("user");
  }

  /**
   * This is a very simple code sample that looks up a user's channel, then features the most
   * recently uploaded video in the bottom left hand corner of every single video in the channel.
   *
   * @param args command line args (not used).
   */
  public static void main(String[] args) {

    // An OAuth 2 access scope that allows for full read/write access.
    List<String> scopes = Lists.newArrayList("https://www.googleapis.com/auth/youtube");

    try {
      // Authorization.
      Credential credential = authorize(scopes);

      // YouTube object used to make all API requests.
      youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(
          "youtube-cmdline-addfeaturedvideo-sample").build();

      // Get the user selected video Id.
      String videoId = getVideoIdFromUser();
      System.out.println("You chose " + videoId + " to upload a thumbnail.");

      // Get the user selected local image file to upload.
      File imageFile = getImageFromUser();
      System.out.println("You chose " + imageFile + " to upload.");

      InputStreamContent mediaContent = new InputStreamContent(
          IMAGE_FILE_FORMAT, new BufferedInputStream(new FileInputStream(imageFile)));
      mediaContent.setLength(imageFile.length());

      // Create a request to set the selected mediaContent as the thumbnail of the selected video.
      Set thumbnailSet = youtube.thumbnails().set(videoId, mediaContent);

      // Set the upload type and add event listener.
      MediaHttpUploader uploader = thumbnailSet.getMediaHttpUploader();

      /*
       * Sets whether direct media upload is enabled or disabled. True = whole media content is
       * uploaded in a single request. False (default) = resumable media upload protocol to upload
       * in data chunks.
       */
      uploader.setDirectUploadEnabled(false);

      MediaHttpUploaderProgressListener progressListener = new MediaHttpUploaderProgressListener() {
        @Override
        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);

      // Execute upload and set thumbnail.
      ThumbnailSetResponse setResponse = thumbnailSet.execute();

      // Print out returned results.
      System.out.println("\n================== Uploaded Thumbnail ==================\n");
      System.out.println("  - Url: " + setResponse.getItems().get(0).getDefault().getUrl());

    } catch (GoogleJsonResponseException e) {
      System.err.println("GoogleJsonResponseException code: " + e.getDetails().getCode() + " : "
          + e.getDetails().getMessage());
      e.printStackTrace();

    } catch (IOException e) {
      System.err.println("IOException: " + e.getMessage());
      e.printStackTrace();
    }
  }

  /*
   * Prompts for a video ID from standard input and returns it.
   */
  private static String getVideoIdFromUser() throws IOException {

    String title = "";

    System.out.print("Please enter a video Id to update: ");
    BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
    title = bReader.readLine();

    if (title.length() < 1) {
      // If nothing is entered, exits
      System.out.print("Video Id can't be empty!");
      System.exit(1);
    }

    return title;
  }

  /*
   * Prompts for the path of the image file to upload from standard input and returns it.
   */
  private static File getImageFromUser() throws IOException {

    String path = "";

    System.out.print("Please enter the path of the image file to upload: ");
    BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
    path = bReader.readLine();

    if (path.length() < 1) {
      // If nothing is entered, exits
      System.out.print("Path can not be empty!");
      System.exit(1);
    }

    return new File(path);
  }
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-17 21:05:38

代码语言:javascript
运行
复制
import requests
session = requests.session()
session.headers = {"Authorization": f"Bearer ya29..",
                   "Content-Type": "image/png"}

vid_id = "dQw4w9WgXcQ"  # video ident
edit_url = "https://www.googleapis.com/upload/youtube/v3/thumbnails/set?videoId={}&uploadType=media"

session.post(edit_url.format(vid_id), data=open("preview.png", "rb"))

python代码,为我工作过

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18382388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档