Код ошибки YouTube API too_long для коротких ключевых слов? - PullRequest
2 голосов
/ 27 февраля 2012

Я чувствую себя действительно глупо, что нигде не могу найти этот ответ.Может кто-нибудь направить меня туда или сообщить, каковы ограничения YouTube в отношении ключевых слов?Я обнаружил, что ограничение было однажды 120 символов, но потом Я слышал, что в марте 2010 года оно изменилось на 500 символов, поэтому для меня это не должно быть проблемой, если это правда.Возможно, у меня есть еще одна проблема на руках.Может быть, кто-то мог бы помочь мне с этим ...

Я использую YouTube API для Java , используя прямую загрузку из клиентского приложения.У меня есть тонны видео, которые я пытаюсь загрузить на несколько разных аккаунтов одновременно (на разных языках).Так что я использую темы для этого.Я ограничиваю количество одновременных загрузок до 10, чтобы попытаться обезопасить себя.Ни одно из описаний не будет намного длиннее, чем 500 символов, и из-за этой ошибки, я получил ключевые слова автоматически ограничить себя до 120 символов (я даже пытался ограничить его до 70 символов, и у меня была та же проблема).Так что я совсем не уверен, почему это происходит.Ошибка, которую я получаю от Google:

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 , поэтому я не знаю, поможет ли это.Я предполагаю, что есть кое-что фундаментальное, что я упускаю.

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 (), я предполагаю, что в методе insert () на youTubeService существует новый поток, запущенный для загрузки.Это немного раздражает, потому что я никогда не уверен, в какой момент видео завершит загрузку, и если я остановлю программу до того, как она закончится, то видео остановится.

В любом случае!Спасибо за чтение всего этого!Я надеюсь, что кто-то может мне помочь!

1 Ответ

3 голосов
/ 13 марта 2012

Решение было действительно простым!Проблема была в том, что я не превышал 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();
  }
}
...