Azure AI Video Indexer の Search Video API 

Azure AI Video Indexerの Web API をC#からたたくというお話です。
モチベーションは2024/12/1１のMicrosoft Azure AI Innovation Weekで高添 修さんがポロッとお勧めされていたので

# Azure AI Video Indexer

詳しくは
公式
https://learn.microsoft.com/ja-jp/azure/azure-video-indexer/video-indexer-overview




# Video Indexer API: 動画検索リクエスト仕様

## リクエスト URL
以下の形式でリクエストを送信します：
```
https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/Search
```

### パラメータ
| **パラメータ名**         | **場所** | **必須** | **型**      | **説明** |
|---------------------------------|---------------|----------|-------------|----------|
| **location**            | パス       | 必須     | string      | Azure リージョンを指定します。詳細は[こちら](https://aka.ms/vi-apiportal-location)。 |
| **accountId**           | パス       | 必須     | string      | アカウントのグローバル一意識別子 (GUID)。詳細は[こちら](https://aka.ms/vi-apiportal-useapi-accountId)。 |
| **sourceLanguage**      | クエリ | 任意     | string      | 動画/プロジェクトのソース言語を指定します。サポート言語一覧は後述。 |
| **hasSourceVideoFile**  | クエリ     | 任意     | boolean     | `true`: ソースファイルがある動画のみ含む。`false`: ソースファイルなしの動画やプロジェクトも含む。 |
| **sourceVideoId**       | クエリ     | 任意     | string      | 指定した ID の動画やプロジェクトを含めます。 |
| **state**               | クエリ     | 任意     | array       | 動画の処理状態。`Uploaded` / `Processing` / `Processed` / `Failed` を指定可能。 |
| **privacy**             | クエリ     | 任意     | array       | プライバシー設定。`Private` / `Public` を指定可能。 |
| **id**                  | クエリ     | 任意     | array       | 検索対象の動画 ID を指定。 |
| **partition**           | クエリ     | 任意     | array       | 検索対象のパーティションを指定。 |
| **externalId**          | クエリ     | 任意     | array       | アップロード時に関連付けた外部 ID を指定。 |
| **owner**               | クエリ     | 任意     | array       | 動画の所有者を指定。 |
| **face**                | クエリ     | 任意     | array       | 検索対象の顔情報を指定。 |
| **animatedcharacter**   | クエリ     | 任意     | array       | 検索対象のアニメキャラクターを指定。 |
| **query**               | クエリ     | 任意     | array       | フリーテキストで検索可能。例は後述。 |
| **textScope**           | クエリ     | 任意     | array       | 検索対象のテキスト範囲を指定。例: `Transcript` / `Topics` / `Metadata` など。 |
| **language**            | クエリ     | 任意     | array       | 検索対象言語を指定。複数言語指定可能。指定しない場合は全言語対象。 |
| **createdAfter**        | クエリ     | 任意     | string      | 指定日時以降に作成されたアイテムをフィルタリング (RFC 3339形式)。 |
| **createdBefore**       | クエリ     | 任意     | string      | 指定日時以前に作成されたアイテムをフィルタリング (RFC 3339形式)。 |
| **pageSize**            | クエリ     | 任意     | integer     | 返される結果の件数。 |
| **skip**                | クエリ     | 任意     | integer     | ページング用にスキップする結果の件数。 |
| **accessToken**         | クエリ     | 任意     | string      | プライベート動画やアカウント範囲の検索には必須。Bearer トークン形式で指定。詳細は[こちら](https://aka.ms/DocsObtainAccessToken)。 |

---

### サポートされる言語一覧
以下は、`sourceLanguage` および `language` パラメータで指定可能な言語の例です：
- 日本語: `ja-JP`
- 英語 (アメリカ): `en-US`
- フランス語: `fr-FR`
- その他、公式ドキュメントを参照してください。

---

### フリーテキスト検索の例 (`query`)
| **例**                                  | **説明**                                  |
|----------------------------------------|------------------------------------------|
| `&query=north america`                 | "north" または "america" を含む動画を検索。 |
| `&query=north+america`                 | "north" と "america" の両方を含む動画を検索。 |
| `&query=north|america`                 | "north" または "america" のいずれかを含む動画を検索。 |
| `&query=-north`                        | "north" を含まない動画を検索。              |
| `&query="north america"`               | "north america" のフレーズを含む動画を検索。 |

---

## ヘッダー
| **ヘッダー名**          | **必須** | **型**      | **説明** |
|------------------------|----------|-------------|----------|
| **x-ms-client-request-id** | 任意   | string      | UUID 形式で指定。リクエストの追跡用に利用可能。 |

**Azure AI Video Indexer の Search Video API** 
公式はこちら
https://api-portal.videoindexer.ai/api-details#api=Operations&operation=Search-Videos

Request

GET
```
https://api.videoindexer.ai/{location}/Accounts/{accountId}/Videos/Search[?sourceLanguage][&hasSourceVideoFile][&sourceVideoId][&state][&privacy][&id][&partition][&externalId][&owner][&face][&animatedcharacter][&query][&textScope][&language][&createdAfter][&createdBefore][&pageSize][&skip][&accessToken]
```