YouTube Analytics APIでcom.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found

## YouTube Analytics API Java サンプルコードが動かない問題
YouTubeで使えるAPIには、以下の三種類がある。

- YouTube Data API
- YouTube Analytics API
- YouTube Reporting API

それぞれのAPIについての説明は省くが、[サンプルコード](https://github.com/youtube/api-samples)が公開されている。
その中にあるJavaのAnalytics APIのサンプルを動かそうとすると以下のエラーになったため、これの解決法をまとめておく。
[YouTubeAnalyticsReports.java](https://github.com/youtube/api-samples/blob/master/java/src/main/java/com/google/api/services/samples/youtube/cmdline/analytics/YouTubeAnalyticsReports.java)

```
Result
Default Channel: ( xxxxxxxxxxxxxxxxxxx )

IOException: 404 Not Found
Not Found
com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
Not Found
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1056)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.api.services.samples.youtube.cmdline.analytics.YouTubeAnalyticsReports.executeViewsOverTimeQuery(YouTubeAnalyticsReports.java:134)
at com.google.api.services.samples.youtube.cmdline.analytics.YouTubeAnalyticsReports.main(YouTubeAnalyticsReports.java:103)
```

## 解決法
APIのバージョンをV2にする。
Google ConsoleからAPIのスコープの設定やclient_secrets.jsonの設定などをしたにも関わらず上記のエラーが出るのは、APIのバージョンが古い。

サンプルコードでは、Analytics API V1が使われているが、なぜかV1が使えず、V2にしたら動いたので、V2を使う。
googleにプルリクを出してみた。
https://github.com/youtube/api-samples/pull/292
### pom.xml
pom.xmlを以下のように修正する。
Line:14

```
- <project.youtube.version>v3-rev182-1.22.0</project.youtube.version>
- <project.youtube.analytics.version>v1-rev63-1.22.0</project.youtube.analytics.version>
- <project.youtube.reporting.version>v1-rev10-1.22.0</project.youtube.reporting.version>
- <project.http.version>1.20.0</project.http.version>
- <project.oauth.version>1.20.0</project.oauth.version>
+ <project.youtube.version>v3-rev222-1.25.0</project.youtube.version>
+ <project.youtube.analytics.version>v2-rev272-1.25.0</project.youtube.analytics.version>
+ <project.youtube.reporting.version>v1-rev748-1.25.0</project.youtube.reporting.version>
+ <project.http.version>1.36.0</project.http.version>
+ <project.oauth.version>1.31.0</project.oauth.version>
```

### YouTubeAnalyticsReports.java
YouTubeAnalyticsReports.javaを以下のように修正する
Line:12

```
- import com.google.api.services.youtubeAnalytics.YouTubeAnalytics;
- import com.google.api.services.youtubeAnalytics.model.ResultTable;
- import com.google.api.services.youtubeAnalytics.model.ResultTable.ColumnHeaders;
+ import com.google.api.services.youtubeAnalytics.v2.YouTubeAnalytics;
+ import com.google.api.services.youtubeAnalytics.v2.model.QueryResponse;
+ import com.google.api.services.youtubeAnalytics.v2.model.ResultTableColumnHeader;
```
Line:124

```
- private static ResultTable executeViewsOverTimeQuery(YouTubeAnalytics analytics,
                                                         String id) throws IOException {
+ private static QueryResponse executeViewsOverTimeQuery(YouTubeAnalytics analytics,
                                                           String id) throws IOException {
```
Line:128

```
- .query("channel==" + id,     // channel id
-         "2012-01-01",         // Start date.
-         "2012-01-14",         // End date.
-         "views,uniques")      // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("views")
+ .setStartDate("2020-01-01")
+ .setEndDate("2020-12-31")
```
Line:145

```
- private static ResultTable executeTopVideosQuery(YouTubeAnalytics analytics,
+ private static QueryResponse executeTopVideosQuery(YouTubeAnalytics analytics,
```
Line:149

```
- .query("channel==" + id,                          // channel id
-         "2012-01-01",                              // Start date.
-         "2012-08-14",                              // End date.
-         "views,subscribersGained,subscribersLost") // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("views,subscribersGained,subscribersLost")
+ .setStartDate("2019-01-01")
+ .setEndDate("2020-12-31")
```
Line:167

```
- private static ResultTable executeDemographicsQuery(YouTubeAnalytics analytics,
+ private static QueryResponse executeDemographicsQuery(YouTubeAnalytics analytics,
```
Line:170

```
- .query("channel==" + id,     // channel id
-         "2007-01-01",         // Start date.
-         "2012-08-14",         // End date.
-         "viewerPercentage")   // Metrics.
+ .query()
+ .setIds("channel==" + id)
+ .setMetrics("viewerPercentage")
+ .setStartDate("2020-01-01")
+ .setEndDate("2020-12-31")
```
Line:187

```
- private static void printData(PrintStream writer, String title, ResultTable results) {
+ private static void printData(PrintStream writer, String title, QueryResponse results) {
```
Line:194

```
- for (ColumnHeaders header : results.getColumnHeaders()) {
+ for (ResultTableColumnHeader header : results.getColumnHeaders()) {
```
Line:202

```
- ColumnHeaders header = results.getColumnHeaders().get(colNum);
+ ResultTableColumnHeader header = results.getColumnHeaders().get(colNum);
```

これで実行すると取得できるようになった。