我觉得在任何地方都找不到这个答案真的很傻。有人能指引我去一个地方吗?或者告诉我YouTube对关键词的限制是什么?我发现这个限制曾经是120个字符,但后来我听说在2010年3月改为500个字符,所以如果这是真的,对我来说应该不是问题。我可能还有其他问题。也许有人可以帮我。。。
我正在使用YouTube API for Java,直接从基于客户端的应用程序上传。我有很多视频试图同时上传到几个不同的账户(每个账户都用不同的语言)。所以我使用线程来实现这一点。我将同时上传的次数限制在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文档中的内容完全一样,所以我不知道它是否会有多大帮助。我猜我遗漏了一些基本的东西。
上传到YouTuber():
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;
}
authenticateYouTuber():
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,在方法调用之后,我打印出它已经完成。有人能解释一下为什么它们会在一瞬间打印出来吗?我并没有为uploadToYouTuber()方法启动一个新线程,我猜在youTubeService上的insert()方法中,有一个新的线程为上传启动。不过这有点烦人,因为我从来都不太确定视频在什么时候完成上传,如果我在程序完成之前停止,那么视频就会停止上传。
不管怎样!感谢阅读所有这些!我希望有人能帮我!
解决方案真的很简单!问题是,尽管我的标签总数没有超过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();
}
}