短关键字上的YouTube API too_long错误代码?

时间:2012-02-27 16:30:38

标签: java client youtube-api gdata

我觉得无法在任何地方找到这个答案真的很傻。有人可以指示我到某个地方或告诉我YouTube关键字的限制是什么吗? 我发现限制一次是120个字符,但是在2010年3月的I heard it changed到500个字符,所以如果这是真的那对我来说应该不是问题。我可能手上还有另一个问题。也许有人可以帮助我... ...

我在基于客户端的应用程序中使用YouTube API for Java direct upload。我有很多视频我试图一次上传到几个不同的帐户(每个都用不同的语言)。所以我使用线程来实现这一目标。我将并发上传的数量限制为10只是为了尝试安全地播放它。没有任何描述会超过500个字符,因为我得到的这个错误,我有关键字自动限制为120个字符(我甚至试图将其限制为70个字符,并有同样的问题)。所以,我不确定为什么会发生这种情况。我从谷歌那里得到的错误是:

SEVERE: null
com.google.gdata.util.InvalidEntryException: Bad Request
<?xml version='1.0' encoding='UTF-8'?>
  <errors>
    <error>
      <domain>yt:validation</domain>
      <code>too_long</code>
      <location type='xpath'>media:group/media:keywords/text()</location>
    </error>
  </errors>

我也将InvalidEntryException作为错误代码,但我稍后会处理(我认为它与我的身份验证超时有关)。

无论如何,我没有在每个视频上收到此错误。事实上,大多数视频都很好。我还没有测试过发现哪些视频丢失了错误(当我完成这篇文章时我会这样做),但是为什么我会收到这个错误。我会在这里发布我的代码,但它几乎就是api documentation上的代码,所以我不知道它是否会有很多帮助。我猜我有一些基本的东西。

uploadToYouTube():

  private void uploadToYouTube() throws IOException, ServiceException {
    TalkContent talkContent = transfer.getTalkContent();
    YouTubeService youTubeService = talkContent.getLanguage().getYouTubeService(); //see code for this below...

    String title = talkContent.getTitle();
    String category = talkContent.getCategory();
    String description = talkContent.getDescription();
    List<String> tags = talkContent.getTags();
    boolean privateVid = true;

    VideoEntry newEntry = new VideoEntry();
    YouTubeMediaGroup mg = newEntry.getOrCreateMediaGroup();

    //Title
    mg.setTitle(new MediaTitle());
    mg.getTitle().setPlainTextContent(title);

    //Description
    mg.setDescription(new MediaDescription());
    mg.getDescription().setPlainTextContent(description);

    //Categories and developer tags
    mg.addCategory(new MediaCategory(YouTubeNamespace.CATEGORY_SCHEME, category));
    mg.addCategory(new MediaCategory(YouTubeNamespace.DEVELOPER_TAG_SCHEME, "kentcdodds"));
    mg.addCategory(new MediaCategory(YouTubeNamespace.DEVELOPER_TAG_SCHEME, "moregoodfoundation"));

    //Keywords
    mg.setKeywords(new MediaKeywords());
    int tagLimit = 70; // characters
    int totalTags = 0; //characters
    for (String tag : tags) {
      if ((totalTags + tag.length()) < tagLimit) {
        mg.getKeywords().addKeyword(tag);
        totalTags += tag.length();
      }
    }

    //Visible status
    mg.setPrivate(privateVid);

    //GEO coordinantes
    newEntry.setGeoCoordinates(new GeoRssWhere(40.772555, -111.892480));

    MediaFileSource ms = new MediaFileSource(new File(transfer.getOutputFile()), transfer.getYouTubeFileType());
    newEntry.setMediaSource(ms);

    String uploadUrl = "http://uploads.gdata.youtube.com/feeds/api/users/default/uploads";

    VideoEntry createdEntry = youTubeService.insert(new URL(uploadUrl), newEntry);
    status = Transfer.FINISHEDUP;
  }

getYouTubeService():

  public YouTubeService getYouTubeService() {
    if (youTubeService == null) {
      try {
        authenticateYouTube();
      } catch (AuthenticationException ex) {
        JOptionPane.showMessageDialog(null, "There was an authentication error!" + StaticClass.newline + ex, "Authentication Error", JOptionPane.ERROR_MESSAGE);
        Logger.getLogger(Language.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return youTubeService;
  }

authenticateYouTube():

  public void authenticateYouTube() throws AuthenticationException {
    if (youTubeService == null) {
      System.out.println("Authenticating YouTube Service");
      youTubeService = new YouTubeService("THENAMEOFMYPROGRAM", "THEDEVELOPERIDHERE");
      youTubeService.setUserCredentials(youTubeUsername, youTubePassword);
      System.out.println("Authentication of YouTube Service succeeded");
    }
  }

对此的任何帮助都会很棒!此外,在我调用uploadToYouTube()方法之前,我打印出视频正在上传到YouTube,并在方法调用后打印出它已完成。有人可以解释为什么那些是在彼此的瞬间打印出来的吗?我没有为uploadToYouTube()方法启动一个新线程,我猜测在youTubeService上的insert()方法中有一个为上传启动的新线程。这有点令人讨厌,因为我从来都不确定视频在什么时候完成上传,如果我在程序结束前停止播放,那么视频就会停止上传。

反正!感谢阅读所有这些!我希望有人可以帮助我!

1 个答案:

答案 0 :(得分:3)

解决方案非常简单!问题是即使我没有超过500个字符的总标签限制,但有时我超过每个标签30个字符的限制!我刚刚将标记添加行更改为以下代码:

//Keywords
mg.setKeywords(new MediaKeywords());
int totalTagsLimit = 500; // characters
int singleTagLimit = 30; // characters
int totalTags = 0; //characters
for (String tag : tags) {
  if ((totalTags + tag.length()) < totalTagsLimit && tag.length() < singleTagLimit) {
    mg.getKeywords().addKeyword(tag);
    totalTags += tag.length();
  }
}