Эффективно получайте каждое видео из каждого списка воспроизведения канала

#youtube-api #youtube-data-api

Вопрос:

Я использую C# .NET с пакетом YouTubeAPI-Nuget, но это не должно быть так важно, потому что я могу применять концепции из любого языка.

Мне нужно довольно часто получать все плейлисты канала (в частности, зарегистрированный канал, используя параметр «мой») и каждое видео каждого плейлиста, я уже пытался делать это как можно реже, но это все равно должно происходить довольно часто.

Проблема в том, что это занимает много времени, потому что сначала мне нужно получить все плейлисты (1 вызов API для каждых 50 плейлистов), а затем для каждого плейлиста получить каждое видео (1 вызов API на 50 видео в плейлисте).

Так что это может размножаться довольно быстро. Для 39 плейлистов все с

Итак, мой вопрос: есть ли какой-либо лучший/более эффективный способ?

Мои Оптимизации:

  • просто старайтесь делать это как можно реже
  • Не включайте «Понравившиеся видео», «Загрузки» и подобные ненужные плейлисты на втором этапе (я бы исключил их, но по какой-то причине они не включены в первую очередь)

Пример кода того, как я это делаю в настоящее время:

 private async Task InitPlaylists()
{
    var playlists = new Dictionary<string, string>();
    var page = "";
    while (true)
    {
        var request = _youTubeService.Playlists.List("snippet");
        request.Mine = true;
        request.PageToken = page;
        request.MaxResults = 50;
        var result = await request.ExecuteAsync();
        foreach (var playlist in result.Items) playlists.Add(playlist.Id, playlist.Snippet.Title);
        if (result.NextPageToken == null) break;
        page = result.NextPageToken;
    }
    foreach (var (id, title) in playlists)
    {
        var videos = new List<PlaylistItem>();
        page = "";
        while (true)
        {
            var listRequest = _youTubeService.PlaylistItems.List("id,snippet");
            listRequest.PageToken = page;
            listRequest.MaxResults = 50;
            listRequest.PlaylistId = id;
            var listResult = await listRequest.ExecuteAsync();
            videos.AddRange(listResult.Items);
            if (listResult.NextPageToken == null) break;
            page = listResult.NextPageToken;
        }

        Playlists.Add(new Playlist(id, title, videos.ToDistinctDictionary()));
    }
}
 

ПРАВКА: Может быть, это поможет, если я скажу, зачем мне это нужно, может быть, у кого-то есть идея, как сократить некоторые звонки таким образом:

Я хочу иметь возможность добавлять и удалять видео из списков воспроизведения, как на странице редактирования студии YouTube.

Поэтому мне нужны A. каждый плейлист канала и B. каждое видео каждого плейлиста, потому что мне нужно знать, есть ли видео уже в плейлисте

Комментарии:

1. Подумайте о том, чтобы сохранять ответы playlists_ids и videos_ids избегать их вызова каждый раз, когда вы запрашиваете этого конкретного пользователя. Проверьте также, как вы можете связаться с YouTube для увеличения своей квоты — насколько я знаю — несмотря на все улучшения в коде, квота является головной болью для пользовательских запросов/функций. Проверьте, можете ли вы использовать другой инструмент(ы) для получения этих результатов.

Ответ №1:

Если вы управляете своим каналом YouTube только с помощью своего сценария, вы можете отслеживать состояние видео в текущих плейлистах. Если это не так, только многопоточность может ускорить проверку, используя поток для каждого списка воспроизведения. Вот бесплатный и, возможно, более быстрый способ получения каждого идентификатора видео из списка воспроизведения с помощью youtube-dl -j --flat-playlist .