API данных YouTube позволяет клиентским приложениям просматривать содержание YouTube в виде каналов API данных Google. Клиентское приложение может использовать каналы API данных Google для получения каналов видео, комментариев, ответов, плейлистов, а также в качестве запроса для поиска видео, отвечающих определенным критериям. API можно использовать для создания аутентифицированных запросов для изменения информации и добавления на сайт новых видео.
Помимо некоторых сведений о возможностях API данных YouTube, в этом документе можно найти примеры взаимодействия с API с помощью клиентской библиотеки Java. О настройке клиентской библиотеки Java см. в Руководстве по началу работы.
Подробнее о протоколе, используемом клиентской библиотекой Java для взаимодействия с YouTube, см. в Руководстве по протоколу.
Этот документ рассчитан на программистов, которые планируют писать клиентские приложения, взаимодействующие с YouTube с помощью клиентской библиотеки Java. Здесь приведены примеры основных взаимодействий API данных.
Справочную информацию по API данных YouTube можно найти в справочном руководстве.
Подразумевается, что вы понимаете основные принципы протокола API данных Google и знаете Java.
Справочную информацию о классах и методах Java можно найти в справочном руководстве Javadoc клиентской библиотеки.
Этот документ содержит следующие разделы:
Раздел Аутентификация описывает два различных способа аутентификации, которые можно применять для связи операций API с аккаунтом определенного пользователя. В этом разделе также упоминается о разнице между аутентификацией для API данных YouTube и другими API GData. В объяснениях для каждой функции API будет четко сказано, требует ли функция аутентификации пользователя.
Раздел Видео каналы и записи содержит пример ответа API и рассказывает, как извлекать информацию об одном видео из списка видео или набора результатов поиска. Из этого раздела также можно узнать, как получить метаданные об определенном видео.
Раздел Поиск и получение видео объясняет, как получить список видео. API данных YouTube определяет несколько типов стандартных каналов, например, видео с лучшими оценками или лидеры просмотров. Этот раздел рассказывает также о том, как получить список видео, добавленных определенным пользователем или список похожего видео. Наконец, этот раздел описывает, как использовать API для того, чтобы пользователи могли искать в библиотеке YouTube видео, соответствующие определенным ключевым словам или категориям.
Раздел Загрузка видео кратко рассматривает два способа, которыми пользователи могут загружать видео на YouTube из вашего приложения. Этот раздел также рассказывает, как дать пользователям возможность удалять видео из своего приложения. Эти решения более подробно описаны в Руководстве по протоколу. Для использования некоторых функций API может быть необходимо позволить пользователям загружать видео. Например, API обеспечивает функцию добавления видеоответа к видео. Однако, если пользователь добавляет новое видео в качестве видеоответа, ваш клиент должен следовать руководству по добавлению видео и добавить видео на YouTube, прежде чем определить его как ответ на уже существующее видео.
Раздел Обновление и удаление видео описывает, как использовать API для обновления информации о видео YouTube. Он также расскажет, как удалить видео с помощью API.
Раздел Использование функций сообществ описывает функции API, позволяющие вашим пользователям взаимодействовать с видео на YouTube. Эти функции поясняют запросы для размещения оценки, комментария, видеоответа или жалобы на существующее видео. API можно также использовать для получения списков комментариев к видео или видеоответов, или для удаления видеоответа.
Раздел Сохранение и сбор видео расскажет об использовании API для доступа, создания и обновления избранного видео, плейлистов и подписок на каналы YouTube.
В разделе Взаимодействие пользователей объясняется, как, пользуясь API, получать и обновлять профили пользователей. Этот раздел также рассказывает, как получать, добавлять, обновлять и удалять контакты пользователя, а также как получать, отправлять и удалять сообщения.
О настройке клиентской библиотеки Java можно см. в Руководстве по началу работы. Для использования клиентской библиотеки Java необходимо использовать Java 1.5. Загрузив клиентскую библиотеку, вы найдете необходимые для начала классы в файлах java/lib/gdata-client-1.0.jar и java/lib/gdata-youtube-1.0.jar.
Полностью рабочая копия примера кода доступна в дистрибутиве по адресу gdata/java/sample/youtube/YouTubeClient.java. Инструкции по сборке и выполнению находятся в том же каталоге в файле README.txt. Этот пример выполняет некоторое количество операций на каналах API данных YouTube, иллюстрируя использование API. Список выполняемых операций см. в методе main примера клиентского приложения.
Для компиляции примеров из этого документа в свой код, нужно импортировать следующие модули:
import com.google.gdata.client.*; import com.google.gdata.client.youtube.*; import com.google.gdata.data.*; import com.google.gdata.data.geo.impl.*; import com.google.gdata.data.media.*; import com.google.gdata.data.media.mediarss.*; import com.google.gdata.data.youtube.*; import com.google.gdata.data.extensions.*; import com.google.gdata.util.*; import java.io.IOException; import java.io.File; import java.net.URL;
Клиентская библиотека Java может использоваться для работы как с публичными, так и с частными каналами. Публичные каналы доступны только для чтения и не требуют аутентификации. Некоторые каналы YouTube доступны без аутентификации, но для всех изменений канала требуется аутентификация. Аутентификация возможна через прокси AuthSub или с помощью имени пользователя и пароля ClientLogin.
Для того, чтобы выполнять любые операции записи и загрузки с помощью API YouTube, нужно создать экземпляр объекта YouTubeService с идентификатором клиента и ключом разработчика, следующим образом:
YouTubeService service = new YouTubeService(clientID, developer_key);
Если у вас нет ключа разработчика, вы можете подать заявку на его получение. На этой странице также можно получить идентификатор клиента.
Подробнее о AuthSub и ClientLogin см. в документации по аутентификации.
Для получения идентификатора AuthSub для данного пользователя и данной службы, приложение должно перенаправить пользователя на URL AuthSubRequest, который предложит ему зайти в свой аккаунт Google.
Подробнее о URL AuthSubRequest см. в документации AuthSub.
Для создания URL AuthSubRequest для своего приложения, сделайте вызов к клиентской библиотеке Java следующим образом:
String requestUrl =
AuthSubUtil.getRequestUrl("http://www.example.com/RetrieveToken",
"http://gdata.youtube.com",
false,
true);
Метод getRequestUrl принимает несколько параметров (соответствующих параметрам запросов, использующихся обработчиком AuthSubRequest): URL "next" (это URL, на который Google перенаправит пользователя после входа в аккаунт и получения доступа); диапазон (определенный в предыдущем разделе); и две логических переменных, одна, означающая, будет ли идентификатор использоваться в регистрированном режиме или нет, и вторая, означающая, будет ли идентификатор впоследствии обмениваться на идентификатор сеанса. Пример выше иллюстрирует вызов в незарегистрированном режиме (первая переменная – false), для получения идентификатора, который будет позже обмениваться на идентификатор сеанса (вторая переменная – true); измените переменные соответственно вашему приложению.
После создания URL "next", ваше приложение со стороны сервера может его использовать несколькими способами для отправки пользователя к обработчику AuthSubRequest. Самый распространенный подход – отображать страницу, сообщающую пользователю, что ему нужно перейти по ссылке, чтобы дать вашему приложению доступ к его аккаунту Google, а затем привязать к ссылке URL запроса. Например, на странице можно отобразить следующую строку:
String suggestAuthorization = "<p>MyApp needs access to your YouTube account. To authorize MyApp to access your account, <a href=\"" + requestUrl + "\">log in to your account</a>.</p>";
Пользователь переходит по ссылке на страницу AuthSub на Google и входит в систему. Система AuthSub перенапрвляет пользователя обратно к вашему приложению, используя указанный вами URL "next".
При перенаправлении от Google к вашему приложению идентификатор присоединяется к URL "next" как параметр запроса. Поэтому, в случае приведенного выше URL "next", после входа пользователя Google перенаправит его на такой URL http://www.example.com/RetrieveToken?token=DQAADKEDE.
Браузер пользователя перенаправляется на этот URL. Сервлет, обрабатывающий этот URL, должен изучить параметры запроса в URL запроса, чтобы получить идентификатор, выставленный Google. Например, сервлет может получить идентификатор из URL, используя вспомогательную функцию getTokenFromReply из клиентской библиотеки Java:
String onetimeUseToken = AuthSubUtil.getTokenFromReply(httpServletRequest.getQueryString());
Ваше приложение может определить, какой пользователь аутентифицировался на серверах Google с помощью AuthSub, установив файл cookie, прежде чем он нажмет ссылку AuthSub, а затем прочитать этот файл cookie после того, как пользователь аутентифицировался и вернулся на вашу страницу.
Полученный идентификатор с getTokenFromReply всегда одноразовый. Его можно обменять на идентификатор сеанса с помощью URL AuthSubSessionToken, согласно документации AuthSub. Приложение может осуществить этот обмен с помощью клиентской библиотеки Java следующим образом:
String sessionToken = AuthSubUtil.exchangeForSessionToken(onetimeUseToken,
null);
Вы передаете одноразовый идентификатор методу exchangeForSessionToken, вместе с null (для незарегистрированного режима) или личный ключ (для зарегистрированного режима), а интерфейс AuthSub возвращает идентификатор сеанса. Дополнительную информацию о зарегистрированных приложениях и частных ключах можно найти в документации AuthSub.
Идентификатор сеанса можно использовать для аутентификации запросов серверу, поместив идентификатор в заголовок Authorization, см. документацию AuthSub. Для того, чтобы клиентская библиотека Java автоматически отправила с каждым запросом заголовок Authorization (содержащий идентификатор сеанса), нужно вызвать метод setAuthSubToken объекта YouTubeService:
YouTubeService service = new YouTubeService(clientID, developer_key); service.setAuthSubToken(sessionToken, null);
Если вы используете зарегистрированный режим, вместо null нужно добавить свой личный ключ. Заметьте, что конструктору YouTubeService необходимо передать идентификатор клиента и ключ разработчика.
Вызвав setAuthSubToken, можно воспользоваться стандартными вызовами клиентской библиотеки GData для взаимодействия со службой, не задумываясь более об идентификаторе.
Если вы хотите получить информацию о параметрах идентификатора, его можно передать методу getTokenInfo, возвращающему набор пар имя-значение, содержащий сведения об идентификаторе. Например:
Map<String, String> info = AuthSubUtil.getTokenInfo(sessionToken, null);
Идентификаторы сеанса AuthSub не имеют срока действия; ваш клиент может хранить идентификатор сеанса сколько угодно.
Когда клиент закончил его использовать, он может отозвать идентификатор, используя обработчик AuthSubRevokeToken, согласно документации AuthSub.
Например, если вы хотите управлять идентификаторами обычным способом, как, например, сеансами, ваш клиент может получать идентификатор в начале сеанса пользователя и отзывать его в конце сеанса.
Для отзыва идентификатора с помощью клиентской библиотеки Java, вызовите revokeToken. Для зарегистрированного режима включите свой личный ключ, либо null в противном случае. Например:
AuthSubUtil.revokeToken(sessionToken, null);
Для использования ClientLogin (также называемого "Аутентификация для установленных приложений"), вызовите метод setUserCredentials YouTubeService, указав идентификатор и пароль пользователя, от имени которого клиент отправляет запрос. Например:
YouTubeService service = new YouTubeService(clientID, developer_key);
service.setUserCredentials("jo@gmail.com", "password");
Заметьте, что объекту YouTubeService необходимо также предоставить идентификатор клиента и ключ разработчика, чтобы выполнять операции записи и получать частные каналы, используя API YouTube. Если у вас нет ключа разработчика, можно подать заявку на его получение.
Более подробные сведения о системах аутентификации можно найти в документации Аутентификация аккаунта Google.
API данных YouTube предоставляет несколько каналов видео, таких как стандартные каналы, загрузки, подписки и избранные. URL всех каналов приведены в справочном руководстве.
Многие каналы в API YouTube состоят из видео. Эти каналы проще всего смоделировать как объекты VideoFeed, каждый из которых содержит несколько объектов VideoEntry. Каждая запись видео соответствует строго одному видео на YouTube и содержит информацию о видео.
Основная схема получения списка видео – собрать URL на канал видео и обработать записи по одной, как в этом коде:
VideoFeed videoFeed = service.getFeed(new URL(feedUrl), VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
В разделе Поиск и получение видео приведены URL многих обычных каналов и сведения о том, как получать различные каналы видео.
Получить сведения об определенном видео можно, если вы знаете его собственную ссылку, которая является элементом link с записью Atom, описывающей видео, при этом атрибут rel имеет значение self. Собственная ссылка – это URL, основанный на идентификаторе видео.
http://gdata.youtube.com/feeds/api/videos/videoID
Собственная ссылка видео совпадает с идентификатором записи в элементе id.
Следующий код получает VideoEntry, соответствующее видео на YouTube:
String videoEntryUrl = "http://gdata.youtube.com/feeds/api/videos/ADos_xW4_J0";
VideoEntry videoEntry = service.getEntry(new URL(videoEntryUrl), VideoEntry.class);
System.out.println("Title: " + videoEntry.getTitle().getPlainText());
System.out.println(videoEntry.getMediaGroup().getDescription().getPlainTextContent());
Из объекта VideoEntry можно получить массу метаданных, например, эскизы изображений, URL проигрывателя и длительность видео. Следующий код показывает, как получить часть этой информации. Полный список возможных элементов XML можно найти в справочном руководстве.
System.out.println("Title: " + videoEntry.getTitle().getPlainText());
YouTubeMediaGroup mediaGroup = videoEntry.getMediaGroup();
System.out.println("Description: " + mediaGroup.getDescription().getPlainTextContent());
MediaPlayer mediaPlayer = mediaGroup.getPlayer();
System.out.println("Web Player URL: " + mediaPlayer.getUrl());
MediaKeywords keywords = mediaGroup.getKeywords();
System.out.print("Keywords: ");
for(String keyword : keywords.getKeywords()) {
System.out.print(keyword + ",");
}
GeoRssWhere location = videoEntry.getLocation();
if(location != null) {
System.out.println("Latitude: " + location.getLatitude());
System.out.println("Longitude: " + location.getLongitude());
}
Rating rating = videoEntry.getRating();
if(rating != null) {
System.out.println("Average rating: " + rating.getAverage());
}
YtStatistics stats = videoEntry.getStatistics();
if(stats != null ) {
System.out.println("View count: " + stats.getViewCount());
}
System.out.println();
System.out.println("\tThumbnails:");
for(MediaThumbnail mediaThumbnail : mediaGroup.getThumbnails()) {
System.out.println("\t\tThumbnail URL: " + mediaThumbnail.getUrl());
System.out.println("\t\tThumbnail Time Index: " +
mediaThumbnail.getTime());
System.out.println();
}
System.out.println("\tMedia:");
for(YouTubeMediaContent mediaContent : mediaGroup.getYouTubeContents()) {
System.out.println("\t\tMedia Location: "+ mediaContent.getUrl());
System.out.println("\t\tMedia Type: "+ mediaContent.getType());
System.out.println("\t\tDuration: " + mediaContent.getDuration());
System.out.println();
}
API данных YouTube создает стандартные каналы видео на основании разных критериев. Это каналы в масштабах сайта, они не относятся к определенным пользователям. URL всех стандартных каналов начинаются с http://gdata.youtube.com/feeds/api/standardfeeds/, а затем идет идентификатор канала. Вот таблица доступных каналов:
| Название канала | Идентификатор канала |
|---|---|
| Лидеры просмотров | most_viewed |
| Лучшие оценки | top_rated |
| В центре внимания | recently_featured |
| Смотреть на телефоне | watch_on_mobile |
| Лидеры обсуждений | most_discussed |
| Лидеры в избранном | top_favorites |
| Лидеры по ссылкам | most_linked |
| Лидеры по ответам | most_responded |
| Последние добавления | most_recent |
Указав в формате localeID, можно получать стандартные каналы для определенного места: http://gdata.youtube.com/feeds/api/standardfeeds/localeID/feedID. Например, лидеры просмотров в Японии выглядят так: http://gdata.youtube.com/feeds/api/standardfeeds/JP/most_viewed.
Пример ниже выводит названия и описания самых просматриваемых видео на сайте:
String feedUrl = "http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed";
VideoFeed videoFeed = service.getFeed(new URL(feedUrl), VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
Каждый пользователь YouTube имеет связанный с ним канал видео, соответствующий видео, которые он загрузил, по адресу /feeds/api/users/userID/uploads. Следующий код выводит названия и описания видео, добавленных пользователем "GoogleDevelopers".
String feedUrl = "http://gdata.youtube.com/feeds/api/users/GoogleDevelopers/uploads";
VideoFeed videoFeed = service.getFeed(new URL(feedUrl), VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
Для аутентифицированного в настоящий момент пользователя можно использовать имя пользователя "default". Для получения видео аутентифицированного пользователя, таким образом, следует использовать URL http://gdata.youtube.com/feeds/api/users/default/uploads.
Каждое видео в канале видео имеет ссылку на другой канал видео, содержащий все похожее видео, по определению YouTube. Следующий код показывает, как получить и вывести сведения о похожем видео определенной VideoEntry.
if (videoEntry.getRelatedVideosLink() != null) {
String feedUrl = videoEntry.getRelatedVideosLink().getHref();
VideoFeed videoFeed = service.getFeed(new URL(feedUrl), VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
}
API данных YouTube позволяет запрашивать набор записей, соответствующих определенным критериям, например, видео, опубликованные каким-либо автором или содержащие некоторое ключевое слово. Для этого создайте объект YouTubeQuery и передайте его методу YouTubeService.query().
Например, для выполнения поиска по ключевому слову, с сортировкой результатов по числу просмотров, в том числе видео с ограниченным доступом, используйте методы setVideoQuery, setOrderBy и setIncludeRacy объекта YouTubeQuery. Следующий фрагмент кода выводит названия и описания всех видео, соответствующих ключевому слову "puppy", отсортированные по количеству просмотров и включающие видео с ограниченным доступом:
YouTubeQuery query = new YouTubeQuery(new URL("http://gdata.youtube.com/feeds/api/videos"));
// order results by the number of views (most viewed first)
query.setOrderBy(YouTubeQuery.OrderBy.VIEW_COUNT);
// do not exclude restricted content from the search results
query.setIncludeRacy(true);
//search for puppies!
query.setVideoQuery("puppy");
VideoFeed videoFeed = service.query(query, VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
Класс Query и подклассы подобные YouTubeQuery отвечают за создание URL каналов. YouTubeQuery выше создает URL, эквивалентный следующему:
http://gdata.youtube.com/feeds/api/videos?vq=keyword&racy=include&orderby=viewCount
Вот наиболее часто встречающиеся методы YouTubeQuery для установки параметров поиска:
setAuthorsetMaxResultssetStartIndexsetVideoQuerysetIncludeRacysetFormatsetOrderByRELEVANCE, VIEW_COUNT, UPDATED или RATING.setTimeTODAY, THIS_WEEK, THIS_MONTH или ALL_TIME.Более подробные сведения о параметрах запросов можно найти в Справочном руководстве API данных YouTube и Справочном руководстве API данных Google.
Результаты поиска можно ограничить только тем видео, которое соответствуют определенному набору категорий и ключевых слов. Справочное руководство рассказывает, как указать существующие категории YouTube и определяемые пользователем ключевые слова, которые также называют тегами.
Следующий код показывает, как искать с помощью ключевых слов, что соответствует использованию категоризации KEYWORD_SCHEME, и как искать с помощью категорий YouTube, что соответствует категоризации CATEGORY_SCHEME. Помните, что каждое видео может иметь несколько ключевых слов, но только одну категорию.
YouTubeQuery query = new YouTubeQuery(new URL("http://gdata.youtube.com/feeds/api/videos"));
// a category filter holds a collection of categories to limit the search
Query.CategoryFilter categoryFilter1 = new Query.CategoryFilter();
Query.CategoryFilter categoryFilter2 = new Query.CategoryFilter();
//this restricts to videos tagged with the keyword "puppy".
categoryFilter1.addCategory(new Category(YouTubeNamespace.KEYWORD_SCHEME, "puppy"));
//this restricts to videos in the category of "Comedy".
categoryFilter2.addCategory(new Category(YouTubeNamespace.CATEGORY_SCHEME, "Comedy"));
// multiple filters mean "AND" in a category query
query.addCategoryFilter(categoryFilter1);
query.addCategoryFilter(categoryFilter2);
VideoFeed videoFeed = service.query(query, VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
Код выше получает все видео в категории Comedy ("Комедия") и имеют ключевое слово "puppy". Если вы хотите получать видео, относящиеся к категории "Comedy" либо имеющие ключевое слово "puppy", можно просто использовать один CategoryFilter, содержащий оба объекта Category.
Список используемых категорий можно найти здесь: http://gdata.youtube.com/schemas/2007/categories.cat.
Теги разработчика – это дополнительные, скрытые ключевые слова, которые разработчик может использовать для отметки добавленного им содержимого. Эти ключевые слова не видны пользователям, но их можно использовать для получения видео. Следующий код получает канал всех видео с тегом разработчика "xyzzy":
YouTubeQuery query = new YouTubeQuery(new URL("http://gdata.youtube.com/feeds/api/videos"));
Query.CategoryFilter categoryFilter = new Query.CategoryFilter();
categoryFilter.addCategory(new Category(YouTubeNamespace.DEVELOPER_TAG_SCHEME, "xyzzy"));
query.addCategoryFilter(categoryFilter);
VideoFeed videoFeed = service.query(query, VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
Для получения видео с тегом разработчика, необходимо использовать ключ разработчика, использованный для добавления видео с этим тегом. Запрос не нужно аутентифицировать, нужно только обеспечить ключ разработчика.
Загружать видео можно одним из двух способов: напрямую или отправляя только метаданные видео (пользователь при этом добавляет видео через HTML-форму).
Загруженное видео некоторое время обрабатывается и индексируется на YouTube. При большой нагрузке это может занять почти целый день. Но эти видео будут сразу же видны в канале загрузки аутентифицированного пользователя. Более подробные сведения можно найти в разделе Проверка состояния загрузки.
Для загрузки видео нужно собрать новый объект VideoEntry и указать некоторые обязательные элементы. Следующий пример иллюстрирует загрузку видео в формате Quickitime "file.mov" на YouTube со следующими свойствами:
| Свойство | Значение |
|---|---|
| Название | testing |
| Категория | Autos (автомобили) |
| Ключевые слова | foo |
| Описание | my description |
| Имя файла | file.mov |
| Тип MIME файла | video/quicktime |
| Видео только для избранных? | false |
| Где снято видео | 37,-122 (lat,long) (широта, долгота) |
| Тег разработчика | xyzzy |
При загрузке видео следующие поля обязательны: название, описание, категория и ключевые слова.
VideoEntry newEntry = new VideoEntry();
newEntry.setGeoCoordinates(new GeoRssWhere(37.0,-122.0));
//alternatively, one could specify just a descriptive string
newEntry.setLocation("Mountain View, CA");
YouTubeMediaGroup mg = newEntry.getOrCreateMediaGroup();
mg.addCategory(new MediaCategory(YouTubeNamespace.CATEGORY_SCHEME, "Autos"));
mg.addCategory(new MediaCategory(YouTubeNamespace.DEVELOPER_TAG_SCHEME, "xyzzy"));
mg.setPrivate(false);
mg.setTitle(new MediaTitle());
mg.getTitle().setPlainTextContent("testing");
mg.setKeywords(new MediaKeywords());
mg.getKeywords().addKeyword("foo");
mg.setDescription(new MediaDescription());
mg.getDescription().setPlainTextContent("my description");
MediaFileSource ms = new MediaFileSource(new File("file.mov"), "video/quicktime");
newEntry.setMediaSource(ms);
String uploadUrl = "http://uploads.gdata.youtube.com/feeds/api/users/default/uploads";
VideoEntry createdEntry = service.insert(new URL(uploadUrl), newEntry);
Загрузка через браузер позволяет сайту добавлять видео на YouTube прямо через браузер пользователя. Этот метод добавления использует специальный URL вместо URL загрузки аутентифицированного пользователя:
http://gdata.youtube.com/action/GetUploadToken
Хотя пользователь будет добавлять видеофайл напрямую, код должен сначала отправить метаданные видео на YouTube, практически так же, как и при прямом добавлении. Единственная разница, помимо специального URL, это то, что вы не присоединяете объект MediaFileSource к собираемому VideoEntry.
При загрузке видео следующие поля обязательны: название, описание, категория и ключевые слова.
VideoEntry newEntry = new VideoEntry();
newEntry.setGeoCoordinates(new GeoRssWhere(37.0,-122.0));
//alternatively, one could specify just a descriptive string
newEntry.setLocation("Mountain View, CA");
YouTubeMediaGroup mg = newEntry.getOrCreateMediaGroup();
mg.addCategory(new MediaCategory(YouTubeNamespace.CATEGORY_SCHEME, "Autos"));
mg.addCategory(new MediaCategory(YouTubeNamespace.DEVELOPER_TAG_SCHEME, "xyzzy"));
mg.setTitle(new MediaTitle());
mg.setPrivate(false);
mg.getTitle().setPlainTextContent("testing");
mg.setKeywords(new MediaKeywords());
mg.getKeywords().addKeyword("foo");
mg.setDescription(new MediaDescription());
mg.getDescription().setPlainTextContent("my description");
URL uploadUrl = new URL("http://gdata.youtube.com/action/GetUploadToken");
FormUploadToken token = service.getFormUploadToken(uploadUrl, newEntry);
System.out.println(token.getUrl());
System.out.println(token.getToken());
Код выше выводит ссылку и идентификатор, которые используются для создания HTML формы, отображаемой в браузере пользователя. Простой пример формы приведен ниже; post_url представляет значение token.getUrl(), а token_value – значение token.getToken().
<form action="post_url" method ="post" enctype="multipart/form-data"> <input type="file" name="file"/> <input type="hidden" name="token" value="token_value"/> <input type="submit" value="go" /> </form>
Для того, чтобы пользователь был перенаправлен на ваш веб-сайт после подачи формы, добавьте кpost_url (выше) параметр next, который работает так же, как параметр next ссылки AuthSub.
После загрузки видео сразу станет доступно в канале загрузки аутентифицированного пользователя:
http://gdata.youtube.com/feeds/api/users/default/uploads
Однако оно будет опубликовано на сайте только после обработки. Видео, которые были отклонены или не добавлены, тоже будут присутствовать только в канале загрузки аутнетифицированного пользователя. Следующий код проверяет состояние VideoEntry, контролируя, опубликовано ли оно или было отклонено.
if(entry.isDraft()) {
System.out.println("Video is not live");
YtPublicationState pubState = entry.getPublicationState();
if(pubState.getState() == YtPublicationState.State.PROCESSING) {
System.out.println("Video is still being processed.");
}
else if(pubState.getState() == YtPublicationState.State.REJECTED) {
System.out.print("Video has been rejected because: ");
System.out.println(pubState.getDescription());
System.out.print("For help visit: ");
System.out.println(pubState.getHelpUrl());
}
else if(pubState.getState() == YtPublicationState.State.FAILED) {
System.out.print("Video failed uploading because: ");
System.out.println(pubState.getDescription());
System.out.print("For help visit: ");
System.out.println(pubState.getHelpUrl());
}
}
Для обновления метаданных видео просто обновите объект VideoEntry и затем используйте метод update. Следующий пример обновляет описание видео:
entry.getMediaGroup().getDescription().setPlainTextContent("new description");
entry.update();
Для удаления видео надо просто получить канал загрузки для аутентифицированного пользователя, вызвать метод delete на объекте VideoEntry этого видео.
videoEntry.delete();
Для добавления оценки к видео, просто добавьте объект Rating к VideoEntry и отправьте его как POST на ссылку оценки этого VideoEntry.
String ratingUrl = entry.getRatingLink().getHref(); Rating myRating = new Rating(); myRating.setValue(5); myRating.setMax(5); myRating.setMin(1); entry.setRating(myRating); service.insert(new URL(ratingUrl), entry);
Имея объект VideoEntry, вы можете получать и выводить канал, содержащий комментарии к видео с помощью следующего кода:
String commentUrl = videoEntry.getComments().getFeedLink().getHref();
CommentFeed commentFeed = service.getFeed(new URL(commentUrl), CommentFeed.class);
for(CommentEntry comment : commentFeed.getEntries()) {
System.out.println(comment.getPlainTextContent());
}
Получив URL комментария (как описано в предыдущем разделе), можно разместить новый комментарий.
CommentEntry newComment = new CommentEntry();
newComment.setContent(new PlainTextConstruct("my pithy comment"));
service.insert(new URL(commentUrl), newComment);
Каждое видео в канале может иметь связанный канал видеоответов, который сам является каналом видео. Этот код показывает, как получить и вывести информацию о видеоответах на данное VideoEntry.
if (videoEntry.getVideoResponsesLink() != null) {
String feedUrl = videoEntry.getVideoResponsesLink().getHref();
VideoFeed videoFeed = service.getFeed(new URL(feedUrl), VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
}
Подробнее о получении каналов из различных объектов см. в разделе Переход между каналами справочного руководства.
После получения ссылки видеоответа (как описано в предыдущем разделе), можно отправить через POST VideoEntry, соответствующее видео, которое вы бы хотели отметить как видеоответ на исходное видео.
service.insert(new URL(responseVideosLink), videoResponseEntry);
Если вы получили видеоответы как канал, добавлять можно прямо в объект VideoFeed.
videoFeed.insert(videoResponseEntry);
Помните, что все видеоответы должны быть одобрены владельцем видео, на которое дан ответ, прежде чем они появятся в канале видеоответов.
Если одно из ваших видео в объекте VideoFeed получено с использованием ссылки видеоответов, удалить его из категории видеоответов можно вызовом на этой записи delete.
videoResponseEntry.delete();
Добавление жалобы на видео осуществляется через отправку с помощью POST записи Atom на ссылку жалоб объекта VideoEntry. Код ниже – пример отметки видео как неприемлемого.
String complaintUrl = badVideoEntry.getComplaintsLink().getHref();
ComplaintEntry complaintEntry = new ComplaintEntry();
complaintEntry.setComment("This video offends my sensibilities.");
service.insert(new URL(complaintUrl), complaintEntry);
Каждый пользователь YouTube может иметь избранное видео. Канал, соответствующий этому избранному видео, является, по сути, просто плейлистом без названия. Канал избранного пользователем можно получить со следующего URL:
http://gdata.youtube.com/feeds/api/users/userID/favorites
Код ниже выводит список избранного пользователем:
String feedUrl = "http://gdata.youtube.com/feeds/api/users/YTDebates/favorites";
VideoFeed videoFeed = service.getFeed(new URL(feedUrl), VideoFeed.class);
for(VideoEntry entry : videoFeed.getEntries() ) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println(entry.getMediaGroup().getDescription().getPlainTextContent());
}
Заметьте, что вместо имени пользователя можно использовать строку default, то есть "аутентифицированный сейчас пользователь".
Для добавления избранного, просто вставьте VideoEntry этого видео в канал избранного аутентифицированного пользователя.
String videoEntryUrl = "http://gdata.youtube.com/feeds/api/videos/ADos_xW4_J0"; VideoEntry videoEntry = service.getEntry(new URL(videoEntryUrl), VideoEntry.class); service.insert(new URL(feedUrl), videoEntry);
Для удаления избранного видео, просто используйте метол delete на VideoEntry в канале избранного аутентифицированного пользователя.
entry.delete();
Каждый пользователь YouTube имеет связанный с ним канал плейлистов, который является списком ссылок на канал, содержащий видео в каждом плейлисте.
Для получения канала плейлистов определенного пользователя, воспользуйтесь следующим URL:
http://gdata.youtube.com/feeds/api/users/userID/playlists
В следующем коде показано, как получить и вывести канал плейлистов, используя этот URL:
String feedUrl = "http://gdata.youtube.com/feeds/api/users/YTdebates/playlists";
PlaylistLinkFeed feed = service.getFeed(new URL(feedUrl), PlaylistLinkFeed.class);
for(PlaylistLinkEntry entry : feed.getEntries()) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println("Description: " + entry.getDescription());
}
Заметьте, что вместо имени пользователя можно использовать строку default, то есть "аутентифицированный сейчас пользователь".
Имея PlaylistLinkEntry, полученный из предыдущего примера, можно получить и вывести плейлист с помощью следующего кода:
String playlistUrl = entry.getFeedLink().getHref();
PlaylistFeed playlistFeed = service.getFeed(new URL(playlistUrl), PlaylistFeed.class);
for(PlaylistEntry playlistEntry : playlistFeed.getEntries()) {
System.out.println("Title: " + playlistEntry.getTitle().getPlainText());
System.out.println("Description: " + playlistEntry.getDescription());
System.out.println("Position: " + playlistEntry.getPosition());
System.out.println("Video URL: " + playlistEntry.getHtmlLink().getHref());
}
Помните, что PlaylistEntry наследует VideoEntry. Подробнее о том, что можно получить из объекта VideoEntry, см. в разделе Содержание видео.
Создать новый плейлист можно, вставив PlaylistLinkEntry в канал плейлистов аутентифицированного пользователя.
String feedUrl = "http://gdata.youtube.com/feeds/api/users/default/playlists";
PlaylistLinkEntry newEntry = new PlaylistLinkEntry();
newEntry.setTitle(new PlainTextConstruct("new playlist"));
newEntry.setDescription("this is my new playlist.");
PlaylistLinkEntry createdEntry = service.insert(new URL(feedUrl), newEntry);
Для обновления таких данных плейлиста, как название или описание, просто измените объект PlaylistLinkEntry и вызовите его метод update. Код ниже обновляет описание плейлиста.
entry.setDescription("updated description");
entry.update();
Добавить видео в плейлист можно, используя объект VideoEntry. Код ниже получает VideoEntry с известным идентификатором записи, а затем добавляет его в плейлист, соответствующий PlaylistLinkEntry. Так как положение не указано, новое видео добавляется в конец плейлиста.
String playlistUrl = playlistLinkEntry.getFeedLink().getHref();
String videoEntryUrl = "http://gdata.youtube.com/feeds/api/videos/ADos_xW4_J0";
VideoEntry videoEntry = service.getEntry(new URL(videoEntryUrl), VideoEntry.class);
PlaylistEntry playlistEntry = new PlaylistEntry(videoEntry);
playlistEntry.setTitle(new PlainTextConstruct("Custom title"));
playlistEntry.setDescription("Custom description");
service.insert(new URL(playlistUrl), playlistEntry);
Заметьте, что код выше указывает пользовательское название и описание видео. Это не обязательно, и если они не указаны, то будут использоваться фактические название и описание видео.
Изменить пользовательские название и описания для каждого видео в плейлисте можно, обновив объект PlaylistEntry и вызвав его метод update.
playlistEntry.setDescription("updated description");
//move this entry to the top of the playlist
playlistEntry.setPosition(0);
playlistEntry.update();
Если вы хотите изменить описание и название видео в плейлисте обратно на оригинальные, это можно сделать с помощью следующего кода:
playlistEntry.setDescription(null); playlistEntry.setTitle(null); playlistEntry.update();
Для удаления видео из плейлиста, используйте метод delete PlaylistEntry:
playlistEntry.delete();
Для удаления плейлиста, просто вызовите метод delete соответствующего объекта PlaylistLinkEntry.
entry.delete();
Для получения списка каналов, результатов поиска и избранных видео, на которые подписался определенный пользователь, используйте этот URL:
http://gdata.youtube.com/feeds/api/users/userID/subscriptions
Следующий код показывает, как получить и вывести список подписок данного пользователя, используя такой URL:
String feedUrl = "http://gdata.youtube.com/feeds/api/users/GoogleDevelopers/subscriptions";
SubscriptionFeed feed = service.getFeed(new URL(feedUrl), SubscriptionFeed.class);
for(SubscriptionEntry entry : feed.getEntries()) {
System.out.println("Title: " + entry.getTitle().getPlainText());
System.out.println("Feed Link: " + entry.getFeedLink().getHref());
}
Заметьте, что вместо имени пользователя можно использовать строку default, то есть "аутентифицированный сейчас пользователь".
Создать новую подписку можно, вставив новый SubscriptionEntry в канал подписок аутентифицированного пользователя. Следующий код подписывает аутентифицированного пользователя на канал "GoogleDevelopers".
SubscriptionEntry newSubscription = new SubscriptionEntry();
newSubscription.addSubscriptionType(SubscriptionEntry.Type.CHANNEL);
newSubscription.setUsername("GoogleDevelopers");
service.insert(new URL(feedUrl), newSubscription);
Можно также подписаться на избранное пользователя "GoogleDevelopers":
SubscriptionEntry newSubscription = new SubscriptionEntry();
newSubscription.addSubscriptionType(SubscriptionEntry.Type.FAVORITES);
newSubscription.setUsername("GoogleDevelopers");
service.insert(new URL(feedUrl), newSubscription);
Наконец, можно подписаться на результаты поиска по определенным критериям:
SubscriptionEntry newSubscription = new SubscriptionEntry();
newSubscription.addSubscriptionType(SubscriptionEntry.Type.QUERY);
newSubscription.setQueryString("puppy");
service.insert(new URL(feedUrl), newSubscription);
Для удаления подписки, вызовите метод delete на соответствующем объекте SubscriptionEntry.
entry.delete();
Профиль пользователя YouTube можно получить как запись Atom, со следующего URL:
http://gdata.youtube.com/feeds/api/users/userID
Следующий код выводит на печать различные атрибуты из профиля пользователя:
String profileUrl = "http://gdata.youtube.com/feeds/api/users/YTdebates";
UserProfileEntry profileEntry = service.getEntry(new URL(
profileUrl), UserProfileEntry.class);
System.out.println("Username: " + profileEntry.getUsername());
System.out.println("Age : " + profileEntry.getAge());
System.out.println("Gender : " + profileEntry.getGender());
System.out.println("Single? : " + profileEntry.getRelationship());
System.out.println("Books : " + profileEntry.getBooks());
System.out.println("Company : " + profileEntry.getCompany());
System.out.println("Describe: " + profileEntry.getDescription());
System.out.println("Hobbies : " + profileEntry.getHobbies());
System.out.println("Hometown: " + profileEntry.getHometown());
System.out.println("Location: " + profileEntry.getLocation());
System.out.println("Movies : " + profileEntry.getMovies());
System.out.println("Music : " + profileEntry.getMusic());
System.out.println("Job : " + profileEntry.getOccupation());
System.out.println("School : " + profileEntry.getSchool());
YtUserProfileStatistics stats = profileEntry.getStatistics();
if(stats != null) {
System.out.println("Subscriber count: " + stats.getSubscriberCount());
System.out.println("Last web access: " + stats.getLastWebAccess().toUiString());
}
Заметьте, что вместо имени пользователя можно использовать строку default, то есть "аутентифицированный сейчас пользователь".
Для получения канала контактов пользователя, воспользуйтесь следующим URL:
http://gdata.youtube.com/feeds/api/users/userID/contacts
Следующий код выводит список всех друзей определенного пользователя:
String feedUrl = "http://gdata.youtube.com/feeds/api/users/GoogleDevelopers/contacts";
FriendFeed friendFeed = service.getFeed(new URL(feedUrl), FriendFeed.class);
for(FriendEntry friendEntry : friendFeed.getEntries()) {
System.out.print("Friend: " + friendEntry.getUsername());
System.out.println("Status:" + friendEntry.getStatus().toString());
}
Создать новый контакт можно, вставив FriendEntry в канал контактов аутентифицированного пользователя. При необходимости категория используется для контроля того, в какую группу попадает контакт. Код ниже добавляет пользователя "GoogleDevelopers" в контакты.
FriendEntry newFriend = new FriendEntry();
newFriend.getCategories().add(new Category(YouTubeNamespace.CONTACT_LIST_SCHEME, "Friends"));
newFriend.setUsername("GoogleDevelopers");
service.insert(new URL(feedUrl), newFriend);
Можно принять или отклонить контакт, обновив состояние соответствующего FriendEntry.
Для принятия запроса:
friendEntry.setStatus(YtStatus.Value.ACCEPTED); friendEntry.update();
Для отклонения запроса:
friendEntry.setStatus(YtStatus.Value.REJECTED); friendEntry.update();
Для удаления контакта вызовите метод delete на FriendEntry.
friendEntry.delete();
Пользователи YouTube могут обмениваться сообщениями, которые могут также включать видео.
Для получения содержимого раздела Входящие пользователя, создайте аутентифицированный запрос на следующий URL:
http://gdata.youtube.com/feeds/api/users/userID/inbox
Пример ниже выводит на печать содержание раздела Входящие аутентифицированного пользователя:
String feedUrl = "http://gdata.youtube.com/feeds/api/users/default/inbox";
VideoMessageFeed feed = service.getFeed(new URL(feedUrl), VideoMessageFeed.class);
for(VideoMessageEntry entry : feed.getEntries()) {
System.out.println("Message from: " + entry.getAuthors().get(0).getName());
System.out.println("Subject: " + entry.getTitle().getPlainText());
System.out.println(entry.getDescription());
}
Для отправки сообщения пользователю, соберите объект VideoMessageEntry и вставьте его в канал Входящие пользователя. Все сообщения, отправляемые через API, должны включать объект VideoEntry.
Следующий код отправляет сообщение, содержащее видео, пользователю, определенному переменной receivingUser:
String msgUrl = "http://gdata.youtube.com/feeds/api/users/"+receivingUser+"/inbox";
String videoEntryUrl = "http://gdata.youtube.com/feeds/api/videos/Wegp-JOae0g";
VideoEntry videoEntry = service.getEntry(new URL(videoEntryUrl), VideoEntry.class);
VideoMessageEntry newMessage = new VideoMessageEntry(videoEntry);
newMessage.setTitle(new PlainTextConstruct("my subject"));
newMessage.setDescription("This is the message body.");
service.insert(new URL(msgUrl), newMessage);
Получатель сообщения должен входить в список контактов отправителя сообщения.
Для удаления знакомого, вызовите метод delete объекта VideoMessageEntry:
entry.delete();