Определите скорость загрузки канала YouTube с помощью YouTube Data API v3

Я пишу приложение Java, которое использует API данных YouTube v3. Я хочу иметь возможность определять скорость загрузки канала. Например, если каналу одна неделя, и он опубликовал 2 видео, я хочу каким-то образом определить, что скорость загрузки канала составляет 2 видео в неделю. Как мне это сделать с помощью API YouTube?

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, но я хочу иметь возможность делать это с любым каналом.


person QWERTY    schedule 29.09.2020    source источник


Ответы (1)


Согласно официальным документам, после вызова конечной точки API Channels.list - - который возвращает метаданные указанного канала, Channels resource - , в вашем распоряжении следующее имущество:

statistics.videoCount (без подписи long)
Количество общедоступных видео, загруженных на канал.

Следовательно, все почти очевидно: сделайте значение, возвращаемое этим свойством, постоянным (например, сохраните его в файл) и организуйте свою программу так, чтобы она запускалась еженедельно, чтобы вычислить желаемую скорость загрузки.


Теперь, что касается приведенного выше кода, вы должны сначала избавиться от:

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 будет доступно в методе _ 7_ из _ 8_ класс:

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

Конечно, поскольку всегда полезно запрашивать у API только ту информацию, которая действительно полезна, я бы также рекомендовал вам использовать параметр _ 10_ (метод _ 11_) в виде:

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

вставляется, например, после request.setKey(apiKey).

Таким образом, API вернет вам только то свойство, которое вам нужно.


Дополнение

Я также должен упомянуть, что приведенное выше утверждение верно только тогда, когда вы переходите к конечной точке API (как вы это делаете сейчас в коде выше) только один идентификатор канала. Если в будущем вы захотите вычислить за один раз скорость загрузки N каналов (с N <= 50), то приведенное выше условие будет выглядеть как size() <= N.

Вызов Channels.list за один раз по нескольким каналам возможен, поскольку id свойство можно указывать в виде списка идентификаторов каналов, разделенных запятыми.

person stvar    schedule 29.09.2020
comment
Как мне узнать, сколько лет каналу, чтобы я мог рассчитать ставку? Я заранее не знаю, какой канал буду проверять. Мне нужно рассчитывать это на лету. - person QWERTY; 29.09.2020
comment
@ap проверьте ответ Channels.list - я не могу проверить прямо сейчас, но я помню, что есть значение даты создания канала, например createdAt - проверьте документацию, указанную в этом ответе. Вы также можете попробовать получить дату публикации загруженных видео и выяснить, сколько видео пользователь YT загружает каждую неделю, а затем сделать в среднем ... - person Marco Aurelio Fernandez Reyes; 29.09.2020
comment
@MarcoAurelioFernandezReyes Я думаю, snippet.publishedAt может быть тем, что я ищу. Спасибо. - person QWERTY; 29.09.2020
comment
Действительно, свойство snippet.publishedAt предоставляет дату и время, когда канал был созданный. - person stvar; 29.09.2020