使用 YouTube 数据 API v3 确定 YouTube 频道的上传速率

Determine a YouTube channel's upload rate using YouTube Data API v3

我正在编写一个使用 YouTube 数据 API v3 的 Java 应用程序。我希望能够确定频道的上传速率。例如,如果一个频道成立一周,并且发布了 2 个视频,我想要一些方法来确定该频道的上传速率是 2 videos/week。我如何使用 YouTube API 执行此操作?

import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.model.Channel;
import com.google.api.services.youtube.model.ChannelListResponse;

import java.io.IOException;
import java.io.InputStream;
import java.security.GeneralSecurityException;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;

public class ApiExample {
    public static void main(String[] args)
            throws GeneralSecurityException, IOException, GoogleJsonResponseException {
        Properties properties = new Properties();
        try {
            InputStream in = ApiExample.class.getResourceAsStream("/" + "youtube.properties");
            properties.load(in);

        } catch (IOException e) {
            System.err.println("There was an error reading " + "youtube.properties" + ": " + e.getCause()
                    + " : " + e.getMessage());
            System.exit(1);
        }
        YouTube youtubeService = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer() {
            public void initialize(HttpRequest request) throws IOException {
            }
        }).setApplicationName("API Demo").build();
        // Define and execute the API request
        YouTube.Channels.List request = youtubeService.channels()
                .list("snippet,contentDetails,statistics");
        String apiKey = properties.getProperty("youtube.apikey");
        request.setKey(apiKey);
        ChannelListResponse response = request.setId("UC_x5XG1OV2P6uZZ5FSM9Ttw").execute();
        for (Channel channel : response.getItems()) {
            /* What do I do here to get the individual channel's upload rate? /
        }
    }
}

以上示例使用 YouTube 开发者频道,但我希望能够对任何频道执行此操作。

根据官方文档,一旦您调用 Channels.list API endpoint -- that returns the specified channel's meta-data, a Channels resource --,您就可以使用以下 属性:

statistics.videoCount (unsigned long)
The number of public videos uploaded to the channel.

因此,事情几乎是显而易见的:使此 属性 返回的值持久化(例如,将其保存到文件中)并安排您的程序,以便每周发布一次以计算您想要的 上传率.


现在,对于您上面的代码,您应该首先摆脱:

for (Channel channel : response.getItems()) {
    /* What do I do here to get the individual channel's upload rate? /
}

因为 items 属性 最多包含 一个 项目。一个好的做法是断言此条件:

assert response.getItems().size() <= 1;

所需videoCount 属性 的值将在方法 getVideoCount of ChannelStatistics class:

下访问

response.getItems().get(0).getStatistics().getVideoCount().

当然,因为从 API 中只询问真正有用的信息总是好的,我也建议您使用参数 fields (the method setFields) 的形式:

request.setFields("items(statistics(videoCount))"),

插入,例如,在 request.setKey(apiKey) 之后。

这样 API 将只向您发送您需要的 属性。


附录

我还必须提到,只有当您传递到 API 端点(正如您目前在上面的代码中所做的那样)时,上面的断言才是正确的只有一个频道 ID.如果将来您想要 一次性 计算 N 个频道(使用 N <= 50)的上传速率,那么上面的条件将类似于 size() <= N.

Channels.list可以一次调用多个通道,因为这个端点的id属性允许指定为comma-separated通道列表ID。