【问题标题】:YouTube API: How to obtain text of Related videos, given a video's URL?YouTube API:给定视频的 URL,如何获取相关视频的文本?
【发布时间】:2012-03-27 21:00:42
【问题描述】:

我有一个非常简单的任务 -

给定视频的 URL,我想提取其相关视频的信息(我所说的信息是指它们的标题、标签、描述)。 我使用 Java 版本的 YouTube API,但不知道如何快速做到这一点。此外,此站点:https://developers.google.com/youtube/2.0/developers_guide_java 提供了一些信息。他们提供的代码是:

if (videoEntry.getRelatedVideosLink() != null) {
  String feedUrl = videoEntry.getRelatedVideosLink().getHref();

  VideoFeed videoFeed = service.getFeed(new URL(feedUrl), VideoFeed.class);
  printVideoFeed(videoFeed, true);
}

我不知道如何创建一个仅给出 URL 的 videoEntry..

【问题讨论】:

    标签: java youtube


    【解决方案1】:

    你可以用这个:

            class YouTubeVideoInfo {
                    private String channel;
                    private String url;
                    private long views;
                    private int comments;
                    private int ratings;
                    private int likes;
                    private int dislikes;
                    private String thumbnail;
                    private String title;
                    .....
            }
    
            public static final String YOUTUBE_GDATA_SERVER = "http://gdata.youtube.com";
            public static final String USER_FEED_PREFIX = YOUTUBE_GDATA_SERVER + "/feeds/api/users/";
            public static final String UPLOADS_FEED_SUFFIX = "/uploads";
        ...............
            public YouTubeVideoInfo getVideoInfo(YouTubeService service, String channel, String url) {
    VideoFeed videoFeed = service.getFeed(
            new URL(USER_FEED_PREFIX + channel + UPLOADS_FEED_SUFFIX), VideoFeed.class);
    List<VideoEntry> videoEntries = videoFeed.getEntries();
    for (VideoEntry videoEntry : videoEntries) {
    
        YouTubeMediaGroup mediaGroup = videoEntry.getMediaGroup();
        if (mediaGroup != null && mediaGroup.getPlayer() != null && videoEntry.getTitle() != null) {
    
            if (url.equals(mediaGroup.getPlayer().getUrl())) {
                String title = videoEntry.getTitle().getPlainText();
    
                MediaKeywords keywords = mediaGroup.getKeywords();
    
                MediaPlayer mediaPlayer = mediaGroup.getPlayer();
    
    
                final YtStatistics statistics = videoEntry.getStatistics();
    
                final YouTubeVideoInfo videoInfo = new YouTubeVideoInfo(channel,
                        mediaPlayer.getUrl(), statistics != null
                        ? statistics.getViewCount() : 0);
    
                if (videoEntry.getComments() != null
                        && videoEntry.getComments().getFeedLink() != null)
                    videoInfo.comments =
                            videoEntry.getComments().getFeedLink().getCountHint();
    
                final Rating rating = videoEntry.getRating();
                if (rating != null)
                    videoInfo.ratings = rating.getNumRaters();
    
                final YtRating ytRating = videoEntry.getYtRating();
    
                if (ytRating != null) {
                    videoInfo.likes = ytRating.getNumLikes();
                    videoInfo.dislikes = ytRating.getNumDislikes();
                }
    
    
                final List<MediaThumbnail> thumbnails = mediaGroup.getThumbnails();
                if (!thumbnails.isEmpty())
                    videoInfo.thumbnail = thumbnails.get(thumbnails.size() / 2).getUrl();
    
                if (videoEntry.getTitle() != null)
                    videoInfo.title = videoEntry.getTitle().getPlainText();
    
                return videoInfo;
            }
        }
        .... // exception handling
    

    【讨论】:

    • 感谢您的回复!我对 Java 还很陌生,因此无法弄清楚要按原样使用代码的哪一部分,以及要编辑哪一部分。一些帮助将不胜感激..
    • 对于第一类添加setter/getter(通常是IDE生成它们)。将常量添加到方法所在的另一个类。只需添加异常处理或声明抛出它们的方法。这几乎是完整的代码,不需要大量工作即可使用。我相信您已经知道如何在 YouTube 中验证 YouTubeService 实例了,对吧?
    • 我认为我不需要身份验证,因为我没有执行任何写入、更新或删除操作。我对么?在另一个(Java)部分,让我尝试更多,如果我仍然无法弄清楚如何使其工作,我会回来。再次感谢! :)
    • 我不确定。你必须检查。当我实现上面的代码时,它是必需的。也许有些事情发生了变化。
    • 我不确定是否可以使用您为我的任务提供的代码。我认为我有一个关键问题仍未解决。我有一个 YouTube 视频的 URL,但我不知道如何创建相应的 VideoEntry。我相信一旦我能拿到对应的 VideoEntry(即 URL 对应的视频的 VideoEntry),我就能得到其相关视频的信息(我知道如何从 VideoEntry 获取 RV),但获取 VideoEntry 是我的所在卡住了。
    【解决方案2】:

    我有一种方法可以做我想做的事。我不需要频道的名称(上传视频的用户名)。我只需要一个 URL。 YouTube 有一个对应于每个视频的 ID。例如,对于视频:http://www.youtube.com/watch?v=f3q3JkNUPmI,ID 为“f3q3JkNUPmI”(不带引号)。因此,您需要做的就是创建一个包含您想要获取的提要链接的字符串。这可以创建为:

    String Video_Related_Feed="https://gdata.youtube.com/feeds/api/videos/f3q3JkNUPmI/related?v=2" (不要将 https 替换为 http - 它不起作用) 显然,可以自动执行此操作.. 我只是给出硬编码的示例。 现在根据这个地址获取实际的 Feed:

    VideoFeed videoFeed = service.getFeed(new URL(Video_Related_Feed), VideoFeed.class); 此提要包含相关视频的 VideoEntry(对应于我们的原始 URL),每个视频都可以通过 for 循环访问: for (VideoEntry ve : videoFeed.getEntries()) { 在此处插入您的代码 }

    参考:https://developers.google.com/youtube/2.0/reference 和 https://developers.google.com/youtube/2.0/developers_guide_java (对不起,我不得不这样写最后一个链接,因为我不能发布超过 2 个 URL)。

    我希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-10-09
      • 2014-06-05
      • 2016-03-19
      • 2018-03-30
      • 2020-11-17
      • 2013-02-06
      • 2018-10-19
      • 2011-08-04
      • 1970-01-01
      相关资源
      最近更新 更多