Search code examples
youtube-apiyoutube-data-api

Google.Apis.YouTube.v3 compiling channel statistics fail "The uri string is too long"


I'm trying to compile channel statistics for a list of channels and for the first page it works, but when I invoke the next page using the token it gives me an error that the URI string is too long.

I'm using .NET core 2.2 and Google.Apis.YouTube.v2 V1.39.0.1572. And the code I use is really simple:

var youtubeService = new YouTubeService(new BaseClientService.Initializer()
                {
                    ApiKey = Startup.Configuration["YTConfigurations:ApiKey"],
                    ApplicationName = this.GetType().ToString()
                });

                ChannelsResource.ListRequest channelsListRequest = youtubeService.Channels.List("snippet,statistics,brandingSettings,topicDetails");
                channelsListRequest.Id = string.Join(",", channelEntities.Select(v => v.YTChannelId));

                channelsListRequest.MaxResults = 50;

                do
                {
                    pageCounter++;
                    channelListResponse = channelsListRequest.Execute();//here is the error after page 1

                    foreach (var listResult in channelListResponse.Items)
                    {
                        channelEntity = channelEntities.FirstOrDefault(v => v.YTChannelId == listResult.Id);
                        channelEntity = Mapper.Map(listResult, channelEntity);   
                        _repository.UpdateChannel(channelEntity);
                    }

                    if (channelListResponse.NextPageToken != null)
                    {
                        channelsListRequest.PageToken = channelListResponse.NextPageToken;
                    }
                } while (channelListResponse.Items.Count == 50 && channelListResponse.NextPageToken != null);

When I execute this is what I get:

System.UriFormatException: Invalid URI: The Uri string is too long.
   at System.UriHelper.EscapeString(String input, Int32 start, Int32 end, Char[] dest, Int32& destPos, Boolean isUriString, Char force1, Char force2, Char rsvd)
   at System.Uri.EscapeDataString(String stringToEscape)
   at Google.Apis.Requests.RequestBuilder.<>c.<BuildUri>b__25_0(KeyValuePair`2 x) in C:\Apiary\2019-05-01.11-08-18\Src\Support\Google.Apis.Core\Requests\RequestBuilder.cs:line 108
   at System.Linq.Enumerable.SelectListIterator`2.ToArray()
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Google.Apis.Requests.RequestBuilder.BuildUri() in C:\Apiary\2019-05-01.11-08-18\Src\Support\Google.Apis.Core\Requests\RequestBuilder.cs:line 107
   at Google.Apis.Requests.RequestBuilder.CreateRequest() in C:\Apiary\2019-05-01.11-08-18\Src\Support\Google.Apis.Core\Requests\RequestBuilder.cs:line 332
   at Google.Apis.Requests.ClientServiceRequest`1.CreateRequest(Nullable`1 overrideGZipEnabled) in C:\Apiary\2019-05-01.11-08-18\Src\Support\Google.Apis\Requests\ClientServiceRequest.cs:line 257
   at Google.Apis.Requests.ClientServiceRequest`1.ExecuteUnparsedAsync(CancellationToken cancellationToken) in C:\Apiary\2019-05-01.11-08-18\Src\Support\Google.Apis\Requests\ClientServiceRequest.cs:line 229
   at Google.Apis.Requests.ClientServiceRequest`1.Execute() in C:\Apiary\2019-05-01.11-08-18\Src\Support\Google.Apis\Requests\ClientServiceRequest.cs:line 167
   at ChannelHarvester.Controllers.ChannelHarvester.extractStats(ICollection`1 channelEntities) in C:\Guayaba Projects\YT_ChannelHarvester\ChannelHarvester\Controllers\ChannelHarvester.cs:line 106

Am I doing something wrong? Please let me know if there is something I can fix on my end. Thanks!


Solution

  • Well, I'm really sorry to have bothered you guys. I found what it was, in the following code I thought I was joining only 50 IDs, but apparently in some occasions I was sending a LOT more.

    channelsListRequest.Id = string.Join(",", channelEntities.Select(v => v.YTChannelId));
    

    So I guess we can close this